Wikilivres frwikibooks https://fr.wikibooks.org/wiki/Accueil MediaWiki 1.46.0-wmf.24 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 Event Event talk Manuel de terminale de philosophie 0 199 765013 758722 2026-04-25T09:55:07Z PandaMystique 119061 765013 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ EN-TÊTE PRINCIPAL ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #2c3e50, #1a252f); border-radius: 8px; padding: 28px 30px; margin-bottom: 20px; text-align: center;"> <div style="font-size: 1.6em; font-weight: 600; color: #ffffff; letter-spacing: 0.02em; margin-bottom: 8px;">Manuel de Philosophie</div> <div style="font-size: 1.05em; color: #a8b8c8; letter-spacing: 0.03em;">Terminale — Programme officiel</div> </div> <!-- ═══════════════════════════════════════════════════════════════════ NAVIGATION RAPIDE ═══════════════════════════════════════════════════════════════════ --> <div style="background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 6px; padding: 14px 20px; margin-bottom: 25px; text-align: center; font-size: 0.9em;"> <span style="color: #666; margin-right: 8px;">Accès rapide :</span> [[#Éthique|<span style="color: #8a6d00;">● Éthique</span>]] &nbsp;•&nbsp; [[#Esprit|<span style="color: #5a3d7a;">● Esprit</span>]] &nbsp;•&nbsp; [[#Connaissance|<span style="color: #2a5a7a;">● Connaissance</span>]] &nbsp;•&nbsp; [[#Monde|<span style="color: #2a6a40;">● Monde</span>]] &nbsp;•&nbsp; [[#Culture|<span style="color: #7a4a2a;">● Culture</span>]] &nbsp;•&nbsp; [[#Méthode|<span style="color: #6a4800;">● Méthode</span>]] </div> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 1 : ÉTHIQUE & ACTION ═══════════════════════════════════════════════════════════════════ --> <div id="Éthique" style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #d4b44a;"> <span style="font-size: 1.15em; font-weight: 700; color: #6a5000; letter-spacing: 0.02em;">ÉTHIQUE & ACTION</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Comment bien agir ?</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- BONHEUR --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #fdf8ed, #f8eedc); border:1px solid #d4b44a; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#5c4800; margin-bottom:8px;">🙂 Bonheur</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">D'Aristote à Kant, le bonheur se cherche entre plaisir, sagesse et devoir.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Bonheur|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- DEVOIR --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #fcf6e8, #f6ebda); border:1px solid #c9a83a; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#5a4500; margin-bottom:8px;">📜 Devoir</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Kant : agir non par intérêt mais par respect pour la loi morale.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Devoir|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- LIBERTÉ --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #fefaef, #f9f0e0); border:1px solid #d9bc50; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#5e4a00; margin-bottom:8px;">🕊️ Liberté</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Spinoza, Rousseau, Sartre : comprendre la nécessité ou se créer soi-même.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Liberté|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- JUSTICE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #fdf7ea, #f7eddb); border:1px solid #cfad42; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#5b4600; margin-bottom:8px;">⚖️ Justice</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Aristote, Rawls : équilibre entre égalité, mérite et équité.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Justice|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 2 : ESPRIT & CONSCIENCE ═══════════════════════════════════════════════════════════════════ --> <div id="Esprit" style="margin: 35px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #9070b0;"> <span style="font-size: 1.15em; font-weight: 700; color: #5a3d7a; letter-spacing: 0.02em;">ESPRIT & CONSCIENCE</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Qui suis-je ?</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- CONSCIENCE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f8f4fc, #f0e8f6); border:1px solid #9070b0; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#4a2d6e; margin-bottom:8px;">🧠 Conscience</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Descartes à Sartre, la conscience se découvre dans le regard sur soi.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Conscience|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- INCONSCIENT --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f5f0f9, #ebe2f2); border:1px solid #8060a5; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#3d2360; margin-bottom:8px;">🌒 Inconscient</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Freud : la vie intérieure est traversée par ce que l'on ne sait pas de soi.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Inconscient|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- RAISON --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f2eef8, #e6def0); border:1px solid #7a60a0; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#352858; margin-bottom:8px;">🧭 Raison</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Descartes, Kant : la raison comme mesure du vrai et exigence d'universalité.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Raison|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- TEMPS --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f6f2fa, #ece4f4); border:1px solid #8568a8; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#402a65; margin-bottom:8px;">⏳ Temps</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Aristote, Augustin, Bergson : du mouvement du monde à la durée vécue.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Temps|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 3 : CONNAISSANCE & VÉRITÉ ═══════════════════════════════════════════════════════════════════ --> <div id="Connaissance" style="margin: 35px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #4a90b8;"> <span style="font-size: 1.15em; font-weight: 700; color: #2a5a7a; letter-spacing: 0.02em;">CONNAISSANCE & VÉRITÉ</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Que puis-je savoir ?</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- VÉRITÉ --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f0f6fa, #e2eef5); border:1px solid #4a90b8; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#1a4a6a; margin-bottom:8px;">🔎 Vérité</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Platon à Nietzsche : dévoiler, questionner, interpréter.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Vérité|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- SCIENCE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #edf4f8, #ddeaf2); border:1px solid #4085b0; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#154560; margin-bottom:8px;">🔬 Science</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Galilée à Popper : observer, expérimenter, comprendre.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Science|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- LANGAGE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eff5f9, #e0ecf4); border:1px solid #4588b2; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#1a4d68; margin-bottom:8px;">🗣️ Langage</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Saussure à Wittgenstein : la parole fonde le lien et l'intelligence du monde.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Langage|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <td style="width:50%;"></td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 4 : MONDE & SOCIÉTÉ ═══════════════════════════════════════════════════════════════════ --> <div id="Monde" style="margin: 35px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #4a9868;"> <span style="font-size: 1.15em; font-weight: 700; color: #2a6a40; letter-spacing: 0.02em;">MONDE & SOCIÉTÉ</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Comment vivre ensemble ?</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- NATURE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f0f7f2, #e2efe6); border:1px solid #4a9868; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#1a5030; margin-bottom:8px;">🌿 Nature</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Des stoïciens à Heidegger : vivre selon la nature, ou s'en émanciper.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Nature|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- ÉTAT --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #edf5f0, #ddeee4); border:1px solid #3d8a58; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#154528; margin-bottom:8px;">🏛️ État</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Hobbes, Rousseau, Hegel : l'État transforme la force en droit.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/État|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- TRAVAIL --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eff6f2, #e0f0e8); border:1px solid #459060; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#1a5232; margin-bottom:8px;">🛠️ Travail</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Hegel, Marx, Arendt : effort, aliénation et dignité du monde fabriqué.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Travail|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <td style="width:50%;"></td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 5 : CULTURE & SENS ═══════════════════════════════════════════════════════════════════ --> <div id="Culture" style="margin: 35px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #b07848;"> <span style="font-size: 1.15em; font-weight: 700; color: #7a4a2a; letter-spacing: 0.02em;">CULTURE & SENS</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Qu'est-ce qui donne sens à l'existence ?</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- ART --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #faf4ed, #f2e8dc); border:1px solid #b07848; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#5a3820; margin-bottom:8px;">🎨 Art</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">L'art donne forme au sensible et traduit l'esprit à travers la matière.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Art|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- TECHNIQUE --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f8f0e6, #efe4d8); border:1px solid #a06a38; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#503015; margin-bottom:8px;">⚙️ Technique</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Bergson à Simondon : prolongement du geste humain et transformation du monde.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Technique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- RELIGION --> <td style="width:50%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f9f2ea, #f0e6da); border:1px solid #a87550; border-radius:10px; padding:16px 20px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.08em; color:#553520; margin-bottom:8px;">⛪ Religion</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">De Pascal à Feuerbach : la foi, entre dépendance et élévation.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Religion|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <td style="width:50%;"></td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ SECTION 6 : MÉTHODE & RESSOURCES ═══════════════════════════════════════════════════════════════════ --> <div id="Méthode" style="margin: 35px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #c9a030;"> <span style="font-size: 1.15em; font-weight: 700; color: #6a4800; letter-spacing: 0.02em;">MÉTHODE & RESSOURCES</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Outils pour réussir</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px 12px;"> <tr> <!-- DISSERTATION --> <td style="vertical-align:top; position:relative; background:linear-gradient(180deg, #fffaed, #fcefd0); border:1px solid #c9a030; border-radius:10px; padding:18px 22px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.12em; color:#5a4000; margin-bottom:8px;">📝 Dissertation</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Méthode pas à pas : analyser le sujet, construire la problématique, bâtir le plan, soigner transitions et exemples.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Manuel de terminale de philosophie/Dissertation|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- WIKISOURCE --> <td style="vertical-align:top; position:relative; background:linear-gradient(180deg, #f0f5fa, #e2ecf5); border:1px solid #5078a8; border-radius:10px; padding:18px 22px; overflow:hidden;"> <div style="font-weight:bold; font-size:1.12em; color:#203860; margin-bottom:8px;">📚 Textes sur Wikisource</div> <div style="font-size:0.9em; color:#555; line-height:1.6;">Textes intégraux libres : auteurs classiques, traductions et éditions de référence pour travailler sur sources.</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[s:Portail:Philosophie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ FOOTER : RESSOURCES COMPLÉMENTAIRES ═══════════════════════════════════════════════════════════════════ --> <div style="margin-top: 30px; background: linear-gradient(180deg, #f5f5f3, #eaeae8); border: 1px solid #d8d8d5; border-radius: 8px; padding: 18px 22px;"> <div style="font-size: 0.85em; font-weight: 700; color: #555; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 12px;">Pour aller plus loin</div> <table style="width:100%; border-collapse:collapse;"> <tr> <td style="width:50%; vertical-align:top; padding-right:15px; font-size:0.9em; color:#444; line-height:1.7;"> → [[Philosophie|Portail Philosophie]]<br/> → [[Dictionnaire de philosophie|Dictionnaire des concepts]]<br/> → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]] </td> <td style="width:50%; vertical-align:top; padding-left:15px; font-size:0.9em; color:#444; line-height:1.7; border-left:1px solid #d0d0d0;"> → [[w:Philosophie|Wikipédia : Philosophie]]<br/> → [[v:Philosophie|Wikiversité : Cours]]<br/> → [[s:Portail:Philosophie|Wikisource : Textes]] </td> </tr> </table> </div> [[Catégorie:Philosophie|Manuel de terminale]] [[Catégorie:Manuel de terminale de philosophie (livre)|!]] [[Catégorie:Classe 1 - Philosophie et psychologie]] r4my1q64npi9y6r3ycxwo3we84fur1h Philosophie/Désir 0 201 764992 761359 2026-04-25T07:52:50Z PandaMystique 119061 /* Bibliographie */ 764992 wikitext text/x-wiki {{SommairePhilo}} Nous aborderons la notion de désir en commençant par une définition classique (cf. [[w:Spinoza|Spinoza]]). Nous exposerons ensuite les aspects du désir qui ont le plus retenu l'attention des philosophes, aspects qui concernent la morale et la finalité de la pensée et des actions humaines. Le '''désir''' est une tension vers un but considéré comme une source de satisfaction. C'est une tendance devenue consciente d'elle-même, accompagnée de la représentation du but à atteindre. En tant que tendance ou appétit, le désir est distingué du besoin qui désigne surtout l'élément affectif de cet état. == Analyse de la notion == Par cette définition, nous voyons que le désir n'est pas quelque chose que l'on considère en tant que tel, mais comme une relation particulière que nous entretenons avec un objet. Cet objet (dans un sens général, tout être) est estimé par nous comme une source de satisfaction. Cela suppose, en analysant chaque composant de cette relation : *un être dont les impulsions peuvent se fixer sur un objet ; *un être doté d'une sensibilité et d'une faculté de représentation ; *un être capable d'évaluer la satisfaction que peut lui procurer un objet et qui peut également déterminer quel est l'objet qui le satisfera (mais nous verrons quelles difficultés cela présente souvent) ; *une évaluation de l'objet, évaluation qui implique nos facultés affectives (plaisir procuré par l'objet), cognitives (par exemple, la satisfaction que procure la certitude) et morales. *la représentation que l'obtention d'une certaine relation à l'objet est précisément ce qui nous comblera. == Questions morales == D'une manière générale, le désir suppose la conscience d'un manque qui traduit notre imperfection. Aussi les philosophes et les moralistes mettent-ils souvent l'accent sur deux aspects négatifs du désir : *son caractère douloureux ; l'insatisfaction peut détruire physiquement et psychologiquement celui qui désire ; *son aspect illimité quand il se reporte sans cesse sur de nouveaux objets. Ces aspects mettent en cause la possibilité pour l'homme d'être heureux. Le [[Philosophie/Bonheur|bonheur]] résiderait de ce fait soit dans l'absence de désir, soit dans la maîtrise de soi (tempérance). Cette conception négative du désir implique certaines questions : *doit-on réduire nos désirs ? *est-il possible de distinguer entre de vrais et de faux désirs ? *cette réduction est-elle un [[devoir]] moral ? *la réduction des désirs conduit-elle au [[Philosophie/Bonheur|bonheur]] ? Ces questions sont des poncifs de la réflexion morale depuis l'[[Antiquité]]. On peut schématiquement opposer deux types de réponse : *le désir doit être réduit ; le bonheur est alors conçu comme un état d'inertie atteint par la suppression de toutes les tensions. Le désir est ainsi une part maudite dont il faut s'émanciper ; *le désir ne peut et ne doit pas être réduit : il est essentiel à la vie. La morale doit donc reconnaître sa valeur. == Désirs naturels et désirs vains == Les philosophes, depuis les origines de la philosophie, se sont demandés quelle place faire aux désirs. Les réponses sont très variées. Dans le ''Phédon'', [[Philosophie/Platon|Platon]] expose l'idée d'une vie ascétique où l'homme doit lutter contre les turbulences de son corps ; les [[Cyrénaïques]], au contraire, font de la satisfaction de tous les désirs le bien suprême. Toutes ces réflexions ont conduit à de nombreuses distinctions, comme on le voit par exemple chez [[Philosophie/Épicure|Épicure]]. === La classification des désirs === La [[Philosophie/Morale|morale]] [[Philosophie/Épicure|épicurienne]] est une morale qui fait du plaisir le [[bien]], et de la douleur le [[mal]]. Pour atteindre le bonheur (l'[[ataraxie]]), l'épicurien suit les règles du quadruple remède : *les dieux ne sont pas à craindre ; *la mort n'est pas à craindre ; *la douleur est facile à supprimer ; *le bonheur est facile à atteindre. C'est en vue de ce dernier qu'il faut plus particulièrement penser le désir. Épicure classe ainsi les désirs : {| border="1" cellpadding="5" cellspacing="0" align="center" |+'''Classification des désirs selon [[Philosophie/Épicure|Épicure]]''' ! colspan="4" style="background:#efefef;" align="center" |'''Désirs naturels''' ! colspan="2" style="background:#efefef;" align="center" |'''Désirs vains''' |- ! colspan="3" align="center" | '''Nécessaires''' |'''Simplement naturels''' |'''Artificiels''' |'''Irréalisables''' |- ! align="center"|Pour le bonheur ([[ataraxie]]) ! align="center"|Pour la tranquillité du corps (protection) ! align="center"|Pour la vie (nourriture, sommeil) ! align="center"|Variation des plaisirs, recherche de l'agréable ! align="center"|Ex : richesse, gloire ! align="center"|Ex : désir d'immortalité |- |} Cette classification n'est pas séparable d'un art de vivre, où les désirs sont l'objet d'un ''calcul'' en vue d'atteindre le [[Philosophie/Bonheur|bonheur]]. === Le calcul des plaisirs === Pour Épicure, le calcul (ou "arithmétique") des désirs s'oppose à la fois à l'ascétisme, où l'on se contente d'une vie frugale pour respecter une loi morale, et à la débauche, qui entraîne des souffrances du [[corps]] et des troubles de l'[[âme]]. En général, le plaisir est nécessaire au bonheur, et on le recherche tout en fuyant la douleur. Dans certains cas toutefois, nous traitons le bien comme un mal, car il faut fuir un plaisir léger qui aurait pour conséquence une douleur. Par exemple, pour le corps, boire de l'alcool est agréable, mais peut entraîner la déchéance physique ; et pour l'[[âme]], l'amour est la suppression d'un manque, mais peut entraîner la douleur du fait qu'une union parfaite (comme dans le mythe d'[[Aristophane]]) est impossible. Dans d'autres cas, nous acceptons la douleur si elle est passagère, et si elle est la condition d'un plaisir plus haut. Par exemple, l'exercice physique du corps est douloureux, mais la santé qui en résulte est un plaisir. Si on se livre à un calcul véridique des plaisirs, le bonheur sera facile à atteindre. Le résultat sera l'autarcie, état où l'on se suffit à soi-même en limitant ses désirs : on ne dépend pas des autres, et on ne passe pas sa vie à la poursuite d'objets extérieurs. En se contentant de satisfaire des désirs naturels, on a réduit le désir aux besoins naturels. Mais cette limitation des désirs pose la question de savoir si l'on peut réduire le désir au besoin ; et si l'on peut distinguer des besoins naturels et des besoins artificiels. == Le désir de vérité == Cet exposé de la doctrine épicurienne fait voir qu'il n'est pas facile de distinguer la réalité des désirs. L'épicurisme suppose une insatisfaction fondamentale. Quel est alors le véritable désir de l'homme et comment l'assouvir&nbsp;? Pour [[Philosophie/Platon|Platon]], ce désir est le désir de [[Philosophie/Vérité|vérité]] et il faut pour l'assouvir se libérer de "cette chose mauvaise" qu'est le corps. Il identifie vrai et bien, et donc le vrai désir est la recherche du bien. Les faux désirs sont ceux du corps qui troublent l'âme, l'empêche d'atteindre la vérité et sont sources d'illusions. Cet idéalisme platonicien fait donc du corps une source d'erreur et de mal&nbsp;: *les désirs du corps sont moralement condamnables, sauf quand ils permettent d'accéder aux Idées&nbsp;; *le désir de vérité est en même temps désir du Bien. Tous les philosophes n'ont pas condamné le désir&nbsp;; il faut de plus remarquer que si [[Philosophie/Platon|Platon]] condamne [[Philosophie/Morale|moralement]] le désir, ce dernier reste la condition d'une spiritualisation des instincts qui passe par la philosophie et la politique et qui est l'expression du désir d'immortalité. Mais peut-on condamner aussi catégoriquement le désir&nbsp;? S'il est la cause de nos actions, on ne le devrait pas, car il serait alors l'essence même de notre [[nature]]. == L'essence de l'homme == Classiquement, la raison est considérée comme le propre de l'homme. Pourtant cette raison, qui représente en l'homme la sagesse, ne semble pas devoir exister d'une manière parfaite en l'homme : c'est pourquoi le philosophe désire la sagesse, mais n'affirme pas la posséder. On peut donc douter que la raison soit le propre de l'homme en tant qu'elle serait son essence actualisée. C'est bien le désir qui caractérise l'homme, et la raison n'en serait que l'objet. L'homme ne possède pas la raison mais désire la suivre. == Texte d'étude == PLATON ARISTOPHANE. — [...] Jadis, la nature humaine était bien différente de ce qu'elle est aujourd'hui. D'abord il y avait trois sortes d'hommes : les deux sexes qui subsistent encore, et un troisième composé de ces deux-là; il a été détruit, la seule chose qui en reste, c'est le nom. Cet animal formait une espèce particulière et s'appelait androgyne, parce qu'il réunissait le sexe masculin et le sexe féminin; mais il n'existe plus, et son nom est en opprobe. En second lieu, tous les hommes présentaient la forme ronde. Ils avaient le dos et les côtes rangés en cercle, quatre bras, quatre jambes, deux visages attachés à un cou orbiculaire et parfaitement semblables, une seule tête qui réunissait ces deux visages opposés l'un à l'autre, quatre oreilles, deux organes de la génération, et le reste dans la même proportion. [...] Leur corps était robuste et vigoureux, et leur courage élevé, ce qui leur inspira l'audace de monter jusqu'au ciel et de combattre contre les dieux, ainsi qu'Homère l'écrit d'Éphialte et d'Otos. Zeus examina avec les dieux le parti qu'il fallait prendre. L'affaire n'était pas sans difficulté : les dieux ne voulaient pas anéantir les hommes, comme autrefois les géants, en les foudroyant, car alors le culte et les sacrifices que les hommes leur offraient auraient disparu; mais, d'un autre côté, ils ne pouvaient souffrir une telle insolence. Enfin, après de longues réflexions, Zeus s'exprima en ces termes : "Je crois avoir trouvé, dit-il, un moyen de conserver les hommes et de les rendre plus retenus, c'est de diminuer leurs forces. Je les séparerai en deux; par là, ils deviendront faibles; et nous aurons encore un autre avantage, ce sera d'augmenter le nombre de ceux qui nous servent [...]." Après cette déclaration, le dieu fit la séparation qu'il venait de résoudre; et il la fit de la manière que l'on coupe les œufs lorsqu'on veut les saler, et qu'avec un cheveu on les divise en deux parties égales. Il commanda ensuite à Apollon de guérir les plaies, et de placer le visage et la moitié du cou du côté où la séparation avait été faite, afin que la vue de ce châtiment les rendît plus modestes. [...] Cette division étant faite, chaque moitié cherchait à rencontrer celle dont elle avait été séparée; et, lorsqu'elles se trouvaient toutes les deux, elles s'embrassaient et se joignaient avec une telle ardeur, dans le désir de rentrer dans leur ancienne unité, qu'elles périssaient dans cet embrassement de faim et d'inaction, ne voulant rien faire l'une sans l'autre [...]. Et ainsi la race allait s'éteignant. Zeus, ému de pitié, imagine un autre expédient : il met par-devant les organes de la génération, car auparavant ils étaient par derrière; on concevait et l'on répandait la semence, non l'un dans l'autre, mais à terre, comme les cigales. Zeus mit donc les organes par-devant et, de cette manière, la conception se fit par la conjonction du mâle et de la femelle. Alors, si l'union se trouvait avoir lieu entre l'homme et la femme, des enfants en étaient le fruit, et si le mâle venait à s'unir au mâle, la satiété les séparait bientôt, et les renvoyait à leurs travaux et aux autres soins de la vie. De là vient l'amour que nous avons naturellement les uns pour les autres : il nous ramène à notre nature primitive, il fait tout pour réunir les deux moitiés et pour nous rétablir dans notre ancienne perfection. Le Banquet, 189d-191d PLATON DIOTIME. — [...] Celui qui, dans les mystères de l'Amour, se sera élevé jusqu'au point où nous en sommes, après avoir parcouru dans l'ordre convenable tous les degrés du beau, parvenu enfin au terme de l'initiation, apercevra tout à coup une beauté merveilleuse, celle, ô Socrate, qui était le but de tous ses travaux antérieurs : beauté éternelle, incréée et impérissable, exempte d'accroissement et de diminution, beauté qui n'est point belle en telle partie et laide en telle autre, belle seulement en tel temps et non en tel autre, belle sous un rapport et laide sous un autre, belle en tel lieu et laide en tel autre, belle pour ceux-ci et laide pour ceux-là; beauté qui n'a rien de sensible comme un visage, des mains, ni rien de corporel, qui n'est pas non plus tel discours ou telle science, qui ne réside pas dans un être différent d'elle-même, dans un animal, par exemple, ou dans la terre, ou dans le ciel, ou dans toute autre chose; mais qui existe éternellement et absolument par elle-même et en elle-même; de laquelle participent toutes les autres beautés, sans que leur naissance ou leur destruction lui apporte la moindre diminution ou le moindre accroissement, ni la modifie en quoi que ce soit. Quand, des beautés inférieures on s'est élevé, par un amour bien entendu des jeunes gens, jusqu'à cette beauté parfaite, et qu'on commence à l'entrevoir, on touche presque au but. Car le droit chemin de l'amour, qu'on le suive de soi-même ou qu'on y soit guidé par un autre, c'est de commencer par les beautés d'ici-bas et de s'élever jusqu'à la beauté suprême, en passant, pour ainsi dire, par tous les degrés de l'échelle, d'un seul beau corps à deux, de deux à tous les autres, des beaux corps aux belles occupations, des belles occupations aux belles sciences, jusqu'à ce que de science en science on parvienne à la science par excellence, qui n'est autre que la science du beau lui-même, et qu'on finisse par le connaître tel qu'il est en soi. Ô mon cher Socrate, poursuivit l'étrangère de Mantinée, si quelque chose donne du prix à cette vie, c'est la contemplation de la beauté absolue. Et, si tu y parviens jamais, que te sembleront auprès d'elle l'or et la parure, les beaux enfants et les beaux jeunes gens, dont la vue maintenant te trouble et te charme à un tel point, toi et beaucoup d'autres, que, pour voir sans cesse ceux que vous aimez, pour être sans cesse avec eux, si cela était possible, vous seriez prêts à vous priver de boire et de manger, et à passer votre vie dans leur commerce et leur contemplation ! Que penser d'un mortel à qui il serait donné de contempler la beauté pure, simple, sans mélange, non revêtue de chairs et de couleurs humaines et de toutes les autres vanités périssables, mais la beauté divine elle-même ? Penses-tu que ce serait une destinée misérable que d'avoir les regards fixés sur elle, que de jouir de la contemplation et du commerce d'un pareil objet ? Ne crois-tu pas, au contraire, que cet homme, étant le seul ici-bas qui perçoive le beau par l'organe auquel le beau est perceptible, pourra seul engendrer, non pas des images de vertu, puisqu'il ne s'attache pas à des images, mais des vertus véritables, puisque c'est à la vérité qu'il s'attache ? Or, c'est à celui qui enfante et nourrit la véritable vertu qu'il appartient d'être chéri de Dieu; et si quelque homme doit être immortel, c'est celui-là surtout. Le Banquet, 210e-212a EPICURE Il faut, en outre, considérer que, parmi les désirs, les uns sont naturels, les autres vains, et que, parmi les désirs naturels, les uns sont nécessaires, les autres naturels seulement. Parmi les désirs nécessaires, les uns le sont pour le bonheur, les autres pour l'absence de souffrances du corps, les autres pour la vie même. En effet, une étude de ces désirs qui ne fasse pas fausse route, sait rapporter tout choix et tout refus à la santé du corps et à l'absence de troubles de l'âme, puisque c'est là la fin de la vie bienheureuse. Car c'est pour cela que nous faisons tout: afin de ne pas souffrir et de n'être pas troublés. Une fois cet état réalisé en nous, route la tempête de l'âme s'apaise, le vivant n'ayant plus à aller comme vers quelque chose qui lui manque, ni à chercher autre chose par quoi rendre complet le bien de l'âme et du corps. Alors, en effet, nous avons du plaisir quand, par suite de sa non-présence, nous souffrons, <mais quand nous ne souffrons pas>, nous n'avons plus besoin du plaisir. Et c'est pourquoi nous disons que le plaisir est le principe et la fin de la vie bienheureuse. Lettre à Ménécée == Bibliographie == * [[Philosophie/Le Banquet|Le Banquet]], Platon * [[Phédon]], [[Philosophie/Platon|Platon]] * De l'âme, [[Aristote]] * Lettre à Ménécée, [[Philosophie/Épicure|Épicure]] * [[L'Ethique]], [[Spinoza]] * Généalogie de la morale, [[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]] * Crépuscule des Idoles, [[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]] == Les notions == [[Volonté]] | [[Passion]] | [[Philosophie/Morale|Morale]] | [[Philosophie/Bonheur|Bonheur]] [[Catégorie:Manuel de terminale de philosophie (livre)]] 39ag73xcg71u7ycceyp0ileeud5bwr6 Philosophie/Une brève introduction 0 206 765017 656271 2026-04-25T09:57:48Z PandaMystique 119061 765017 wikitext text/x-wiki {{Entête livre |titre=<p>Philosophie</p> <p>Une brève introduction</p> |fond=2397bc5f|}} == Résumé == Dans ce livre, nous poursuivrons les deux objectifs suivants : présenter l'activité que l'on nomme « philosophie » et dissiper certains des préjugés les plus répandus à son sujet. Ce court texte est volontairement scolaire dans sa forme et n'a pas vocation à être un manuel ou une étude approfondie de la philosophie. Ses objectifs assez modestes seront atteints en fournissant aux lecteurs qui ne possèdent pas de connaissances préalables quelques-uns des éléments indispensables pour se diriger dans l'étude de la philosophie. == Sommaire == ; Introduction * [[/Remarques préliminaires/]] ; [[/Organisation de ce livre/]] * Chapitre I. [[/Le mot « philosophie » et ses usages/]] * Chapitre II. [[/Spécificité de la philosophie/]] * Chapitre III. [[/Trois conceptions de la philosophie/]] * Chapitre IV. [[/Origine de la philosophie/]] * [[/Critiques de la philosophie/]] * [[/Bilan/]] ; Annexes * [[/Pour travailler/]], des sujets de dissertation et des textes * [[/Bibliographie/]] et ressources [[Catégorie:Philosophie|Une brève introduction]] [[Catégorie:Une brève introduction à la philosophie|{{SUBPAGENAME}}]] [[Catégorie:Classe 1 - Philosophie et psychologie]] si2o4w3v0goxmvloz58kelv5s5ztunj Nietzsche : Introduction à sa philosophie/La moralité des mœurs 0 2668 764979 752016 2026-04-25T07:47:55Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La moralité des mœurs]] vers [[Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] 752016 wikitext text/x-wiki La '''Moralité des mœurs''' (en allemand : ''Sittlichkeit der Sitte'') est un concept central développé par Friedrich Nietzsche dans ''Aurore'' (''Morgenröte'', 1881), notamment dans l'aphorisme 9. Cette notion désigne la première forme historique de moralité humaine, caractérisée par l'obéissance aveugle aux coutumes traditionnelles, indépendamment de leur contenu ou de leur rationalité. Pour Nietzsche, cette moralité préhistorique constitue le fondement sur lequel s'est édifié tout l'édifice moral de la civilisation occidentale. == Définition et caractéristiques essentielles == Nietzsche ouvre l'aphorisme 9 d'''Aurore'' par une formulation provocante : « La moralité n'est rien d'autre (donc notamment '''pas davantage''' !) que l'obéissance aux mœurs, quelles qu'elles soient ; or les mœurs sont la manière '''traditionnelle''' d'agir et d'évaluer »<ref>Friedrich Nietzsche, ''Morgenröthe. Gedanken über die moralischen Vorurtheile'', Leipzig, E. W. Fritzsch, 1881, § 9, KSA 3, p. 21-22</ref>. Cette définition révèle le cœur du concept : la moralité primitive ne se fonde pas sur la raison, le bien-être individuel ou une quelconque transcendance, mais uniquement sur la '''tradition''' (''Herkommen''). La coutume (''Sitte'') se présente comme une « autorité supérieure à laquelle on obéit, non parce qu'elle commande ce qui nous est '''utile''', mais parce qu'elle '''commande''' »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 22</ref>. Cette distinction est capitale : la moralité des mœurs n'a pas de justification rationnelle ou utilitaire externe ; elle tire sa légitimité de son antiquité même, de sa sacralité supposée et de son caractère indiscutable. Nietzsche identifie plusieurs dimensions de cette forme archaïque de moralité : '''1. L'obéissance comme principe absolu''' : L'individu moral est celui qui se soumet aux prescriptions héritées, même si elles semblent arbitraires ou irrationnelles. La vertu consiste à se plier au collectif. '''2. Le sacrifice de l'individualité''' : « Le plus moral est celui qui sacrifie le plus à la coutume »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 23</ref>. L'individu doit renoncer à ses désirs personnels et à ses intérêts propres pour que « la coutume, la tradition apparaissent dominantes, malgré tout désir individuel contraire et tout avantage personnel : l'individu doit se sacrifier — c'est ce qu'exige la moralité des mœurs »<ref>Ibid.</ref>. '''3. La suppression de la liberté''' : « L'homme libre est immoral, car il veut en toutes choses dépendre de lui-même et non d'une tradition »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 22</ref>. Dans les états originaires de l'humanité, « mauvais » signifie précisément « individuel », « libre », « arbitraire », « inhabituel », « imprévisible ». == Fonction sociale et anthropologique == Nietzsche interprète la moralité des mœurs comme un gigantesque processus de dressage collectif. Dans la ''Généalogie de la morale'' (1887), il approfondit cette analyse en montrant comment l'humanité s'est « rendu calculable, régulière, nécessaire »<ref>Friedrich Nietzsche, ''Zur Genealogie der Moral. Eine Streitschrift'', Leipzig, C. G. Naumann, 1887, II, § 2, KSA 5, p. 293</ref>. Ce processus de civilisation repose sur la crainte et la violence. Les sociétés primitives imposaient leurs coutumes par « la crainte d'un intellect supérieur qui commande là, d'une puissance incompréhensible et indéterminée, de quelque chose de plus que personnel — c'est la superstition qui est dans cette crainte »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 22</ref>. La moralité apparaît ainsi liée au religieux : les coutumes sont sanctifiées, considérées comme d'origine divine. Nietzsche souligne que « chaque coutume, même la plus dure, devient avec le temps plus douce et plus agréable, et même le mode de vie le plus strict peut devenir une habitude et ainsi une source de plaisir »<ref>Nietzsche, ''Menschliches, Allzumenschliches. Ein Buch für freie Geister'', Chemnitz, Ernst Schmeitzner, 1878, § 97, KSA 2, p. 90-91</ref>. L'habituation transforme la contrainte en seconde nature. == La souffrance volontaire et la cruauté == Un aspect particulièrement sombre de la moralité des mœurs concerne la valeur accordée à la souffrance volontaire. Dans l'aphorisme 18 d'''Aurore'', intitulé « La morale de la souffrance volontaire », Nietzsche analyse comment les communautés primitives, vivant dans un état de guerre permanent et de danger constant, ont développé une jouissance de la cruauté<ref>Nietzsche, ''Morgenröthe'', § 18, KSA 3, p. 30-32</ref>. Cette jouissance de la cruauté se manifeste de deux manières : * '''Extérieurement''' : envers les ennemis et les victimes sacrificielles * '''Intérieurement''' : contre soi-même, sous forme d'ascèse et de mortification « Peu à peu, la coutume forme dans la communauté une pratique conforme à cette représentation : on devient désormais plus méfiant à l'égard de tout bien-être excessif et plus confiant dans tous les états douloureux et pénibles »<ref>Nietzsche, ''Morgenröthe'', § 18, KSA 3, p. 31</ref>. L'idée se répand que les dieux sont satisfaits par le spectacle de la souffrance humaine, non par compassion — car la compassion est méprisée — mais parce qu'ils en sont « divertis et de bonne humeur : car le cruel jouit du plus haut plaisir du sentiment de puissance »<ref>Ibid.</ref>. Cette logique conduit à valoriser l'ascétisme non comme moyen de discipline personnelle ou de bonheur individuel, mais comme preuve de soumission aux forces supérieures et comme offrande aux divinités. == Critique de la rationalisation morale == Nietzsche s'oppose fermement aux tentatives des philosophes, depuis Socrate, de fonder la moralité sur la raison. Ces penseurs, dit-il, « empruntent une voie nouvelle sous la plus vive désapprobation de tous les représentants de la moralité des mœurs — ils se séparent de la communauté, en tant qu'immoraux, et sont, au sens le plus profond, mauvais »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 23</ref>. Les philosophes socratiques qui prêchent la maîtrise de soi et la tempérance comme chemin vers le bonheur personnel sont considérés par Nietzsche comme des exceptions qui ont rompu avec la logique originelle de la moralité des mœurs. Ils ont tenté de substituer à l'obéissance traditionnelle une forme d'autonomie rationnelle — mais cette tentative reste, aux yeux de Nietzsche, profondément marquée par son origine dans la moralité archaïque. == L'originalité persécutée == L'une des conséquences les plus tragiques de la moralité des mœurs est la persécution systématique de toute originalité. « Chaque action individuelle, chaque pensée individuelle suscite l'effroi »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 23-24</ref>. Nietzsche souligne l'impossible calcul des souffrances endurées par les esprits les plus rares, les plus originaux, tout au long de l'histoire, « car ils ont toujours été ressentis comme les mauvais et les dangereux, et même ils '''se ressentaient eux-mêmes ainsi''' »<ref>Ibid.</ref>. Cette intériorisation de la culpabilité constitue l'un des mécanismes les plus puissants de la moralité des mœurs : « Sous la domination de la moralité des mœurs, l'originalité de toute espèce a acquis une mauvaise conscience ; jusqu'à cet instant, le ciel des meilleurs en est encore plus sombre qu'il ne devrait l'être »<ref>Ibid.</ref>. == Le conflit entre moralité et causalité == Dans l'aphorisme 10, Nietzsche établit un rapport inverse entre le sens de la causalité et l'étendue du domaine de la moralité. « Dans la mesure où le sens de la causalité augmente, le domaine de la moralité diminue »<ref>Nietzsche, ''Morgenröthe'', § 10, KSA 3, p. 24</ref>. Chaque fois que l'on comprend les effets '''nécessaires''' et qu'on les distingue de toutes les coïncidences et de tout « après cela, donc à cause de cela » (''post hoc''), on détruit une multitude de '''causalités fantasmatiques''' qui servaient de fondements aux mœurs. Le monde réel, conclut Nietzsche, est « beaucoup plus petit que le monde fantastique », et chaque fois qu'un morceau d'angoisse et de contrainte disparaît du monde, c'est aussi « un morceau de respect pour l'autorité de la coutume » qui s'en va<ref>Ibid.</ref>. Le développement de la science et de la pensée causale constitue ainsi un facteur de dissolution progressive de la moralité des mœurs. == Le processus de dépassement == Nietzsche ne se contente pas de décrire la moralité des mœurs ; il en retrace également le lent processus de dissolution. Dans les sociétés modernes, « le pouvoir de la coutume est étonnamment affaibli et le sentiment de la moralité si raffiné et si élevé qu'on peut tout aussi bien le dire volatilisé »<ref>Nietzsche, ''Morgenröthe'', § 9, KSA 3, p. 21</ref>. Cette évolution ne signifie cependant pas une libération complète. Nietzsche suggère que les formes modernes de moralité — qu'elles soient chrétiennes, kantiennes, utilitaristes ou socialistes — restent secrètement tributaires de la logique archaïque de la moralité des mœurs. Le christianisme, en particulier, a perpétué l'idée du sacrifice de soi et de la soumission à une autorité transcendante, tout en habillant ces exigences d'un discours sur l'amour et la compassion. == L'individu souverain == Dans la ''Généalogie de la morale'', Nietzsche évoque paradoxalement l'émergence, au terme de ce long processus disciplinaire, de « l'individu souverain, semblable seulement à lui-même, libéré à nouveau de la moralité des mœurs, l'individu autonome supramoral (car "autonome" et "moral" s'excluent) »<ref>Nietzsche, ''Zur Genealogie der Moral'', II, § 2, KSA 5, p. 293</ref>. Cet individu possède « sa propre volonté longue et indépendante » et « ose effectivement promettre »<ref>Ibid.</ref>. Cette figure de l'individu souverain représente le dépassement dialectique de la moralité des mœurs : c'est précisément le long dressage moral qui a rendu possible l'émergence d'individus capables de se donner à eux-mêmes leur propre loi. Toutefois, l'interprétation de ce passage reste controversée parmi les commentateurs, certains y voyant une position positive de Nietzsche, d'autres une description ironique ou critique. == Portée philosophique et critique == La notion de moralité des mœurs occupe une place centrale dans le projet généalogique de Nietzsche. Elle lui permet de : '''1. Historiciser la morale''' : En montrant que nos valeurs morales ont une histoire et une origine contingente, Nietzsche ébranle les prétentions des systèmes moraux à l'universalité et à la nécessité. '''2. Naturaliser la morale''' : La moralité n'est plus comprise comme émanant d'un monde intelligible, de Dieu ou de la raison pure, mais comme un phénomène naturel et social, ancré dans les besoins de conservation et de domination des communautés humaines. '''3. Démasquer la violence''' : Derrière les nobles idéaux de la morale, Nietzsche révèle des mécanismes de contrainte, de cruauté et de répression de la vie. '''4. Préparer la critique des morales rationnelles''' : En montrant que même les morales prétendument rationnelles (socratique, kantienne) restent marquées par la logique du sacrifice et de l'obéissance, Nietzsche ouvre la voie à sa critique radicale de toute moralité prescriptive. == Réception et interprétations == Le concept de moralité des mœurs a suscité de nombreux débats : * '''L'anthropologie''' : Certains commentateurs ont rapproché l'analyse nietzschéenne des études anthropologiques contemporaines sur les sociétés primitives, bien que Nietzsche lui-même n'ait pas toujours utilisé des sources fiables<ref>Voir Paolo D'Iorio (éd.), ''Digital Critical Edition of the Complete Works and Letters'', Nietzsche Source, 2009</ref>. * '''La sociologie''' : Ferdinand Tönnies et d'autres sociologues se sont inspirés de l'analyse nietzschéenne de la coutume et de la tradition pour développer leurs propres théories<ref>Ferdinand Tönnies, ''Die Sitte'', Frankfurt am Main, Rütten & Loening, 1909, p. 63-95</ref>. * '''La philosophie morale''' : Les philosophes contemporains débattent de la portée exacte de la critique nietzschéenne — s'attaque-t-il à toute morale possible ou seulement à certaines formes historiques de moralité ? * '''La psychologie''' : La description de l'intériorisation de la contrainte et de la formation de la mauvaise conscience a influencé la psychanalyse freudienne et les théories de la subjectivation. == Conclusion == La moralité des mœurs représente, dans la pensée de Nietzsche, le sol historique et anthropologique sur lequel s'est édifiée toute la moralité occidentale. En révélant les origines violentes, irrationnelles et coercitives de nos valeurs morales, Nietzsche ne cherche pas simplement à les discréditer, mais à nous libérer de leur emprise inconsciente. Sa généalogie vise à créer l'espace pour de nouvelles formes de vie et de pensée, au-delà du bien et du mal tels qu'ils ont été définis par la tradition. Comme il l'écrit dans la préface d'''Aurore''' (ajoutée en 1886) : « En nous s'accomplit — à supposer que vous vouliez une formule — '''l'auto-suppression de la morale''' »<ref>Nietzsche, ''Morgenröthe. Vorrede'', § 4, KSA 3, p. 16</ref>. La compréhension généalogique de la moralité des mœurs est le premier pas vers cette auto-suppression, vers la possibilité d'une existence qui ne serait plus déterminée par l'obéissance aveugle à des coutumes héritées, mais par l'affirmation créatrice de la vie. == Voir aussi == * [[Généalogie de la morale]] * [[Friedrich Nietzsche]] * [[Au-delà du bien et du mal]] * [[Mauvaise conscience]] * [[Volonté de puissance]] == Bibliographie == === Œuvres de Nietzsche === * ''Morgenröthe. Gedanken über die moralischen Vorurtheile'', Leipzig, E. W. Fritzsch, 1881 * ''Menschliches, Allzumenschliches. Ein Buch für freie Geister'', Chemnitz, Ernst Schmeitzner, 1878 * ''Zur Genealogie der Moral. Eine Streitschrift'', Leipzig, C. G. Naumann, 1887 * ''Sämtliche Werke. Kritische Studienausgabe'' (KSA), éd. Giorgio Colli et Mazzino Montinari, Berlin/New York, Walter de Gruyter, 1980, 15 vol. === Études critiques === * Marco Brusotti, ''Die Leidenschaft der Erkenntnis. Philosophie und ästhetische Lebensgestaltung bei Nietzsche von Morgenröthe bis Also sprach Zarathustra'', Berlin/New York, De Gruyter, 1997 * Andreas Urs Sommer, ''Kommentar zu Nietzsches Zur Genealogie der Moral'', Berlin/Boston, De Gruyter, 2019 * Arthur C. Danto, ''Nietzsche as Philosopher'', New York, Columbia University Press, 1965 [trad. fr. ''Nietzsche philosophe''] * Beatrix Himmelmann, « Nietzsche über Moral und Moralismus », in ''Studia Nietzscheana'', 2024 === Sources en ligne === * [http://www.nietzschesource.org Nietzsche Source], édition critique numérique des œuvres complètes [[Catégorie:Friedrich Nietzsche]] [[Catégorie:Philosophie morale]] [[Catégorie:Philosophie allemande]] [[Catégorie:Éthique]] sjpd87hmxuke6kmjfsvx3nud8rcnhmg Nietzsche : Introduction à sa philosophie/La culture moderne 0 2672 764975 631556 2026-04-25T07:47:43Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La culture moderne]] vers [[Nietzsche : Introduction à sa philosophie/La culture moderne]] 631556 wikitext text/x-wiki « Ce dont on ne parle pas à grands cris, cela n’existe pas : douleur, renoncement, devoir, la longue tâche et le grand dépassement – Personne n’en voit ni n’en sent rien. » « Il est enfin devenu comme tout le monde. » ''L'anti-modernisme'' de Nietzsche occupe une grande place dans ses écrits, et la compréhension de cet aspect important de son œuvre permettra de mieux saisir le fond de ses idées à propos du problème de la culture, de l'éducation, et des fins qu'une civilisation peut se présenter comme les plus hautes, i.e. - pour résumer ces problèmes à une seule expression, du ''problème de la hiérarchie.'' L'opposition de Nietzsche à la modernité, à laquelle nous verrons qu'il faut apporter quelques nuances, se manifeste avec une grande virulence dans plusieurs séries de critiques touchant la démocratie (critiques comprenant Rousseau, l'héritage chrétien et l'État moderne) et la vie intellectuelle moderne (l'éducation et les buts qui lui sont assignés, et la production littéraire et scientifique). Nous commencerons par exposer une vue d'ensemble du siècle de Nietzsche, et son évaluation de la démocratie, puis nous examinerons l'éducation moderne et ses conséquences. == Une époque calamiteuse, annonciatrice d'un grand dégoût == « Quelle ne sera pas la répugnance des générations futures quand elles auront à s’occuper de l’héritage de cette période où ce n’étaient pas les hommes vivants qui gouvernaient, mais des semblants d’hommes, interprètes de l’opinion. » (Sch., § 1) Le XIXème siècle est pour Nietzsche un siècle répugnant et barbare, qui ne semble avoir d'autre valeur que celle d'un vomitif pour les générations à venir (''Généalogie de la morale'') ; la culture moderne se caractérise par son allure disparate, l'eclectisme du goût, la fausse apparence des vertus chrétiennes que personne ne suit plus. Trois qualificatifs résument pour Nietzsche la modernité : la naïveté (l'idiotie morale), l'abrutissement des sens (le besoin de stupéfiants), la hâte (l'affairement, l'impossibilité de ne pas se fuire). Ce siècle obscur et inhumain de l’histoire moderne n'est pas cependant sans laisser quelque espoir de renaissance culturelle. La question est posée par Nietzsche : un sage est-il encore possible ? Il lui semble que oui, car ce siècle ambigu et mensonger, coincé entre les anciens idéaux qui s'effondrent lentement et la barbarie intérieure d'instincts mal disciplinés, grossiers et sauvages, ce siècle est un ferment dont on ne peut dire s'il finira par s'affirmer dans toute la force de ses contradictions, ou s'il est le ''commencement de la fin'', l'extinction de l'esprit et de la culture. Dans ce chaos, le sage doit encore être possible, et il faut découvrir les moyens qui pourraient le rendre possible ; il faut se former une image de l'homme la plus haute, la plus noble possible. L’espoir de ceux qui se sentent étranger à ce siècle est ainsi d’autant plus grand : ils peuvent contribuer à faire revivre leur époque, alors que ceux qui vivent de leur temps et pour leur temps se tuent en tuant leur culture mensongère : ils sombreront avec et ne laisseront aucune trace de leur calamiteuse existence. Nous sommes des barbares domestiques ; tel est le diagnostic, établi déjà par Goethe, que Nietzsche martèle à propos de la culture allemande. Tel n’est pas le cas, en revanche, de la culture française, qui possède une unité et un raffinement maladroitement immités par les Allemands. Les critiques de Nietzsche contre la civilisation allemande ont pour nous un caractère prophétique ; en effet, nous pouvons sans difficulté reconnaître aujourd’hui la pertinence de ces critères, non plus seulement pour un pays, mais pour l’ensemble du monde moderne occidental. Nietzsche avait conscience que ces critiques ne valaient pas seulement pour l'Allemagne : le dégoût qu'il éprouvait pour quelques pays était pour ainsi dire l’avant-coureur du dégoût que l’on pourrait bien éprouver un jour devant le spectacle de l'abrutissement d’une grande partie de l’humanité : :« - je l’ai imputé aux Allemands, comme philistinisme et goût du confort : mais ce laisser-aller est européen et « bien d’aujourd’hui », pas seulement en morale et en art. » == L'idéologie démocratique == L'élitisme culturel de Nietzsche s'oppose nettement au développement moderne de la démocratie, parce que Nietzsche refuse catégoriquement l'idée d'une égalité entre les hommes, héritée du christianisme. Mais cette critique doit être nuancée selon les intentions de Nietzsche. Il faut en effet distinguer la critique de la démocratie en elle-même, des conséquences que Nietzsche pense pouvoir en tirer. L'égalitarisme moderne ne peut, selon lui, permettre une haute culture de l'esprit et favorise le ressentiment des incultes en inversant la hiérarchie des valeurs culturelles, et en instituant cette inversion dans les lycées, les universités, et dans la vie publique. La démocratie, telle que Nietzsche la conçoit, est une idéologie du troupeau qui cherche la sécurité et le bien-être, une idéologie par laquelle des hommes médiocres, la majorité, s'assurent une petite gloire pour le présent, aux dépens de la supériorité intellectuelle et de son avenir, contre cette supériorité, i.e. en lui faisant la guerre, en se faisant l'ennemi de tout génie : d'où la critique nietzschéenne de l'éducation démocratique moderne, car cette éducation entrave le développement intellectuel et ne produit que des individus à demi cultivés, grossiers et barbares. L'esprit démocratique est ainsi très complaisant envers lui-même, il se pardonne tout ; c'est un esprit curieux et futile, bariolé et sans goût, sans grande ambition avec ses « petits plaisirs pour le jour et ses petits plaisirs pour la nuit », satisfait de sa médiocrité tranquille et de son bonheur bovin : :« Malheur ! Voici le temps où l'homme ne peut plus donner le jour à une étoile qui danse. Malheur ! Voici le temps du plus méprisable des hommes, qui ne peut même plus se mépriser lui-même. :Voyez ! Je vous montre le ''dernier homme''. » (''Ainsi parlait Zarathoustra'', Prologue) Cette critique virulente s'accompagne toutefois d'une nuance de première importance, et il faut écarter ici une interprétation qui fait de Nietzsche un opposant absolu à tout démocratisme, comme s'il avait souhaité arrêter le mouvement de l'histoire. Bien au contraire, le nivellement de l'humanité par l'égalitarisme est inévitable ; il conçoit l'idée que l'Europe devra nécessairement s'unifier économiquement, et que l'humanité sera bientôt gérée au niveau mondial. Tout cela va dans le sens d'une homogénéisation des sociétés humaines, d'une médiocrisation marchande généralisée. Mais ce qui compte pour lui, c'est que ce nivellement recèle une nouvelle possibilité de hiérarchie. La socialisation de l'homme (le grégarisme planétaire) revient à bâtir une infrastructure d'où pourront surgir de nouvelles classes dominantes. Mais encore faut-il en prendre conscience, et ne pas prendre le moyen pour la fin. Cette remarque justifie une reflexion critique sur l'éducation en général, et en particulier, une réflexion à propos de l'éducation moderne. == L’éducation moderne == Le problème de l’éducation moderne est traité pour la première fois de manière détaillée et pour lui-même dans les cinq conférences données par Nietzsche à l’université de Bâle, dont on retrouve des passages dans ''Cinq préfaces à cinq livres qui n’ont pas été écrits'', et ce problème sera développé plus particulièrement dans la perspective de la culture dans les quatre ''inactuelles''. Ces réflexions se présentent sous la forme d'une violente polémique, où Nietzsche prend à partie quelques uns des aspects de la vie culturelle de l’époque, et dénonce l’état misérable des établissements d’enseignement. Cette agressivité est stratégique : Nietzsche reconnaît une puissance bénéfique au négatif, à ce qui détruit, car le philosophe ne peut créer sans détruire. On peut distinguer dans ces critiques deux finalités : d'une part, la volonté de briser le silence sur ce caractère misérable de l’éducation moderne, i.e. la volonté de se fâcher une bonne fois, de ne pas accepter cet état et de ne pas s'en faire le complice par un silence et une passivité peureuse ; d'autre part, le souhait de voir apparaître des hommes qui engageraient le combat pour la culture, en portant la polémique sur la place publique, et en engageant ainsi déjà le combat pour une éducation et une culture supérieures dont dépendant l'avenir de l'homme. Ce dernier but souligne à quel point nous sommes responsables, en tant que philosophe, de l'image de l'homme, non seulement pour aujourd'hui, mais surtout pour demain. === L'influence de Schopenhauer et d'Emerson === Ces premières réflexions sont de manière évidente une répétition et une réappropriation des critiques formulées par Schopenhauer ; elles s’en distinguent considérablement si l'on remarque la grande influence exercée sur Nietzsche par le style et les idées d’Emerson, style et idées qui imprègnent les ''Inactuelles'' au moins autant que la philosophie de Schopenhauer ; Emerson est partout présent dans les ''Inactuelles'', et cela ne doit pas nous étonner si l’on se rend compte que la critique d’Emerson contre les conventions sociales, scolaires, etc. est parfois proche de Schopenhauer. Retenons que, d'une part, Schopenhauer s’attaque à ceux qu’il considère comme des imposteurs ; ces imposteurs, selon lui, profitent d'un état politique donné pour se faire passer pour des autorités philosophiques et occuper les postes importants pour la culture, tout ceci aux services de l’Etat. Et que, d’autre part, Emerson s’attache à montrer comment l’individualité originale et neuve de la jeunesse est étouffée par les conventions, les traditions et la médiocrité des hommes. La culture moderne est ainsi un système de répression au service de puissances étrangères et hostiles à la philosophie. Cette remarque de l'influence d'Emerson est l'occasion de soutenir que, à notre sens, Nietzsche n’a jamais partagé entièrement le pessimisme de Schopenhauer. On peut en effet se demander si Schopenhauer a eu l’influence de fond que l’on dit sur le jeune Nietzsche. C’est ce dont on peut douter, bien qu’il soit incontestable que Nietzsche reprend un grand nombre des pensées de Schopenhauer, au point que certains passages de ses premières œuvres ne soient qu’une simple reformulation des écrits de Schopenhauer. Pourtant, Nietzsche est, selon nous, bien plus marqué par Emerson dans les ''Inactuelles'', celui des ''Essais'' (cf. « La confiance en soi » notamment.) Enfin, dans ces critiques, nous rencontrons également – mais cette fois de manière implicite – l'influence de Platon. C’est en effet chez ce dernier philosophe que nous trouvons la première critique de l’éducation, et cette critique était, comme on sait, dirigée contre les Sophistes. Platon se donne beaucoup de mal pour établir la différence entre le sophiste et le philosophe, différence que nous retrouvons chez Schopenhauer sous la forme de l’opposition du philistin (Nietzsche n’est donc pas, contrairement à ce qu’il prétend, l’inventeur de cette expression) qui se prostitue en vendant une fausse culture et du philosophe authentique qui a le souci de vivre d'abord pour la philosophie, la pensée et la vérité. Néanmoins cette perspective platonicienne, comme le remarque Sara Kofman dans une étude sur la notion de culture dans les ''Inactuelles'', est reformulée par Nietzsche dans la perspective d'une pensée dont on peut qu'elle est l'ébauche de sa philosophie de la volonté de puissance ; c’est ce point décisif qui nous permet de marquer le caractère propre de la pensée de Nietzsche sur l’éducation, en montrant en quoi elle se distingue des fortes influences qu’elle a subies, et cela nous permettra également de suivre l'évolution de sa pensée jusque dans les dernières œuvres. Mais il nous faut d’abord replacer ces premiers écrits dans un thème qui a occupé Nietzsche à cette époque, et qui s’est développé de diverses manières par la suite. Il s’agit de l’idée du philosophe en tant que médecin de la culture : c'est le philosophe médecin qui est ici à l’œuvre, et que l’on peut, jusqu’à un certain point, mettre en parallèle avec Socrate, lequel plaçait ses interlocuteurs en face de leurs contradictions pour leur bénéfice. Nietzsche veut de la même manière amener au jour les problèmes de l’éducation, afin de réformer la culture, d’en rouvrir les chemins qui sont, pour l'essentiel - c’est à cette époque la conviction de Nietzsche - les chemins de l’hellénisme. Cette conviction marquerait le caractère réactionnaire de la perspective de Nietzsche à ce moment, ainsi que le remarque Jean-Louis Backès dans la préface de sa traduction des conférences. Nous montrerons comment cette attitude réactionnaire évoluera dans les œuvres suivantes. Pour le moment, il s’agit, pour Nietzsche, de rétablir la culture dans sa dimension naturelle, ce qui suppose, comme nous le verrons, une idée précise de ce qu’est l’éducation. Comme Socrate, il y a une sorte de volonté de faire naître la contradiction pour en purifier les âmes, par une prise de conscience radicale qui tourne le regard vers soi, vers cet intériorité dont l'homme moderne se détourne douloureusement. Car l’homme moderne est conduit à se détourner de lui-même en raison notamment d’une éducation inadaptée et mutilante, qui produit un état intérieur chaotique et désespérant qu'il dissimule honteusement, qu'il n'a pas le courage d'être. La sincérité inconditionnelle, courageuse et ne se souciant pas des conséquences, i.e. la sincérité du chevalier au regard d’airain, devrait ainsi provoquer un électrochoc salvateur, et permettre de se sortir de ce labyrinthe des valeurs modernes dont l'homme moderne ignore les moyens de se sortir. L’objet de l’examen de Nietzsche, dans ses conférences prononcées vers 1872, ce sont les écoles où nous acquérons la culture, et les tendances qui s’y laissent deviner. Elles ont été instituées dans ce but, et c’est cet esprit originel qu’il faudrait tâcher de poursuivre, car les réformes que le système éducatif a subies ont été nuisibles. Nietzsche admet ici une sorte de mythe de fondation : les modifications qu’a subit l’école a conduit à des errances, nous éloignant de l’esprit qui l’avait fondé. La refondation de l’école devrait permettre de restituer ses intentions premières. Quelles sont ces erreurs ? Ces erreurs sont présentées comme la volonté d’actualiser l’école, de la conformer avec l’air du temps, ce qui signifie d’en faire une école de l’instant, une école du journalisme. Par là, l’école est incontestablement moderne ; alors pourquoi cette modernité est-elle néfaste, et pourquoi faudrait-il une nouvelle naissance pour en rétablir la première tendance ? Ces questions trouvent leur réponse dans les thèses soutenues par Nietzsche à propos des tendances de la culture moderne. Cette époque est marquée par deux tendances de la culture, tendances qui déterminent les moyens d’éducation qui sont mis en place. Les moyens et les méthodes d’éducation moderne sont en effet dominés par deux tendances : d’une part, la tendance à élargir autant que possible la culture ; d’autre part, la tendance à la réduire et à l’affaiblir (Préface). L’existence de ces tendances et leur critique seront toujours soutenues par Nietzsche, depuis les conférences, jusqu’au ''Crépuscule des idoles''. === L'extension de la culture === === L'abandon de la souveraineté de la culture === === Résultats de l'éducation moderne === == Les philistins de la culture == == La philosophie universitaire == « Dieu merci, je ne suis pas philosophe, mais chrétien et citoyen de mon pays ! » Nous avons fait le tableau de la culture allemande et occidentale du XIXème, telle que Nietzsche la perçoit. Nous pouvons à présent en venir au problème central de toute pensée sur l'éducation, problème qui est l'objet de notre travail : l'éducation du philosophe. La philosophie est en effet pour Nietzsche le résultat le plus haut de l’éducation, et la question que nous posons est de savoir si le philosophe est encore possible. Nous devons dans ce but parvenir à déterminer s’il existe ou nous une éducation spécifique pour le philosophe, et si oui, quels sont les moyens, quelle image nous pouvons nous former du philosophe. Nous arrivons donc là au problème le plus élevé de toute culture, de toute éducation : le problème de l’apparition du philosophe, mais nous l'envisageons tel qu'il est traité par l'éducation moderne. Ce problème de la survenue du philosophe est au cœur des ''Considérations Inactuelles'' ; Nietzsche traite également de manière critique de l’enseignement de la philosophie dans ses ''Conférences'' et dans la troisième ''Inactuelle'' (en particulier dans les derniers chapitres). Cette critique est, comme toute sa critique de l’éducation, une répétition des critiques de Schopenhauer. On peut, pour exposer cette critique, partir du constat de la dévaluation moderne de la philosophie, de l’état misérable dans lequel la philosophie est tombée : la philosophie moderne est tombée dans le plus grand discrédit, et ce constat est d'autant plus évident si l'on regarde du côté de la philosophie antique. La thèse générale de Nietzsche est que la philosophie universitaire entretient cet état misérable de la philosophie, et que cet état pourrait bien être le but recherché par l’Etat. Comment peut-on expliquer cet état de choses ? Pour répondre à cette question, disons que Nietzsche, dans sa troisième ''Considération Inactuelle'', reprend l'essentiel des critiques de Schopenhauer contre la philosophie universitaire. Or, les critiques de Schopenhauer (''Contre la philosophie universitaire'') se resument au constat que l'on ne peut à la fois servir l'État et la vérité. Plusieurs raisons expliquent cette impossibilité. Tout d'abord, le métier de philosophe subordonne la philosophie aux besoins, car il faut nourrir femme et enfants, et trouver quelque contentement de soi dans la culture que l'on a acquise. Ce sont là deux besoins de la nature humaine comme le remarque Hobbes, au début du ''Citoyen'' (le besoin de se reproduire et le besoin du sentiment de puissance). Aussi la liberté accordée à l’université par l’Etat est-elle un malentendu : la réalité est que les professeurs sont des hommes qui ont besoin d'un emploi pour manger. Concrètement la situation est donc celle-ci : l’Etat permet à des hommes de vivre en faisant de la philosophie un gagne-pain. Mais l’Etat redoute de tels hommes, et n’oserait sans doute jamais les favoriser. L’Etat craint la philosophie, et cherche en conséquence à se la concilier en rassemblant autour de lui le plus grand nombre possible de philosophes. Le nombre et l'état servile des philosophes permettent de neutraliser la philosophie, en dissimulant la puissance véritable de ce cette dernière. C’est une illusion, dans la mesure où ceux qui s’en réclament n’inspirent aucune crainte. Une autre raison est que lorsque l'État nomme des « philosophes », il le fait pour sa puissance. Il y a un combat entre le philosophe et l’Etat ; le premier cherche la vérité, sans égard pour les conséquences ; le second veut affirmer son existence, et traite en conséquence le philosophe comme un ennemi mortel. En conséquence, celui qui se soumet à l’Etat pour être reconnu philosophe doit en premier lieu renoncer à la vérité, car il reconnaît quelque chose de plus haut que la vérité : l’Etat. Il devra donc reconnaître également des ''vérités'' formulées par l’Etat : une religion particulière, un gouvernement, un ordre social, etc. tout ce que l’Etat lui interdit d’examiner en philosophe authentique. Schopenhauer remarquait que seuls les grands philosophes peuvent garder leur dignité en étant professeur ; et encore Kant était servile vis-à-vis de l’Etat. Car le philosophe d’Etat a d’énormes obligations, et sa vue est restreinte aux intérêts de l’Etat. Nietzsche pose l’alternative suivante : un philosophe fonctionnaire ou bien a pris conscience de ces restriction et est resté fonctionnaire, et dans ce cas, ce n’est pas un ami de la vérité ; ou bien il n’en a pas pris conscience, et dans ce cas ce n’est pas un ami de la vérité. Le philosophe d’Etat n’a de philosophe que le nom. L'influence de l’Etat ne s'arrête pas là : Nietzsche suggère une analyse des conditions de vie du philosophe fonctionnaire particulièrement originale : l'État, quand il rémunère un professeur, fixe le philosophe dans le temps et l'espace, i.e. dans toutes les dimensions de la vie empirique. Il lui assigne ainsi un lieu de vie, une compagnie déterminée, une activité précise à des horaires déterminés. Deux questions surgissent ici : un philosophe peut-il avoir quelque chose à enseigner à horaire fixe ? Ces horaires ne déterminent-ils pas une habitude de pensée extérieure à la pensée philosophique et qui lui nuit ? Les professeurs doivent s’exprimer à des horaires fixes, même s’ils n’en ont aucune envie. Ainsi, la pensée est elle contrainte de se couler dans des formalités qui lui sont extérieures ; le temps de la pensée devient le temps institué par une politique et des lois, ce qui produit une réflexion machinale et impersonnelle. Le philosophe fonctionnaire est finalement obligé de faire semblant de penser pour parvenir à remplir sa fonction d'enseignant, et il devient, même inconsciemment, un comédien de la philosophie, un histrion. Que reste-t-il de la philosophie ? Il reste la ressource pour la philosophie d’être une simple érudition historique. L’origine de l’histoire de la philosophie comme discipline moderne ne serait-elle pas l’Etat ? La connaissance de l’histoire de la philosophie fait un bon philologue, un bon historien, mais pas un penseur ; il n’est pas nécessaire – et il n’est sans doute pas avantageux - de penser pour être professeur de philosophie. L'État a donc tout intérêt à posséder de tels philosophes. Les philistins se sont donc emparés de la philosophie, et font de la philosophie comme ils font de l’histoire ou comme ils lisent les journaux. La philosophie universitaire est nécessairement conformiste, et elle se développe dans une corporation qui génère une perspective morale grégaire (Crép. Id.). Le complot contre la philosophie est un chef-d'œuvre de machiavélisme. Persécutions. Les philosophes formés par l’Etat, c’est-à-dire les mauvais philosophes, sont les pires ennemis du philosophe : ils satisfont leurs besoins mesquins de puissance : et plus ils se sentent puissants, plus ils sentent l'impunité de leur philistinage, plus ils perdent de leur pudeur en affichant leur barbarie de manière éhontée. Dans cette conspiration contre la philosophie, l’influence de l’Etat prend ainsi deux aspects : L’Etat a le rôle de juge : il juge de ce qu’est un bon philosophe, et dans quelles conditions de vie il est un bon philosophe (note : retrouver l’anecdote sur le philosophe antique - avec Denys) ; et il juge du nombre de philosophes dont l’éducation a besoin. L’Etat a ainsi toute autorité en la matière. Quelle sera l'image crée du philosophe ? Les étudiants se font à l’université une conception naïve de la philosophie, et ne sont jamais en mesure d’en percevoir la réelle difficulté. L’amas confus des opinions décourage les étudiants ; les pseudos travaux des philosophes universitaires n’ont aucun caractère scientifique, ils sont ennuyeux, sans vie et sans esprit. On apprend ainsi la haine de la philosophie. Les examens de philosophie sont dans la même veine : il faut imprimer dans les cerveaux tout un tas d’idée, absurdes ou grandioses, dans le plus grand désordre. L’université : rapport d’écoute. Etudiants et professeurs. Les étudiants sont libres d’entendre ce qu’ils ont envie d’entendre. Mais pour éprouver une philosophie, il faut commencer par la vivre. Dans le prolongement du gymnase, l’université ne favorise pas un apprentissage d’une capacité, mais laisse le soin aux étudiants de s’éduquer eux-mêmes, sans guide, sans repères, ce qui exclut toute obéissance bénéfique. Le résultat, c’est que l’on se retrouve avec des jeunes gens sans expérience qui ont dans la tête plusieurs dizaines de systèmes philosophiques réduits à quelques formules abstraites auxquelles ils n’entendent pas grand-chose. Il s’agit de préparation à des examens de philosophie et non de préparation à la philosophie elle-même. Nietzsche soupçonne que le véritable but de l'université est de dégoûter les jeunes gens de la puissance que constitue l'authentique philosophie en les abêtissant. Ainsi, la philosophie universitaire est-elle ennuyeuse, approximative, arbitraire, etc. en bref, une fumisterie de la culture moderne. La vrai philosophie, au contraire, afflige, et le philosophe n'est certainement pas un individu conciliant et complaisant qui se laisse-aller aux divagations de son temps. Mais c'est là un aspect oublié, et l'on s'indignerait sans doute de voir reparaître des philosophes sur le modèle de certains philosophes antiques qui ne ménagaient pas leur contemporains. Au final, les études philosophiques modernes n’affligent plus personne, sauf pour ce qui est du travail forcé que l'on doit accomplir. Qu’est-ce donc alors que le philosophe, le vrai, l’authentique ? car il y a bien là l’idée d’une vie philosophique authentique, singée par des philistins qui cherchent à s’approprier son prestige et sa puissance par l’imitation la plus superficielle. Le monde moderne ne nous apprend pas ce que c'est qu'un philosophe ; il ne donne pas les moyens de travailler à cette idée du philosophe. Ainsi, celui qui désirerait justifier sa vie par ce but serait dans une situation désespérée. Pour remédier à cette situation, Nietzsche propose d'expulser les « philosophes » de l'université, de leur retirer leur traitement pour faire le tri, voire de les persécuter. On verrait ainsi où sont les véritables penseurs, comme l'était Schopenhauer. En conclusion, l’Etat assigne un rythme à la pensée. Cette influence toute formelle est en réalité l’expression de la toute puissance de l’Etat sur la pensée. L’Etat, en ce qui concerne l’éducation, a intérêt à ce que ces citoyens soient des idiots ; cela se retrouve naturellement en philosophie : mieux vaut de faux philosophes, dont les gesticulations sont sans aucune conséquence pour l’existence de l’Etat. == Conclusion == [[Catégorie:Philosophe]] gc9qh02e61ew76vgxbnmj0m73ak2yki Nietzsche : Introduction à sa philosophie/Le problème de Socrate 0 2675 764983 340630 2026-04-25T07:48:14Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Le problème de Socrate]] vers [[Nietzsche : Introduction à sa philosophie/Le problème de Socrate]] 340630 wikitext text/x-wiki Ce chapitre propose d'examiner le cas de Socrate comme exemple du sage pour qui, selon Nietzsche, ''la vie n'a aucune valeur''. S'il est vrai, comme le soutient Nietzsche, que tous les grands sages n'exprimèrent par leur jugement sur la vie que leur doute et leur lassitude de vivre, de quoi ce consensus est-il l'expression ? Nietzsche évoque deux réponses possibles : *ce consensus doit prouver que la vie ne vaut rien : « la vie n'est qu'une longue maladie ; je dois un coq à Asclépios, le Sauveur. » Voilà ce qu'a dit Socrate au moment de mourir ; *ce consensus ne prouve que l'accord des sages en ce qui concerne la vie. La première réponse est rejetée par Nietzsche : des jugements sur la vie n'ont aucune valeur, car ceux qui jugent sont parties du litige. En conséquence, ''la valeur de la vie ne saurait être évaluée'' ; la valeur de la vie n'est pas non plus un problème philosophique. Il reste donc à chercher de quoi ce consensus peut être l'expression. Et pour Nietzsche, ce jugement exprime la fatigue, la lassitude, la maladie, en un mot la ''décadence''. Ce que prouve l'accord des sages, c'est qu'ils souffrent tous des mêmes désordres physiologiques qui les contraignent ''à adopter la même attitude négative à l'égard de la vie''. Ils ne sont pas libres de juger autrement. Nietzsche passe à l'examen du cas de Socrate qui a une valeur de type pour la réflexion sur la dévaluation de la vie par les sages. Il y distingue plusieurs caractéristique physiques, sociales et morales : *Socrate était peuple ; *il est laid, ce qui semble exprimer un développement de tendances contradictoires dues au metissage ; *Socrate est le type du criminel, ce qui est confirmé par le témoignage de Cicéron : un physionomiste dit à Socrate qu'il était un monstre dissimulant les pires vices et les pires appétits ; or, Socrate répondit : « comme vous me connaissez bien ! » Il est donc avéré que Socrate était atteint d'un désordre anarchique des instincts ; c'est un premier indice de décadence. Nietzsche y ajoute : *l'hypertrophie de la faculté logique *la méchanceté d'un rachitique (nous savons en effet que Socrate était extrêmement colérique, voir la Socrate|biographie dans l'article qui lui est consacré) ; *les hallucinations auditives (le ''démon'' de Socrate) ; *son caractère bouffon et caricatural ; *son caractère dissimulé et retors. Par cette recherche des traits de caractère, Nietzsche s'efforce de comprendre comment a pu naître l'étonnante équation : :'''raison = vertu = bonheur''' qui est si peu naturelle et ne correspond pas à la civilisation Hellène. En effet, selon Nietzsche, le goût des Grec, avec Socrate, s'altère au profit de la dialectique ; mais cette dernière ne vaut pas grand chose, car : :« partout où l'autorité est encore de bon ton, partout où l'on ne donne pas des « raisons », mais des ordres, le dialecticien est une sorte de pitre. » Comment Socrate est-il donc parvenu à imposer la dialectique ? Pour Nietzsche, on use de la dialectique que lorsque l'on n'a pas d'autres moyens, c'est une arme de fortune pour ''conquérir son droit de haute lutte''. Il faut donc que cet usage soit l'expression d'une révolte, d'un ressentiment plébéien. Nietzsche formule l'hypothèse que Socrate se vengeait des aristocrates qu'il parvenait à fasciner : la dialectique en effet réduit l'autre à l'impuissance (exemple de la torpille dans le ''Ménon''), et ''laisse le soin à l'adversaire de prouver qu'il n'est pas un crétin''. Mais il reste à expliquer comment Socrate a pu fasciner. En premier lieu, la dialectique a séduit l'instinct agonal des Grecs qui aimaient les joutes physiques et intellectuelles aux connotations érotiques. Mais l'intuition fondamentale de Socrate fut de comprendre que son cas n'était pas isolé ; le monstre qu'il était se cachait partout : il fallait une cure contre la tyrannie des instincts. Or, on sait que Socrate répondit au physionomiste au sujet des pires appétits que ce dernier voyait en lui : : « C'est vrai, mais je les ai tous maîtrisés. » Ainsi Socrate fascinait-il en ce qu'il semblait être une solution, une guérison du mal dont on souffrait. Ce que l'on peut conclure de cet examen du cas de Socrate, c'est que lorsque la raison devient un tyran, elle est une ''planche de salut'' : le désespoir est au fond de la philosophie spéculative grecque. Il fallait ''être raisonnable jusqu'à l'absurde'' pour ne pas sombrer ; toute philosophie morale qui se développe alors a donc des causes pathologiques et se traduit par l'équation citée ci-dessus : pour être heureux, il faut être lucide, rationnel, sinon on sombre dans l'obscurité de l'inconscient, dans le déchainement des instincts. Mais cette médecine socratique est en réalité une illusion ; on n'échappe pas ainsi à la décadence, on ne fait que l'exprimer sous une autre forme. Cette forme consiste à lutter contre ses instincts ; or - avoir besoin de lutter contre ses instincts, c'est la définition de la décadence (l'anarchie vue plus haut). Tant que la vie est ascendante, le bonheur s'identifie à l'instinct. La dernière phrase de Socrate indique peut-être qu'il avait compris ce qu'il en était réellement de sa méthode de ''guérison'' : une duperie de soi. Selon Nietzsche, Socrate, fatigué de vivre, força Athènes à lui donner la cigüe. Que signifie alors ses dernières paroles ? Nietzsche les interpréte ainsi : :« Socrate n'est pas médecin, s'est-il murmuré à lui-même : la mort seule est médecin... Socrate, lui, n'a fait qu'être longtemps malade... » [[Catégorie:Philosophe]] kwuj8so5h0rzs4hq8zjjr8jgds5cutd Nietzsche : Introduction à sa philosophie/La culture grecque 0 2693 764973 686946 2026-04-25T07:47:32Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La culture grecque]] vers [[Nietzsche : Introduction à sa philosophie/La culture grecque]] 686946 wikitext text/x-wiki Les principaux écrits de Nietzsche relatifs à la culture grecque sont : *''La Naissance de la Tragédie'' *''La philosophie à l'époque tragique des Grecs'' *''L'État chez les Grecs'' *''La joute chez Homère'' *''Le drame musical grec'' *''Socrate et la tragédie'' *''La vision dionysiaque du monde'' *''Crépuscule des idoles'' : « Ce que je dois aux anciens » À ces écrits, s'ajoutent de nombreux aphorismes et fragments. == L'importance de la culture grecque == La culture grecque a fortement influencé la culture européenne. Les Romains étaient friands de cette culture grecque et les pays de langue latine en sont les héritiers. Historiquement, ce n'est pas la plus ancienne civilisation, mais celle dont la langue est encore enseignée. La langue des anciens égyptiens est une langue totalement morte, bien que Champollion ait réussi à décrypter les hiéroglyphes, et on ne connaît pas tous les ressorts de cette écriture très ancienne qui pouvait avoir jusqu'à sept niveaux d’interprétation. == La philosophie grecque == L'exposé le plus long sur la philosophie grecque est ''La philosophie à l'époque tragique des Grecs.'' Nietzsche y étudie les philosophes Présocratiques, et cherche à en découvrir la personnalité à travers les quelques témoignages qu'il nous reste sur eux. Cette étude permet de mieux comprendre ce qu'est pour Nietzsche un philosophe, et la place qu'il occupe dans une civilisation. == Les Grecs et la politique == ''L'État chez les Grecs'' (1872) est une interprétation de la cité idéale de Platon. Certaines des thèses que Nietzsche y exprime sont des thèses qu'il soutiendra toute sa vie et qu'il ne cessera de développer. Elles peuvent être formulées ainsi : *Le travail est un avilissement ; *L'esclavage appartient à l'essence de la civilisation ; *La dignité du travail et la dignité de l'homme sont des mensonges inventés par des esclaves ; *La guerre est nécessaire à l'État ; *L'État est un instrument, non une fin. == L'art grec == La thèse fondamentale de Nietzsche à propos, non seulement de l'art grec, mais également de tout art en général, est que l'art est le seul facteur justifiant la vie et qu'il oppose et associe les figures dionysiaque et apollinienne. Ces deux figures artistiques naissent de l'ivresse. La première est l'ivresse de la décharge d'énergie, la seconde est une ivresse purement visuelle. Par la suite, Nietzsche y ajoutera une troisième forme : la force de la volonté qui se manifeste dans l'architecture. Cette force est une forme classique de l'art, forme qui se pose par elle-même en ne cherchant jamais à plaire. C'est dans ''la Naissance de la tragédie'' que Nietzsche expose pour la première fois la dualité d'Apollon et de Dyonisos. === La tragédie === La tragédie naît selon Nietzsche de l'orgiasme dionysiaque : ''extériorisations incompréhensibles des pulsions populaires''. Les hommes sont en extase, i.e. hors d'eux-mêmes, ils se sentent ensorcelés par le dieu. Ces manifestations de folie populaire n'ont pas seulement existé dans l'Antiquité, on les retrouve chez les danseurs de St. Guy. L'art est, selon Nietzsche, un pont entre deux impulsions symbolisées par des dieux : Apollon et Dionysos. La tragédie attique est l'accouplement de ses deux impulsions qui se combattent sans cesse. Ces deux dieux s'expriment primitivement comme des forces de la nature qui se passent du travail de l'artiste. Elles jaillissent au sein du rêve et du délire. L'opposition de ces forces ne doit pas être exagérée : elles produisent des effets bien différents, mais possèdent quelques points communs. Dans les dernières œuvres de Nietzsche, ces forces semblent même être absorbées dans le seul élément dionysiaque, au point que certains commentateurs ont pu soutenir que le dionysiaque était l'élément originel dont l'apollinien est seulement dérivé. Apollon est le dieu brillant, prophète, qui représente les arts plastiques, le rêve, la belle apparence, le plaisir des formes. Cette beauté de l'apparence n'exclut pas la représentation de sentiments déplaisants. Mais le caractère esthétique qui s'en dégage embellit la vie, et encourage les hommes à vivre. C'est là pour Nietzsche son aspect nécessaire : sans Apollon, la vie ne serait pas digne d'être vécue. L'esthétique d'Apollon est la mesure, le calme de la sagesse, la grâce. Au milieu des tempêtes de l'existence, l'aspect solaire et paisible d'Apollon est ''sublime''. Dionysos est l'ivresse, ivresse des narcotiques, du printemps qui abolit la subjectivité des ''fous de Dionysos''. Dionysos est la volupté de la nature spontanément surabondante. C'est une maladie populaire qui se retrouve dans plusieurs civilisations. Le principe dionysiaque dissous l'individualité et permet à l'homme de renouer avec la nature et l'humanité : c'est le ''mystère de l'Un originaire'' qui ensorcelle tous les êtres et les font danser tous ensemble. L'homme devient l'œuvre d'art d'un dieu. === Décadence de la tragédie === La tragédie est morte tragiquement ; ''son agonie a nom Euripide'' (''Socrate et la tragédie''). Selon Nietzsche Euripide a en commun avec les poètes de la nouvelle comédie, de faire entrer le spectateur de la vie quotidienne sur la scène. Alors que les anciennes tragédies représentaient les héros dont l'idéalisation élève l'âme du spectateur, la tragédie d'Euripide représente le commun, le bas, elle est un miroir rhétorique de la vie des spectateurs qui s'y contemple. Ainsi Euripide a-t-il popularisé la tragédie, en faisant parler le peuple : :« J'ai introduit sur la scène des choses domestiques, qui sont usuelles et familières » (Aristophane, ''Les Grenouilles'', v.959 - 961). Il croyait ainsi lutter contre la décadence de la tragédie, tragédie qui, selon Nietzsche, était en réalité déjà morte. Fort de cette croyance, il crût que l'effet de l'art n'était pas adapté au public athénien. Il conçut alors une forme d'art, dont la loi, selon Nietzsche, peut être exprimée ainsi comme la loi d'une esthétique rationaliste : ''Tout doit être de l'ordre de l'entendement pour que tout puisse être entendu.'' Euripide envisage ainsi de manière critique toutes les parties de l'art : le mythe, la structure dramatique, la musique, la langue, etc. Par exemple, Euripide dévoile toute l'intrigue dans le prologue de ses pièces, contrairement à Eschyle et Sophocle, qui, dans les premières scènes, font subtilement comprendre aux spectateurs ce qui doit se produire. Ainsi Euripe est-il le premier dramaturge à concevoir une esthétique consciente : « Tout doit être conscient pour être beau », principe qui le fait proche de Socrate. ''Socrate fut, dans la tragédie, et dans le drame musical en général, l'élément de sa dissolution.'' Socrate est selon Nietzsche un personnage anti-tragique. La décadence de la tragédie s'exprime dans les pièces d'Euripide, ami de Socrate, dont on rapporte qu'il aida le dramaturge pour la composition de ses œuvres. Nietzsche discerne plusieurs traits de l'évolution de la tragédie qui en montrent la décadence : *l'érudition, le savoir conscient : l'art perd son impulsion dionysiaque. L'équilibre de la lutte tragique est rompu ; *le spectacle devient un jeu d'échecs, une intrigue bourgeoise, i.e. que le raisonnement et l'examen y sont introduits : :« De tels sentiments, c'est pourtant moi qui les inculquai à ceux-ci, en introduisant dans l'art le raisonnement et l'examen ; si bien que désormais on sait concevoir toutes choses, distinguer, et notamment tenir sa maison, ses champs et son bétail mieux qu'auparavant en y regardant bien : "Comment va cette affaire ? Pourquoi ? À quoi bon ? Qui ? Où ? Comment ? Quoi ? Qui m'a pris cela ?" » (Aristophane, ''Les Grenouilles'', v. 971 - 979) *la rhétorique l'emporte sur le dialogue : les personnages deviennent bavards et artificiels ; *la dialectique envahit les héros de la scène *l'esprit de la musique est perdu ; *Euripide introduit le spectateur dans la tragédie : ce spectateur, c'est Socrate. == L'interprétation nietzschéenne de la mythologie grecque == == Notes == [[Catégorie:Philosophe]] 47gywrtnll45k5a1zy6r4zzykbhrbaa Nietzsche : Introduction à sa philosophie/La métaphysique 0 2697 764960 679096 2026-04-25T07:44:19Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La métaphysique]] vers [[Nietzsche : Introduction à sa philosophie/La métaphysique]] 679096 wikitext text/x-wiki Quand on évoque la critique nietzschéenne de la métaphysique, on pense souvent à cette psychologie des profondeurs dont il est l'inventeur et qui est censée dévoiler la véritable origine de concepts tels que ''vérité'', ''être'', etc. Il ne s'agirait plus d'avancer des arguments (que Nietzsche condamnerait comme une ratiocination de faibles), mais de repérer des symptômes qui discréditent une théorie au prétexte qu'elle trouverait sa source dans cette expression du ressentiment que serait la métaphysique. Pourtant, s'il y a un domaine dans lequel il est possible de montrer de manière éclatante que Nietzsche est loin de mépriser l'argumentation, c'est bien cette métaphysique dont il a fait la généalogie, et c'est ce que nous allons faire maintenant. == Critique de la possibilité de la métaphysique == Nietzsche, dans le premier chapitre du premier tome de ''[[Philosophie/Nietzsche/Humain, trop humain|Humain, trop humain]]'', rend en effet compte de l'impossibilité de la métaphysique, impossibilité dont on prend conscience pourvu que l'on veuille bien raisonner de manière rigoureuse, c'est-à-dire de manière ''sceptique'' : :« Prenons un peu au sérieux le point de départ du scepticisme : à supposer qu'il n'existe pas de monde autre, métaphysique, et que, du seul monde connu de nous, toutes les explications empruntées à la métaphysique soient inutilisables pour nous, de quel œil verrions-nous les hommes et les choses ? » (''Humain, trop humain'', §21) On voit donc ici l'emploi par Nietzsche de la méthode sceptique, méthode qui est celle d'Ænésidème, de Hume et de Kant. Bien que ce dernier soit violemment critiqué par Nietzsche, il n'en reste pas moins que la critique kantienne de la métaphysique est vue par Nietzsche comme posant un problème de premier ordre. En ce qui concerne les sceptiques, Nietzsche dira, à la fin de sa vie consciente (cf. ''Antéchrist'') : :« Je mets à part quelques sceptiques - le seul type convenable dans toute l'histoire de la philosophie - : mais les autres ignorent les exigences élémentaires de la probité intellectuelle. » (Ant. §12) Le propos essentiel de cette critique est de montrer que nous n'avons aucune connaissance de quoi que ce soit en dehors de ce que nous percevons, que ce que nous percevons n'est rien d'autre que devenir, et que cette perception est une perspective. Il résulte de cette thèse qu'il ne peut y avoir de vérité absolue pour nous : :« [...] ; il n'y a ''pas'' plus ''de données éternelles'' qu'il n'y a de vérités absolues. » (HTH, §2) Cependant, dans ''Humain, trop humain'', Nietzsche n'exclut pas qu'un monde métaphysique puisse exister ; conformément à la méthode sceptique (que ce soit la méthode que l'on trouve chez les sceptiques anciens ou celle que l'on trouve chez Kant), il admet également qu'un tel monde pourrait être prouvé : :« Il est vrai qu'il pourrait y avoir un monde métaphysique ; la possibilité absolue n'en est guère contestable. » (''Humain, trop humain'', §0) Néanmoins, il corrigera plus tard cette dernière affirmation, en s'écartant cette fois de la pensée sceptique : :« - il est absolument impossible de prouver aucune ''autre'' sorte de réalité. » (''La « raison » dans la philosophie'', ''[[Philosophie/Nietzsche/Crépuscule des idoles|Crépuscule des idoles]]'', § 6) Cette affirmation, que l'on peut qualifier de dogmatique, entraîne une complète indifférence à l'égard d'un monde autre que celui dans lequel nous vivons. Le caractère dogmatique de cette affirmation est d'ailleurs bien visible dans le fait que, selon Nietzsche, cette indifférence est elle-même une réfutation. Ce point est exprimé déjà dans ''Humain, trop humain'', mais avec plus de force encore et de manière répétée dans le ''Crépuscule des idoles'': :« Le « monde vrai », une idée qui ne sert plus à rien, qui n'engage même plus à rien - une idée inutile, superflue, ''par conséquent'' une idée réfutée : abolissons-là. » (''Comment, pour finir, le « monde vrai » devint fable'', § 5) L'ensemble de ces thèses n'a rien d'original, mais il importe de considérer essentiellement les conclusions que Nietzsche pensent pouvoir en déduire pour la méthode d'évaluation de ce que nous appelons la connaissance. En effet, Nietzsche va passer à un autre plan, en affirmant non seulement que, puisqu'il en est ainsi, comme nous l'avons vu, l'existence ou la non-existence de ce monde nous est parfaitement indifférente (ce que les sceptiques avaient déjà reconnus), mais qu'il faut encore expliquer pourquoi, malgré cette démonstration rigoureuse connue depuis des millénaires, un autre monde a pu être pensé comme autre chose qu'une simple hypothèse hasardeuse. Pour Nietzsche, il n'y a donc pas de vérité absolue ; or, dès lors qu'aucune vérité absolue n'est possible, on rejette du même coup le monolithisme de la métaphysique (cf. ''Crépuscule des idoles''). Mais cette négation de la vérité ne signifie pas que Nietzsche n'admet aucun sens à ce concept ; au contraire, le rejet de l'absolu fait apparaître un grand nombre de significations qui se prêtent à l'analyse et il révèle les différentes volontés qui s'investissent dans ce concept. Deux textes des années 1870, ''La passion de la vérité'' et ''Vérité et mensonge au sens extra-moral'', montrent à quel point ces volontés sont diverses et le concept riche de sens. == L'utilité sociale de la vérité == Selon Nietzsche, la vérité a un caractère social et pragmatique, caractère qui se comprend à plusieurs niveaux : *au niveau individuel, le mensonge est plus difficile que la véracité; aussi, il est plus utile de dire la vérité et de se conformer à l'hypocrisie générale ; :« Les hommes fuient moins le mensonge que le préjudice causé par le mensonge. » (''Vérité et mensonge au sens extra-moral'') :Mais ce sont certaines vérités qui sont retenues ; celles qui servent au bénéfice de la communauté. *il est donc plus avantageux de suivre les ''vérités'' reçues dans certains milieux, par exemple : :« Chez les philosophes aussi, autre espèce de saints, la logique de leur profession veut qu'ils ne laissent affleurer que certaines vérités : à savoir celles pour lesquelles leur profession a la ''sanction'' de la société. En termes kantiens, ce sont des vérités de la raison ''pratique.'' » (''Crépuscule des idoles'', ''Divagations d'un « inactuel »'', § 42) *''est vrai ce qui n'a pas fait périr l'humanité''. La règle générale est qu'une institution génère un champ de croyances qui lui sont spécifiques (cf. ''Crépuscule des idoles''). Plus l'autorité est forte, et moins elle tolère les démonstrations. Les mœurs, les lois, la police, assurent alors la pérennité d'une évaluation particulière de la réalité et toute connaissance qui sort de ce cadre est dite fausse, dangereuse, mauvaise. == La métaphysique == Ce conformisme grégaire n'explique pas dans immédiatement l'idéalisme métaphysique. Le problème de la métaphysique demande tout d'abord à être analysé en plusieurs éléments. === Être et devenir === Nietzsche part d'une conception de la métaphysique dans laquelle les opposés ont une valeur fondamentale : *être/devenir *temps/éternité *vrai/faux *un/multiple *etc. Ces opposés ont un statut ontologique radicalement différent, i.e. qu'ils ne peuvent pas en fin de compte être expliqués les uns par les autres : le bien ne naît pas du mal, le mal ne naît pas du bien est une telle opposition métaphysique. Selon Nietzsche, l'opposition métaphysique fondamentale est que '''ce qui est ne devient pas, ce qui devient n’est pas'''. (''Crépuscule des idoles'') Or, si la vérité est quelque chose, la détermination de ce concept ne peut se faire d'après le devenir dont la réalité est trop fuyante pour être pensée (cf. w:Platon|Platon). Ce qui est vrai, c’est donc l’être, l’idée, l’intelligible. Tout ce qui est du domaine du devenir (naissance, douleur, plaisir, mort,) doit être rejeté comme étant du domaine du faux ou de l'illusion. Ainsi, à la question : pourquoi ce qui est de l’ordre du devenir doit-il être rejeté ? Il faut répondre que le devenir nous trompe. Mais ce devenir est un objet de perception pour nos sens, et ces sens ne nous montrent que ce devenir. Les sens sont donc les instruments de l'illusion, instruments d'autant plus trompeurs que nous adhérons à leurs témoignages. Mais, si nous n'avons rigoureusement aucun accès à un monde métaphysique, il nous faut expliquer pourquoi on en vient à penser que les sens nous trompent. Sans l'existence de l'être, le monde du devenir devrait avoir toute notre confiance. Or, l'histoire de la métaphysique et des religions montrent le contraire. Les hommes croient toujours à des entités dont personne n'a jamais eu l'expérience. Les croyances religieuses et les certitudes métaphysiques doivent donc faire l'objet d'un examen particulier. === La volonté de dénigrement === Pour Nietzsche, la croyance en un monde métaphysique est le symptôme d'une volonté de déprécier le monde dont nous informe nos sens :« Dans ce cas, nous nous ''vengeons'' de la vie en lui opposant la fantasmagorie d'une vie « autre » et « meilleure ». (CId., ''La « raison » dans la philosophie'') Les philosophes se vengent donc de la vie en ''momifiant'' tout ce qui à leurs yeux a de la valeur : *leurs notions sont éternelles, sans aucun devenir, donc sans génération, sans croissance, sans corruption, donc sans vie, sans pathos. *cela suppose la suppression du corps et des passions : les philosophes, quand ils produisent des abstractions, vident les concepts de leurs entrailles. Tout ce qui est périssable est frappé de nullité. L’expérience nous montre pourtant le contraire, mais ce n’est pas tout : cela suppose un regard particulier, une perspective sous le rapport de l’éternité. *volonté de dénigrement, nihilisme : le monde vrai = néant. De quelques manières que l’on envisage le problème, ces prémisses étant données, que l’on soit en Inde, en Grèce, etc. la conclusion est que ce monde, le monde des sens, est inconsistant, faux, un néant d’être. *c'est parce que les sens sont tenus pour immoraux, qu'ils doivent être condamnés du point de vue de la connaissance. La haine des sens conduit à imaginer un autre monde. === Les critères idéalistes de la connaissance === Le sentiment, le plaisir que cause une croyance serait la preuve de sa vérité. En réalité : tout ce qui est prouvé, c'est la force du sentiment. Mais une vérité peut être ennuyeuse. === Critique de la raison === L'idée que nous puissions faire une histoire de la connaissance conduit Nietzsche à considérer les catégories de nos facultés cognitives comme les résultats d'habitudes grammaticales devenues instinctives. Mais le langage a une origine lointaine et véhicule des préjugés ''rudimentaires'' : :« Le langage, de par son origine, remonte au temps de la forme la plus rudimentaire de psychologie : prendre conscience des conditions premières d'une métaphysique du langage, ou, plus clairement, de la ''raison'', c'est pénétrer dans une mentalité grossièrement fétichiste. » (''Crépuscule des idoles'', ''La « raison » dans la philosophie'', § 5) Cette métaphysique du langage exprime essentiellement la croyance en la causalité de la volonté, croyance dont découle des principes de la raison : *l'identité *Le moi, la substance *L'idée de cause, la causalité *La finalité Cette métaphysique du langage entraîne à l'erreur de l'Être : :« Je crains que nous ne puissions nous débarrasser de Dieu, parce que nous croyons encore à la grammaire... » (Ibid.) === Théorie du langage === La théorie du langage développée par Nietzsche évoque la philosophie d'Épicure : le langage est une convention ''naturelle'' qui découle des affects. Le langage est un système de signes qui ''transpose'' dans un autre domaine les impulsions nerveuses. C'est en ce sens que le langage est métaphore|métaphorique. Mais l'usage qui est fait du langage occulte ce rapport métaphorique au monde, et les images qu’il véhicule s'objectivent en concept. Nietzsche suggère alors, comme Épicure, que l'on doit pouvoir retrouver l'expérience originelle du langage. Cependant, contrairement à Épicure, ce qui est retrouvé n'est pas un rapport de connaissance, mais un rapport esthétique ; c'est pourquoi, le chant est particulièrement propre à nous le faire revivre : : « Dans le chant l’homme naturel réadapte ses symboles à la plénitude du son, tout en ne maintenant que le symbole des phénomènes : la volonté ; l’essence est à nouveau présentée de façon plus pleine et plus sensible. » (FP, I, 1, 3 [16]). == L'erreur originelle == Le point de départ de toutes les erreurs de la métaphysique est une croyance : :« À l'origine de tout, l'erreur fatale a été de croire que la volonté est quelque chose qui ''agit'' - que la volonté est une ''faculté''... » (CI, Ibid.) Cette erreur n'est donc pas induite par le langage, comme les autres erreurs mais elle a un caractère originelle qu'il faut expliquer. Cette erreur est l'erreur du libre arbitre, analysée par Nietzsche dans le chapitre du ''Crépuscule des idoles'' intitulé ''Les quatre grandes erreurs''. Elle fait référence a la thèse de Nietzsche selon laquelle la liberté a été inventée pour rendre les hommes responsables de leurs actes. Si nous suivons le raisonnement de Nietzsche, l'ensemble des erreurs de la métaphysique a une origine théologique et morale : l'homme est la cause de ses actes ; son moi est sa substance, son être, d'après lequel il va interpréter le monde des phénomènes en y projetant cette causalité psychologique qui sépare ce qui agit (un sujet, un substrat de ce qui devient) de ses effets. Cette croyance entraîne l'invention de l'unité, de l'identité, de la causalité, etc. toutes ces catégories qui prendront une forme systématique dans la métaphysique. [[Catégorie:Philosophe]] 5enn9wzkxmcjci7zwp70ed4kjmvt619 Nietzsche : Introduction à sa philosophie/Philosophie et culture 0 2706 764985 421003 2026-04-25T07:48:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Philosophie et culture]] vers [[Nietzsche : Introduction à sa philosophie/Philosophie et culture]] 421003 wikitext text/x-wiki « Occupez-vous de moi, car je dois m’occuper de vous. » Nous commencerons ce travail par l’étude du type d’homme que Nietzsche considère comme le plus haut degré de la culture, comme le résultat le plus élevé auquel puisse parvenir l’éducation de l’homme, le philosophe. Le philosophe est essentiellement lui-même un éducateur qui fait œuvre de culture, en légiférant sur les valeurs humaines : son action a ainsi à la fois une dimension pour ainsi dire atemporelle, car il pose ce qui doit être de toute éternité ; et une dimension temporelle, car les valeurs qu’il crée font l’histoire ; la philosophie est la condition de l’histoire humaine, puisqu’elle détermine le cadre de son évolution, i.e. le champ des possibles de l’humanité. Le philosophe possède un pouvoir considérable sur les hommes, par la pensée. Comment ce pouvoir est-il possible, et comment se réalise-t-il parmi les hommes ? Un tel type d’homme ne peut venir à l’existence que dans certaines conditions, et il doit posséder certaines qualités. La thèse de Nietzsche est que le philosophe est celui qui advient à ce qu’il est ; et cette nécessité de son existence est inactuelle. C’est cette inactualité qui qualifie le plus exactement le pouvoir du philosophe. Elle consiste à se tenir loin, à entretenir une distance avec les hommes et les choses, distance dans laquelle réside la possibilité d’une maîtrise, qui est à la fois une maîtrise de soi et une maîtrise du futur. L’homme distant, le philosophe, est le maître des temps à venir, parce qu’il tient son époque en son pouvoir en lui-même. Telles sont les thèses de Nietzsche à propos du philosophe et de son rapport à la culture. Remarquons que le vocabulaire de Nietzsche a ici un caractère métaphorique qui peut faire douter de son sérieux ; qu'est-ce, en effet, qu'être inactuel ? et pourquoi cela donnerait-il un pouvoir si exorbitant ? Nous nous fixons pour but de montrer dans cette partie que ce vocabulaire n'est pas métaphorique - mais ''ésotérique'', et qu'il recouvre des concepts précis, que l'on peut expliquer dans la perspective de la métaphysique traditionnelle. == Philosophe et civilisation == Les premières réflexions de Nietzsche à propos du type du philosophe ont essentiellement trait, d’une part, au pathos que suppose ce type, i.e. à sa manière d’être dans ses rapports au monde, aux hommes et à lui-même ; d’autre part, à sa capacité de créer un monde indépendemment de son temps - et malgrè son temps. Nietzsche s’efforce d’analyser les effets de ce pathos sur la civilisation dans laquelle vit un philosophe, et, par cette analyse, il s’efforce de répondre aux questions suivantes : que fait un philosophe dans son temps ? quelle y est sa place ? que fait-il dans la société où il est né ? Quelles relations a-t-il avec elle ? Pour répondre à ces questions, Nietzsche prend surtout pour modèles les philosophes grecs, dont l’activité est selon lui tantôt positive (ce qui concerne surtout les pré-platoniciens), tantôt négative (Socrate, et, après lui, les philosophes de la période hellénistique). Nous aborderons cette distinction plus loin, en examinant plusieurs des types de philosophe que Nietzsche analyse. Nous commencerons par souligner les traits caractéristiques généraux du philosophe, puis nous verrons la multiplicité de ce type à travers cette analyse. === Relations avec sa civilisation === Le philosophe semble être un solitaire indifférent à la culture de son peuple (cf. ''Le Livre du philosophe''). Bien plus, le philosophe a le droit de vivre précisément en philosophe, i.e. dans la solitude. Cette solitude fait partie du pathos de la distance nécessaire à l’activité philosophique, point que nous développerons plus loin. Or, en sens contraire, le philosophe est également pour Nietzsche, d’une part, un maître de l’intelligentsia ; et, d’autre part, il semble être le destructeur de la civilisation nationale : il est ici l’empoisonneur de la civilisation. Le philosophe ne crée pas de civilisation, mais la prépare, son œuvre est négative. Le philosophe n’est pas un meneur d’homme, ce n’est pas un guide ou un héros. Le culte que le philosophe voue à l’intellect est trop étranger à la vie des hommes. Bien au contraire, le philosophe dissout, détruit les mœurs, les instincts, les civilisations. Il est donc le plus utile là où règne le chaos, là où il y a beaucoup à détruire. Le philosophe est un résultat négatif d’une civilisation, il semble n’apparaître que comme un corbeau, un fossoyeur, à la fin des temps. Ces deux points montrent que la solitude du philosophe est en réalité une forme de relation, relation qu’il nous faut comprendre, pour avancer dans la compréhension de l’activité philosophique. Nietzsche se pose, dans les écrits du début des années 1870, les questions suivantes : *Le philosophe a-t-il une relation nécessaire avec le peuple ? *Y a-t-il une téléologie du philosophe ? Autrement dit, le philosophe est-il nécessaire à son temps ? Ou est-il un hasard, un effet sans lien particulier avec une civilisation ? Que cache la solitude du philosophe ? Mais Nietzsche soulève un autre problème, qui semble contredire ce qui vient d'être dit : il faut une unité de civilisation pour faire le philosophe. == Les différents types philosophiques == *[[Philosophie/Nietzsche/Le problème de Socrate|Socrate]] == Qu'est-ce qu'un philosophe ? == === Les vertus philosophiques === === L'activité philosophique === [[Catégorie:Philosophe]] 6m2lo97zogys1nfzvqoby6eaeevzxw6 Catégorie:Commentaire philosophique 14 3800 764925 758709 2026-04-25T06:26:35Z PandaMystique 119061 764925 wikitext text/x-wiki [[catégorie:Philosophie|*]] 0s8r2at910cnqbforuhciypdh8s5dgx 765035 764925 2026-04-25T10:59:38Z PandaMystique 119061 765035 wikitext text/x-wiki [[catégorie:Philosophie|*]] [[Catégorie:Commentaire philosophique (livre)]] dy72gwe5yoyvl23bwcbg54vb1rklbe1 Catégorie:Philosophe 14 3801 764914 452971 2026-04-25T06:05:52Z PandaMystique 119061 764914 wikitext text/x-wiki {{autres projets|commons=Category:Philosophers}} [[catégorie:Philosophie|*]] [[catégorie:Biographie]] 4ndx24kvo7cu3zobqlqowph0f87x49p Catégorie:Philosophie 14 3802 765010 462660 2026-04-25T08:57:32Z PandaMystique 119061 765010 wikitext text/x-wiki {{Méta lien portail|couleur tour=#B08C7B|couleur fond=#7BB08C| image=Owl of Minerva.png|taille image=25| texte='''[[Philosophie]]'''&nbsp;– Accédez aux livres de philosophie de Wikilivres. }} {{autres projets|commons=Category:Philosophy}} [[Catégorie:Classe 1 - Philosophie et psychologie]] 6ebx2oabbbacs06perks3sjh65g3kwt 765030 765010 2026-04-25T10:03:20Z PandaMystique 119061 765030 wikitext text/x-wiki {{Méta lien portail|couleur tour=#B08C7B|couleur fond=#7BB08C| image=Owl of Minerva.png|taille image=25| texte='''[[Philosophie]]'''&nbsp;– Accédez aux livres de philosophie de Wikilivres. }} {{autres projets|commons=Category:Philosophy}} [[Catégorie:Classe 1 - Philosophie et psychologie‎|*]] 7ssrh22pdpvzta3zb7isy6f7uvpq521 Nietzsche : Introduction à sa philosophie 0 3831 764930 758852 2026-04-25T07:39:21Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche]] vers [[Nietzsche : Introduction à sa philosophie]] 758852 wikitext text/x-wiki <div style="max-width: 750px; margin: 0 auto; font-family: Georgia, serif;"> <!-- Couverture principale --> <div style="background: #1e3a5f; border-radius: 8px 8px 0 0; padding: 35px 30px; text-align: center; border: 1px solid #2c5282; border-bottom: none;"> <!-- Titre principal --> <div style="color: #d4af37; font-size: 2.5em; font-weight: bold; letter-spacing: 4px;">NIETZSCHE</div> <!-- Sous-titre --> <div style="color: #c9d6e3; font-size: 1.1em; letter-spacing: 1px; margin-top: 12px;">Introduction à sa philosophie</div> <!-- Ligne décorative --> <div style="width: 50%; height: 1px; background: #d4af37; margin: 20px auto 18px auto;"></div> <!-- Citation --> <div style="color: #a8c5e2; font-style: italic; font-size: 1em;">« Deviens ce que tu es. »</div> </div> <!-- Table des matières --> <div style="background: #fdfbf7; border: 1px solid #d4c4a8; border-top: none; border-radius: 0 0 8px 8px; padding: 30px; box-shadow: 2px 2px 10px rgba(0,0,0,0.08);"> <div style="text-align: center; color: #2c5282; font-size: 1.2em; font-weight: bold; letter-spacing: 2px; margin-bottom: 25px; border-bottom: 1px solid #d4c4a8; padding-bottom: 15px;">TABLE DES MATIÈRES</div> <!-- Introduction --> <div style="margin-bottom: 20px;"> <div style="color: #8b7355; font-weight: bold; margin-bottom: 8px;">Préambule</div> <div style="padding-left: 20px;"> [[/Introduction/|Introduction générale]] </div> </div> <!-- Première partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">I. Vocabulaire nietzschéen</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/L'Apollinien et le Dionysien/|L'Apollinien et le Dionysien]]<br /> [[/Volonté de puissance/|Volonté de puissance]]<br /> [[/Éternel Retour/|Éternel Retour]]<br /> [[/Surhomme/|Surhomme]] </div> </div> <!-- Deuxième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">II. Réévaluation des valeurs</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/La métaphysique/|La métaphysique]]<br /> [[/La moralité des mœurs/|La moralité des mœurs]] </div> </div> <!-- Troisième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">III. Culture et histoire</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Le problème de Socrate/|Le problème de Socrate]]<br /> [[/La culture grecque/|La culture grecque]]<br /> [[/La culture moderne/|La culture moderne]]<br /> [[/Philosophie et culture/|Philosophie et culture]] </div> </div> <!-- Commentaires --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">IV. Commentaires d'œuvres</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Humain, trop humain/|Humain, trop humain]]<br /> [[/Crépuscule des idoles/|Crépuscule des idoles]]<br /> [[Ecce Homo - Humain, trop humain et deux suites|Ecce Homo]] </div> </div> <!-- Séparateur --> <div style="width: 40%; height: 1px; background: #d4c4a8; margin: 25px auto;"></div> <!-- Bibliographie --> <div style="margin-bottom: 15px;"> <div style="color: #5a6a7a; font-weight: bold; margin-bottom: 10px;">Bibliographie</div> <div style="padding-left: 20px; font-size: 0.9em; color: #666; line-height: 1.8;"> Magnus & Higgins, ''The Cambridge Companion to Nietzsche'', 1996<br /> Pearson, ''A Companion to Nietzsche'', 2006<br /> Richardson & Leiter, ''Nietzsche'', Oxford, 2001<br /> Wotling, ''Nietzsche et le problème de la civilisation'', PUF, 2009 </div> </div> </div> <!-- Pied de page - Projets Wikimedia --> <div style="background: #eef3f8; border: 1px solid #c8d8e8; border-radius: 8px; padding: 15px; margin-top: 20px; text-align: center;"> <div style="color: #2c5282; font-size: 0.85em; letter-spacing: 1px; margin-bottom: 10px;">VOIR AUSSI SUR</div> <div style="font-size: 0.95em;"> [[s:Friedrich Nietzsche|Wikisource]] · [[w:Portail:Friedrich Nietzsche|Wikipédia]] · [[q:Friedrich Nietzsche|Wikiquote]] · [[:commons:Friedrich Nietzsche|Commons]] </div> </div> </div> [[Catégorie:Histoire de la philosophie|Nietzsche]] [[Catégorie:Philosophie]] ijbu4xrzdnc1alx190tyb9dcakpyx6v 764997 764930 2026-04-25T08:03:06Z PandaMystique 119061 764997 wikitext text/x-wiki <div style="max-width: 750px; margin: 0 auto; font-family: Georgia, serif;"> <!-- Couverture principale --> <div style="background: #1e3a5f; border-radius: 8px 8px 0 0; padding: 35px 30px; text-align: center; border: 1px solid #2c5282; border-bottom: none;"> <!-- Titre principal --> <div style="color: #d4af37; font-size: 2.5em; font-weight: bold; letter-spacing: 4px;">NIETZSCHE</div> <!-- Sous-titre --> <div style="color: #c9d6e3; font-size: 1.1em; letter-spacing: 1px; margin-top: 12px;">Introduction à sa philosophie</div> <!-- Ligne décorative --> <div style="width: 50%; height: 1px; background: #d4af37; margin: 20px auto 18px auto;"></div> <!-- Citation --> <div style="color: #a8c5e2; font-style: italic; font-size: 1em;">« Deviens ce que tu es. »</div> </div> <!-- Table des matières --> <div style="background: #fdfbf7; border: 1px solid #d4c4a8; border-top: none; border-radius: 0 0 8px 8px; padding: 30px; box-shadow: 2px 2px 10px rgba(0,0,0,0.08);"> <div style="text-align: center; color: #2c5282; font-size: 1.2em; font-weight: bold; letter-spacing: 2px; margin-bottom: 25px; border-bottom: 1px solid #d4c4a8; padding-bottom: 15px;">TABLE DES MATIÈRES</div> <!-- Introduction --> <div style="margin-bottom: 20px;"> <div style="color: #8b7355; font-weight: bold; margin-bottom: 8px;">Préambule</div> <div style="padding-left: 20px;"> [[/Introduction/|Introduction générale]] </div> </div> <!-- Première partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">I. Vocabulaire nietzschéen</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/L'Apollinien et le Dionysien/|L'Apollinien et le Dionysien]]<br /> [[/Volonté de puissance/|Volonté de puissance]]<br /> [[/Éternel Retour/|Éternel Retour]]<br /> [[/Surhomme/|Surhomme]] </div> </div> <!-- Deuxième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">II. Réévaluation des valeurs</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/La métaphysique/|La métaphysique]]<br /> [[/La moralité des mœurs/|La moralité des mœurs]] </div> </div> <!-- Troisième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">III. Culture et histoire</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Le problème de Socrate/|Le problème de Socrate]]<br /> [[/La culture grecque/|La culture grecque]]<br /> [[/La culture moderne/|La culture moderne]]<br /> [[/Philosophie et culture/|Philosophie et culture]] </div> </div> <!-- Commentaires --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">IV. Commentaires d'œuvres</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Humain, trop humain/|Humain, trop humain]]<br /> [[/Crépuscule des idoles/|Crépuscule des idoles]]<br /> [[Ecce Homo - Humain, trop humain et deux suites|Ecce Homo]] </div> </div> <!-- Séparateur --> <div style="width: 40%; height: 1px; background: #d4c4a8; margin: 25px auto;"></div> <!-- Bibliographie --> <div style="margin-bottom: 15px;"> <div style="color: #5a6a7a; font-weight: bold; margin-bottom: 10px;">Bibliographie</div> <div style="padding-left: 20px; font-size: 0.9em; color: #666; line-height: 1.8;"> Magnus & Higgins, ''The Cambridge Companion to Nietzsche'', 1996<br /> Pearson, ''A Companion to Nietzsche'', 2006<br /> Richardson & Leiter, ''Nietzsche'', Oxford, 2001<br /> Wotling, ''Nietzsche et le problème de la civilisation'', PUF, 2009 </div> </div> </div> <!-- Pied de page - Projets Wikimedia --> <div style="background: #eef3f8; border: 1px solid #c8d8e8; border-radius: 8px; padding: 15px; margin-top: 20px; text-align: center;"> <div style="color: #2c5282; font-size: 0.85em; letter-spacing: 1px; margin-bottom: 10px;">VOIR AUSSI SUR</div> <div style="font-size: 0.95em;"> [[s:Friedrich Nietzsche|Wikisource]] · [[w:Portail:Friedrich Nietzsche|Wikipédia]] · [[q:Friedrich Nietzsche|Wikiquote]] · [[:commons:Friedrich Nietzsche|Commons]] </div> </div> </div> [[Catégorie:Nietzsche : Introduction à sa philosophie (livre)|*]] 7au3bsoxc3k110j64puagasnf4p5lr2 765016 764997 2026-04-25T09:57:28Z PandaMystique 119061 765016 wikitext text/x-wiki <div style="max-width: 750px; margin: 0 auto; font-family: Georgia, serif;"> <!-- Couverture principale --> <div style="background: #1e3a5f; border-radius: 8px 8px 0 0; padding: 35px 30px; text-align: center; border: 1px solid #2c5282; border-bottom: none;"> <!-- Titre principal --> <div style="color: #d4af37; font-size: 2.5em; font-weight: bold; letter-spacing: 4px;">NIETZSCHE</div> <!-- Sous-titre --> <div style="color: #c9d6e3; font-size: 1.1em; letter-spacing: 1px; margin-top: 12px;">Introduction à sa philosophie</div> <!-- Ligne décorative --> <div style="width: 50%; height: 1px; background: #d4af37; margin: 20px auto 18px auto;"></div> <!-- Citation --> <div style="color: #a8c5e2; font-style: italic; font-size: 1em;">« Deviens ce que tu es. »</div> </div> <!-- Table des matières --> <div style="background: #fdfbf7; border: 1px solid #d4c4a8; border-top: none; border-radius: 0 0 8px 8px; padding: 30px; box-shadow: 2px 2px 10px rgba(0,0,0,0.08);"> <div style="text-align: center; color: #2c5282; font-size: 1.2em; font-weight: bold; letter-spacing: 2px; margin-bottom: 25px; border-bottom: 1px solid #d4c4a8; padding-bottom: 15px;">TABLE DES MATIÈRES</div> <!-- Introduction --> <div style="margin-bottom: 20px;"> <div style="color: #8b7355; font-weight: bold; margin-bottom: 8px;">Préambule</div> <div style="padding-left: 20px;"> [[/Introduction/|Introduction générale]] </div> </div> <!-- Première partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">I. Vocabulaire nietzschéen</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/L'Apollinien et le Dionysien/|L'Apollinien et le Dionysien]]<br /> [[/Volonté de puissance/|Volonté de puissance]]<br /> [[/Éternel Retour/|Éternel Retour]]<br /> [[/Surhomme/|Surhomme]] </div> </div> <!-- Deuxième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">II. Réévaluation des valeurs</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/La métaphysique/|La métaphysique]]<br /> [[/La moralité des mœurs/|La moralité des mœurs]] </div> </div> <!-- Troisième partie --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">III. Culture et histoire</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Le problème de Socrate/|Le problème de Socrate]]<br /> [[/La culture grecque/|La culture grecque]]<br /> [[/La culture moderne/|La culture moderne]]<br /> [[/Philosophie et culture/|Philosophie et culture]] </div> </div> <!-- Commentaires --> <div style="margin-bottom: 20px;"> <div style="color: #2c5282; font-weight: bold; font-size: 1.05em; margin-bottom: 10px;">IV. Commentaires d'œuvres</div> <div style="padding-left: 20px; line-height: 1.9;"> [[/Humain, trop humain/|Humain, trop humain]]<br /> [[/Crépuscule des idoles/|Crépuscule des idoles]]<br /> [[Ecce Homo - Humain, trop humain et deux suites|Ecce Homo]] </div> </div> <!-- Séparateur --> <div style="width: 40%; height: 1px; background: #d4c4a8; margin: 25px auto;"></div> <!-- Bibliographie --> <div style="margin-bottom: 15px;"> <div style="color: #5a6a7a; font-weight: bold; margin-bottom: 10px;">Bibliographie</div> <div style="padding-left: 20px; font-size: 0.9em; color: #666; line-height: 1.8;"> Magnus & Higgins, ''The Cambridge Companion to Nietzsche'', 1996<br /> Pearson, ''A Companion to Nietzsche'', 2006<br /> Richardson & Leiter, ''Nietzsche'', Oxford, 2001<br /> Wotling, ''Nietzsche et le problème de la civilisation'', PUF, 2009 </div> </div> </div> <!-- Pied de page - Projets Wikimedia --> <div style="background: #eef3f8; border: 1px solid #c8d8e8; border-radius: 8px; padding: 15px; margin-top: 20px; text-align: center;"> <div style="color: #2c5282; font-size: 0.85em; letter-spacing: 1px; margin-bottom: 10px;">VOIR AUSSI SUR</div> <div style="font-size: 0.95em;"> [[s:Friedrich Nietzsche|Wikisource]] · [[w:Portail:Friedrich Nietzsche|Wikipédia]] · [[q:Friedrich Nietzsche|Wikiquote]] · [[:commons:Friedrich Nietzsche|Commons]] </div> </div> </div> [[Catégorie:Nietzsche : Introduction à sa philosophie (livre)|*]] [[Catégorie:Classe 1 - Philosophie et psychologie]] miqdqlorc3vu8z97vnclrahn5fh9k7p Nietzsche : Introduction à sa philosophie/Crépuscule des idoles 0 3832 764934 758602 2026-04-25T07:40:12Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles]] 758602 wikitext text/x-wiki {| style="width:100%; margin:1em 0; background:#f3f6fb; border:1px solid #d9e2ef; border-radius:14px; border-collapse:separate; border-spacing:0; box-shadow:0 2px 8px rgba(0,0,0,.06); font-size:92%;" |- | style="padding:10px 14px; width:25%;" | | style="padding:12px 14px; text-align:center; width:50%;"| <div style="font-size:145%; font-weight:600; color:#324a72; line-height:1.15;">'''''Crépuscule des idoles'''''</div> <div style="margin-top:3px; font-size:98%; color:#556b86; line-height:1.5;">'''Friedrich Nietzsche'''</div> | style="padding:10px 14px; text-align:right; width:25%;"| |} '''''Crépuscule des idoles ou Comment philosopher à coups de marteau''''' (''Götzen-Dämmerung oder wie man mit dem Hammer philosophirt'') est une œuvre du philosophe [[Philosophie/Nietzsche|Friedrich Nietzsche]]. Le titre est une référence ironique au ''Crépuscule des dieux'' de Richard Wagner. Le ''Crépuscule des idoles'' est rédigé à Turin durant l'été 1888, entre fin août et début septembre, dans une période d'intense productivité créatrice. Nietzsche envoie le manuscrit à son éditeur Naumann le 7 septembre 1888 ; l'ouvrage paraît en janvier 1889, quelques jours après l'effondrement mental de l'auteur. Le ''Crépuscule des idoles'' est composé d'un avant-propos, de dix chapitres et d'un extrait d'''[[w:Ainsi parlait Zarathoustra|Ainsi parlait Zarathoustra]]'' (« Le marteau parle »). == Table des matières == {{wikisource|Le Crépuscule des Idoles}} {{:Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} == Bibliographie == * Nietzsche, Friedrich, ''Sämtliche Werke. Kritische Studienausgabe'' (KSA), éd. G. Colli et M. Montinari, Berlin/Munich, De Gruyter/dtv, 1980, vol. 6 * Nietzsche, Friedrich, ''Crépuscule des idoles'', trad. J.-C. Hémery, Paris, Gallimard, « Folio essais », 1988 * Nietzsche, ''Crépuscule des idoles'', trad. É. Blondel, Paris, Flammarion, 2017 (édition commentée). * Andreas Urs Sommer, ''Kommentar zu Nietzsches Der Fall Wagner, Götzen-Dämmerung'', Berlin, De Gruyter, 2012 [[Catégorie:Commentaire philosophique]] entis964kaitoo7mrlbza6hwi9vncf5 764962 764934 2026-04-25T07:44:57Z PandaMystique 119061 764962 wikitext text/x-wiki {| style="width:100%; margin:1em 0; background:#f3f6fb; border:1px solid #d9e2ef; border-radius:14px; border-collapse:separate; border-spacing:0; box-shadow:0 2px 8px rgba(0,0,0,.06); font-size:92%;" |- | style="padding:10px 14px; width:25%;" | | style="padding:12px 14px; text-align:center; width:50%;"| <div style="font-size:145%; font-weight:600; color:#324a72; line-height:1.15;">'''''Crépuscule des idoles'''''</div> <div style="margin-top:3px; font-size:98%; color:#556b86; line-height:1.5;">'''Friedrich Nietzsche'''</div> | style="padding:10px 14px; text-align:right; width:25%;"| |} '''''Crépuscule des idoles ou Comment philosopher à coups de marteau''''' (''Götzen-Dämmerung oder wie man mit dem Hammer philosophirt'') est une œuvre du philosophe [[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]]. Le titre est une référence ironique au ''Crépuscule des dieux'' de Richard Wagner. Le ''Crépuscule des idoles'' est rédigé à Turin durant l'été 1888, entre fin août et début septembre, dans une période d'intense productivité créatrice. Nietzsche envoie le manuscrit à son éditeur Naumann le 7 septembre 1888 ; l'ouvrage paraît en janvier 1889, quelques jours après l'effondrement mental de l'auteur. Le ''Crépuscule des idoles'' est composé d'un avant-propos, de dix chapitres et d'un extrait d'''[[w:Ainsi parlait Zarathoustra|Ainsi parlait Zarathoustra]]'' (« Le marteau parle »). == Table des matières == {{wikisource|Le Crépuscule des Idoles}} {{:Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} == Bibliographie == * Nietzsche, Friedrich, ''Sämtliche Werke. Kritische Studienausgabe'' (KSA), éd. G. Colli et M. Montinari, Berlin/Munich, De Gruyter/dtv, 1980, vol. 6 * Nietzsche, Friedrich, ''Crépuscule des idoles'', trad. J.-C. Hémery, Paris, Gallimard, « Folio essais », 1988 * Nietzsche, ''Crépuscule des idoles'', trad. É. Blondel, Paris, Flammarion, 2017 (édition commentée). * Andreas Urs Sommer, ''Kommentar zu Nietzsches Der Fall Wagner, Götzen-Dämmerung'', Berlin, De Gruyter, 2012 [[Catégorie:Commentaire philosophique]] 6agvrtzxi4bjnuti7lu4jvmer9pifit Nietzsche : Introduction à sa philosophie/Humain, trop humain 0 3847 764963 724969 2026-04-25T07:45:36Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Humain, trop humain]] vers [[Nietzsche : Introduction à sa philosophie/Humain, trop humain]] 724969 wikitext text/x-wiki {{EnTravaux}}<br clear="all"> '''''Humain, trop humain. Un livre pour esprits libres''''' (''Menschliches, Allzumenschliches. Ein Buch für freie Geister'') est une œuvre du philosophe [[Philosophie/Nietzsche|Friedrich Nietzsche]], publiée, pour le premier tome, en 1878. Un second tome fut publié par la suite, réunissant ''Vermischte Meinungen und Sprüche'' (''Opinions et sentences mêlées'') et ''Der Wanderer und sein Schatten'' (''Le Voyageur et son ombre''). === Table des matières === Le premier tome est composé d'une préface, de 638 aphorismes distribués en 9 parties et d'un poème. *'''[[Philosophie/Nietzsche/Humain, trop humain/Des principes et des fins|I. Des principes et des fins]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/Pour servir à l'histoire des sentimaux moraux|II. Pour servir à l'histoire des sentimaux moraux]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/La vie religieuse|III. La vie religieuse]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/De l'âme des artistes et écrivains|IV. De l'âme des artistes et écrivains]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/Caractères de haute et basse civilisation|V. Caractères de haute et basse civilisation]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/L'homme en société|VI. L'homme en société]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/Femmes et enfants|VII. Femmes et enfants]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/Coup d'œil sur l'État|VIII. Coup d'œil sur l'État]]''' *'''[[Philosophie/Nietzsche/Humain, trop humain/L'homme seul avec lui-même|IX. L'homme seul avec lui-même]]''' *'''Entre amis (Épilogue)''' === Annexe === *'''[[Ecce Homo - Humain, trop humain et deux suites]]''' (explication de ce livre par Nietzsche) [[Catégorie:Commentaire philosophique]] 0f8whae1lm7xat82ydbvdqu1gfftxsk 764996 764963 2026-04-25T07:55:38Z PandaMystique 119061 764996 wikitext text/x-wiki {{EnTravaux}}<br clear="all"> '''''Humain, trop humain. Un livre pour esprits libres''''' (''Menschliches, Allzumenschliches. Ein Buch für freie Geister'') est une œuvre du philosophe [[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]], publiée, pour le premier tome, en 1878. Un second tome fut publié par la suite, réunissant ''Vermischte Meinungen und Sprüche'' (''Opinions et sentences mêlées'') et ''Der Wanderer und sein Schatten'' (''Le Voyageur et son ombre''). === Table des matières === Le premier tome est composé d'une préface, de 638 aphorismes distribués en 9 parties et d'un poème. *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins|I. Des principes et des fins]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Pour servir à l'histoire des sentimaux moraux|II. Pour servir à l'histoire des sentimaux moraux]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/La vie religieuse|III. La vie religieuse]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/De l'âme des artistes et écrivains|IV. De l'âme des artistes et écrivains]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Caractères de haute et basse civilisation|V. Caractères de haute et basse civilisation]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/L'homme en société|VI. L'homme en société]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Femmes et enfants|VII. Femmes et enfants]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Coup d'œil sur l'État|VIII. Coup d'œil sur l'État]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/L'homme seul avec lui-même|IX. L'homme seul avec lui-même]]''' *'''Entre amis (Épilogue)''' === Annexe === *'''[[Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites|Ecce Homo - Humain, trop humain et deux suites]]''' (explication de ce livre par Nietzsche) [[Catégorie:Commentaire philosophique]] q16a0d7g5c76ug53rcofjfe54t4cmbf 764999 764996 2026-04-25T08:04:08Z PandaMystique 119061 764999 wikitext text/x-wiki {{EnTravaux}}<br clear="all"> '''''Humain, trop humain. Un livre pour esprits libres''''' (''Menschliches, Allzumenschliches. Ein Buch für freie Geister'') est une œuvre du philosophe [[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]], publiée, pour le premier tome, en 1878. Un second tome fut publié par la suite, réunissant ''Vermischte Meinungen und Sprüche'' (''Opinions et sentences mêlées'') et ''Der Wanderer und sein Schatten'' (''Le Voyageur et son ombre''). === Table des matières === Le premier tome est composé d'une préface, de 638 aphorismes distribués en 9 parties et d'un poème. *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins|I. Des principes et des fins]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Pour servir à l'histoire des sentimaux moraux|II. Pour servir à l'histoire des sentimaux moraux]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/La vie religieuse|III. La vie religieuse]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/De l'âme des artistes et écrivains|IV. De l'âme des artistes et écrivains]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Caractères de haute et basse civilisation|V. Caractères de haute et basse civilisation]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/L'homme en société|VI. L'homme en société]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Femmes et enfants|VII. Femmes et enfants]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Coup d'œil sur l'État|VIII. Coup d'œil sur l'État]]''' *'''[[Nietzsche : Introduction à sa philosophie/Humain, trop humain/L'homme seul avec lui-même|IX. L'homme seul avec lui-même]]''' *'''Entre amis (Épilogue)''' === Annexe === *'''[[Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites|Ecce Homo - Humain, trop humain et deux suites]]''' (explication de ce livre par Nietzsche) [[Catégorie:Commentaire philosophique]] [[Catégorie:Nietzsche : Introduction à sa philosophie (livre)]] eetofdpk519x3hgox25pyvpfj5usju3 Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins 0 3885 764965 675171 2026-04-25T07:45:50Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Humain, trop humain/Des principes et des fins]] vers [[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins]] 675171 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]</div> |- | width="33%"|'''[[Philosophie/Nietzsche/Humain, trop humain|Humain, trop humain]]''' | width="34%" align="center"|'''[[Philosophie/Nietzsche|Friedrich Nietzsche]]''' | width="33%" align="right"|'''[[Philosophie/Nietzsche/Humain, trop humain/Pour servir à l'histoire des sentimaux moraux|II. Pour servir à l'histoire des sentimaux moraux]]''' |} Cette première partie du livre compte 34 aphorismes. Elle porte sur les problèmes de la connaissance et de ses conséquences éthiques, ainsi que sur les erreurs de la métaphysique, et pose les fondements d'une réévaluation des sentiments et des idées humains (moraux, religieux, esthétiques, épistémologiques) d'après une science nouvelle, la philosophie historique. ==== § 1. Chimie des idées et sentiments ==== Le premier aphorisme de ce chapitre annonce le sujet du livre, sujet qui donne une explication du titre : la philosophie historique. Cette philosophie historique découle d'une réévaluation des problèmes philosophiques rendue possible par la réfutation de la métaphysique. En effet, la métaphysique explique l'origine et la nature de tous les concepts moraux, religieux, philosophiques, en y introduisant une division temporelle caractéristique qui leur attribue une valeur supranaturelle. Par exemple, la vérité, la raison, etc. auront une origine surnaturelle, cela veut dire qu'elles ne sont pas engendrées, autrement dit qu'elles sont éternelles, par opposition au caractère éphémère ou vain de l'erreur, des passions, etc. Or, toute explication métaphysique étant écartée, la question se pose de savoir comment nous pouvons encore expliquer ces concepts, ces sentiments, etc. Par exemple, si la vérité n'est pas éternelle, quelle relation a-t-elle avec l'erreur ? La vérité, de ce point de vue, pourrait être une variété de l'erreur. Ce qui est ici écartée, ce sont les explications métaphysiques qui opposent par nature des concepts ou des comportements psychologiques. D'une manière générale, il faut comprendre comment certaines réalités naissent les unes des autres, la vérité de l'erreur, l'altruisme de l'égoïsme, etc. Cela suppose de faire l'histoire de ces réalités, et d'en faire une analyse comparable à l'analyse chimique. Ceci démontre en particulier l'importance de la psychologie pour comprendre la genèse des valeurs humaine (par exemple, plus tard, dans [[Par-delà bien et mal#Psychologie du philosophe|''Par-delà bien et mal'', première partie]], Nietzsche fera une psychologie des philosophes). Nietzsche énonce dès ce premier aphorisme ce que devrait être une méthode débarrassée de la perspective métaphysique : *l'observation morale scrupuleuse et fine ; *l'art de la nuance : la réalité est faite de degrés ; *la nécessité de formuler une théorie de la sublimation des instincts pour expliquer la nature de toutes les valeurs humaines. C'est donc une question de méthode qui se pose. Mais il se pose alors immédiatement un autre problème : le caractère foncièrement inhumain d'une connaissance qui ne recourt plus aux explications humaines habituelles. Non seulement, par une telle méthode, les sentiments humains les plus nobles se trouvent analysés en passions jugées viles, mais on retire du même coup ce qu'il pouvait y avoir de consolateur dans la contemplation de la partie la plus haute, la plus morale de l'humanité, et dans la pensée de sa destinée supranaturelle. Tout ceci est supprimé d'un coup, et la vérité devient ainsi laide et repoussante. Cette première partie est ainsi partagée à peu près en deux groupes d'aphorismes : *les aphorismes qui montrent les erreurs de la métaphysique ; *les aphorismes qui posent les questions méthodologiques et morales sur les conséquences de l'impossibilité d'une perspective métaphysique sur le monde. Le point sans doute essentiel est que Nietzsche fait dès le début du livre entrer le temps dans le champ de la pensée. Il n'est plus question de se demander ce qui vaut éternellement, et de donner ainsi une valeur absolue à certaines réalités, mais de penser le monde d'un point de vue fini, celui de l'homme, c'est-à-dire d'un être vivant, donc mortel, qui ne sait en somme pas grand chose sur le monde qui l'entoure ni sur lui-même. Il y a là une certaine ressemblance avec la démarche socratique, qui nous appelle à la modestie. Nous verrons que cette perspective temporelle sur la finitude humaine entraîne une redéfinition complète du champ de la philosophie, en particulier une prise en considération de ces nombreux aspects de la vie humaine qui furent longtemps refoulés par la pensée éternelle (par exemple le rêve, dont l'interprétation a une place clé dans la méthode nietzschéenne). À la fin de l'aphorisme, Nietzsche énonce les domaines qui doivent faire l'objet d'un nouvel examen ; ces domaines forment le plan du livre : *''représentations et sentiments moraux'', chapitre II *''religieux'', chapitre III *''esthétiques'', chapitre IV *''basse et haute civilisation'', chapitre VI *''société'', chapitre VII, VIII, IX *''la solitude'', chapitre X Les trois premiers domaines sont donc la morale, la religion et l'art. Leur étude sera approfondie au fil des ans dans ''Aurore'', le ''Gai Savoir'', ''Généalogie de la morale'', ''Crépuscule des idoles'', etc. Nietzsche dégagera en effet les types de l'artiste (Wagner, l'artiste moderne) et de l'homme religieux (psychologie du prêtre dans la ''Généalogie), dont nous trouvons déjà les traits caractéristiques dans ''Humain, trop humain''. Nous trouvons également déjà l'idée d'une double origine de la morale, idée qui sera l'objet de la généalogie. Le domaine suivant, portant sur la société et la politique, conduit à l'élaboration d'une grande politique ; et la solitude est un thème lié au philosophe législateur qui réunit en lui plusieurs traits typiques de l'homme moral, artiste, religieux et politique. Ainsi, la lecture scrupuleuse de ''Humain, trop humain'' donne une idée précise et développée de l'ensemble de la pensée de Nietzsche qui possède une unité et une continuité parfois occultées par le découpage en trois périodes de sa philosophie. Ce premier aphorisme nous donne à lui seul un plan relativement complet de toutes les œuvres de Nietzsche ; néanmoins, il faut garder à l'esprit qu'on ne trouve pas encore explicitement les grands concepts auxquels on réduit Nietzsche - Volonté de puissance, Éternel Retour, Surhomme. ==== § 2. Péché originel des philosophes ==== À l'analyse des sentiments et des idées qu'il propose, Nietzsche oppose le point de vue de tous les philosophes : ceux-ci décrivent l'homme comme une vérité éternelle. Pour répondre à la question de savoir ce qu'est l'homme, les philosophes analysent l'homme actuel, et pensent ainsi le connaître dans son ensemble, ce qui donnerait une clé pour la compréhension du monde en général : le monde est conçu comme originairement semblable à l'homme. Cette théorisation est ainsi une téléogie dont l'homme est le centre. Cette méthode a quelques présupposés que Nietzsche souligne particulièrement : *l'essence de l'homme est éternelle ; *elle est immuable au sein du devenir ; l'homme est en quelque sorte autonome, il est une réalité indépendante des choses ; *l'homme est mesure (Nietzsche fait allusion à l'étymologie de ce mot) absolue des choses ; thèse que Nietzsche reprend en disant que l'homme est l'animal qui fixe des valeurs, en croyant à l'objectivité de ces valeurs. Ces attributs traditionnels de l'essence de l'homme sont étonnants par leur démesure, car il montre qu'en réalité l'homme s'est pensé comme ''Dieu''. L'homme s'est ainsi pensé comme un être atemporel, dont l'essence n'est pas touchée par le monde et le devenir. La thèse opposée soutenue par Nietzsche introduit au contraire, comme nous l'avons signalé plus haut, le temps dans la connaissance que nous pouvons avoir de l'homme. Plus exactement, le temps est l'élément essentiel de cette connaissance. Nous ne pouvons pas sérieusement penser l'homme comme un être sans histoire, qui ne serait pas modifié en son fond de manière substantielle, dont l'existence n'aurait pas fondamentalement de dimension temporelle. La connaissance même que nous pouvons en avoir est soumise au devenir, au changement, au temps. Cette thèse a des conséquences qu'il s'agit d'établir correctement, et ''Humain, trop humain'' en est une étape importante qui sera largement poursuivie par toutes les œuvres suivantes de Nietzsche. Une première étape consiste à modifier le vocabulaire de la philosophie, modification qui va également exprimer un changement dans le champ de déploiement de la pensée : en effet, la dimension historique de l'homme se traduit dans cette aphorisme par l'emploi de mots et d'expressions qui s'opposent au vocabulaire métaphysique : influence, modeler, événement, évolution humaine, résultat d'un devenir. L'emploi de ces mots se fait dans les thèses suivantes : *d'une manière générale, l'homme est le résultat d'un devenir ; *ce devenir commence bien avant l'histoire connue, autrement dit nous ignorons totalement l'essentiel du devenir humain ; *l'histoire connue (à peine 4000 ans) présente une humanité relativement stable ; *les facultés humaines sont elles-mêmes un résultat ; *l'homme est influencé et modelé par la religion et la politique, parfois de manière très éphémère ; *il n'y a ni données éternelles ni vérités éternelles. De là découle cette double conclusion : pour connaître l'homme, il faut établir une philosophie historique ; cette philosophie historique suppose de la modestie. En ce qui concerne la philosophie historique, il s'agit d'étudier l'être homme en tant que tel, c'est-à-dire selon deux axes : *en analysant les composants de ses sentiments et de ses idées ; *en décrivant leur histoire. Cette méthode met particulièrement en valeur l'étude morale des hommes ; contrairement à la métaphysique qui étudie des réalités en apparence très éloignées de la réalité quotidienne de l'être humain, Nietzsche souhaite une science morale qui fasse l'observation de tous les petits courants de la vie (ce point est détaillé par exemple dans le ''Gai Savoir'' : le rythme des jours - fêtes, travail, repos - les problèmes de l'alimentation sur le moral, les conséquences de la vie en communauté, l'étude des différentes mœurs selon le travail, etc.). Quant à la modestie, elle va être illustrée par Nietzsche dans l'aphorisme suivant avec le cas de la vérité. ==== § 3. Estime des vérités discrètes ==== Nietzsche a signalé dès le premier aphorisme la conséquence psychologique radicale de la réévaluation de l'humanité d'un point de vue historique. Sous une forme interrogative, il se demande en effet : faut-il être inhumain (alors que jusque là les philosophes furent trop humains) pour ''voir'' l'homme (ses sentiments et ses idées) et le monde (dénué de finalité) du point de vue de la philosophie historique ? L'aphorisme trois apporte quelques précisions en abordant le problème de la vérité. Pourtant, il y a ici un problème : s'il nous faut étudier l'homme d'un point de vue historique, celui qui l'étudie doit ''relativiser'' sa connaissance. En effet, Nietzsche vient de l'affirmer : ''il n'y a pas de vérité éternelle.'' Dès lors, peut-il y avoir des ''vérités discrètes'' ? Or, ici, au lieu de répondre à cette question qui vient naturellement à l'esprit, Nietzsche se dirige immédiatement vers une évaluation ''psychologique'' de la vérité. Ce sont d'autres aphorismes de cette même partie qui répondront à cette question du scepticisme de la connaissance liée à la question de la possibilité d'une véritable réfutation de la métaphysique. Mais nous pouvons dire cependant que Nietzsche commence déjà à répondre à cette question, en purifiant le concept de vérité de ses dimensions psychologiques injustifiées. Autrement dit, il dégage la question de la vérité de ce qui empêchait d'en poser véritablement la question, et nous avertit implicitement : pour comprendre exactement la philosophie historique, il faut commencer par admettre que les qualités humaines de la vérité sont égarantes et obscurcissent le problème. Ainsi, avant d'en venir à la métaphysique proprement dite, le regard doit se purifier, la pensée doit être claire. Il faut désobstruer ce chemin pollué par l'histoire de la pensée (philosophique, religieuse, morale), chemin qui mène au problème en tant que tel. Nietzsche commence par souligner le caractère modeste des vérités découvertes par une méthode rigoureuse. Ces vérités s'opposent aux conséquences psychologiques des erreurs humaines ; ces erreurs sont en effet : *éblouissantes, enthousiasmante ; *consolatrices et dispensatrices de bonheur ; *belles. Ces qualités sont à rapprocher du platonisme : le désir du bien qui fait la passion philosophique en excitant la recherche des vrais réalités, l'éclat et la beauté de la vérité, des Idées éternelles, la perspective d'une vie meilleure pour les justes évoquée dans le ''Phédon'', etc. Par opposition, on comprend que les vérités que Nietzsche veut soutenir risques de paraître ternes, qu'elles n'existent vraisemblablement pas l'intérêt, et qu'elles ne soulèvent pas les masses ; mais elles sont aussi irritantes, laides et repoussantes, tragiques. Nietzsche rejettera néanmoins plus loin toutes ses qualifications parce ce ne sont jamais que des mystifications, qu'il s'agisse d'optimisme ou de pessimisme. Ces qualifications ne pas en réalité l'essentiel de cet aphorisme, mais il s'agit plus fondamentalement de la modification du jugement à l'égard des vérités, modification qui est le résultat d'une spiritualisation et d'une plus grande intériorité des formes de notre vie. À ce stade de la réflexion, Nietzsche énonce le mot de toute sa pensée : intériorité. C'est ici notre thèse interprétative : toute la philosophie de Nietzsche est centrée sur le progrès de l'intériorisation des activités humaines, intériorisation qui est un approfondissement de la vie de l'esprit, un enrichissement et embellissement de soi. Tout est alors résumé par cette formule : ''[...] combien un simple regard où brille l'esprit doit maintenant avoir pour nous tous plus de valeur que la plus belle proportion, que la plus sublime architecture.'' L'homme est œuvre d'art, la plus sublime. La connaissance historique de l'homme proposée par Nietzsche va dans ce sens. Ainsi, paradoxalement, alors que les vérités discrètes sont d'abord jugées laides, par une plus grande intellectualisation l'homme devient lui-même : *de plus en plus beau (harmonie, éclat de l’œil intelligent), et même sublime (idée de grandeur, de noblesse, de force et de puissance) ; *de plus en plus profond et vaste (il faut s'assimiler toute la connaissance dira Nietzsche dans le ''Gai Savoir'') ; *de plus en plus riche. Ce processus est selon Nietzsche un enlaidissement aux yeux des époques antérieures. ==== Origine et nature des erreurs de la métaphysique ==== Ce problème capital pour la suite est abordé en 2, 4, 5, 7, 8, 9, 10, 11, etc. Pourquoi des explications métaphysiques ? *le langage comme pseudo-science ===== L'interprétation du rêve ===== Dans l'ensemble de l'œuvre de Nietzsche, le rêve a une place importante et multiforme. Dans cette première partie de ''Humain, trop humain'', le rêve est l'objet des aphorismes 5, 12 et 13. L'aphorisme 13 présente une explication psychologique du rêve, appuyée par des aspects physiologiques. L'aphorisme 12 a une importance particulière, car il porte sur les différentes strates affectives et cognitives de l'homme qui justifient l'approche historique de l'homme proposée par Nietzsche dans le l'aphorisme 1. Enfin, l'aphorisme 5 montre que le rêve a rendu possible l'idée d'une seconde réalité. On remarque d'emblée que l'analyse du rêve recoupe toutes les analyses de la métaphysique ; bien plus, l'interprétation du rêve est une explication intégrale (conditions de possibilités, raisonnements logiques, fonction fabulatrice, etc.) de la pensée métaphysique et de toutes les inventions de l'esprit humain. Mais cette interprétation a également une dimension morale de première importante. Nous allons analyser à présent l'ensemble de ces dimensions. ==== Réévaluer le problème de la connaissance ==== *la place de l'illogique *la nécessité de l'erreur ==== Le problème de la finalité de la connaissance ==== *la philosophie est-elle tragique ? [[Catégorie:Commentaire philosophique]] kwest1zohpleb0qtoppnq7st1rvxudg 764998 764965 2026-04-25T08:03:54Z PandaMystique 119061 764998 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]</div> |- | width="33%"|'''[[Philosophie/Nietzsche/Humain, trop humain|Humain, trop humain]]''' | width="34%" align="center"|'''[[Philosophie/Nietzsche|Friedrich Nietzsche]]''' | width="33%" align="right"|'''[[Philosophie/Nietzsche/Humain, trop humain/Pour servir à l'histoire des sentimaux moraux|II. Pour servir à l'histoire des sentimaux moraux]]''' |} Cette première partie du livre compte 34 aphorismes. Elle porte sur les problèmes de la connaissance et de ses conséquences éthiques, ainsi que sur les erreurs de la métaphysique, et pose les fondements d'une réévaluation des sentiments et des idées humains (moraux, religieux, esthétiques, épistémologiques) d'après une science nouvelle, la philosophie historique. ==== § 1. Chimie des idées et sentiments ==== Le premier aphorisme de ce chapitre annonce le sujet du livre, sujet qui donne une explication du titre : la philosophie historique. Cette philosophie historique découle d'une réévaluation des problèmes philosophiques rendue possible par la réfutation de la métaphysique. En effet, la métaphysique explique l'origine et la nature de tous les concepts moraux, religieux, philosophiques, en y introduisant une division temporelle caractéristique qui leur attribue une valeur supranaturelle. Par exemple, la vérité, la raison, etc. auront une origine surnaturelle, cela veut dire qu'elles ne sont pas engendrées, autrement dit qu'elles sont éternelles, par opposition au caractère éphémère ou vain de l'erreur, des passions, etc. Or, toute explication métaphysique étant écartée, la question se pose de savoir comment nous pouvons encore expliquer ces concepts, ces sentiments, etc. Par exemple, si la vérité n'est pas éternelle, quelle relation a-t-elle avec l'erreur ? La vérité, de ce point de vue, pourrait être une variété de l'erreur. Ce qui est ici écartée, ce sont les explications métaphysiques qui opposent par nature des concepts ou des comportements psychologiques. D'une manière générale, il faut comprendre comment certaines réalités naissent les unes des autres, la vérité de l'erreur, l'altruisme de l'égoïsme, etc. Cela suppose de faire l'histoire de ces réalités, et d'en faire une analyse comparable à l'analyse chimique. Ceci démontre en particulier l'importance de la psychologie pour comprendre la genèse des valeurs humaine (par exemple, plus tard, dans [[Par-delà bien et mal#Psychologie du philosophe|''Par-delà bien et mal'', première partie]], Nietzsche fera une psychologie des philosophes). Nietzsche énonce dès ce premier aphorisme ce que devrait être une méthode débarrassée de la perspective métaphysique : *l'observation morale scrupuleuse et fine ; *l'art de la nuance : la réalité est faite de degrés ; *la nécessité de formuler une théorie de la sublimation des instincts pour expliquer la nature de toutes les valeurs humaines. C'est donc une question de méthode qui se pose. Mais il se pose alors immédiatement un autre problème : le caractère foncièrement inhumain d'une connaissance qui ne recourt plus aux explications humaines habituelles. Non seulement, par une telle méthode, les sentiments humains les plus nobles se trouvent analysés en passions jugées viles, mais on retire du même coup ce qu'il pouvait y avoir de consolateur dans la contemplation de la partie la plus haute, la plus morale de l'humanité, et dans la pensée de sa destinée supranaturelle. Tout ceci est supprimé d'un coup, et la vérité devient ainsi laide et repoussante. Cette première partie est ainsi partagée à peu près en deux groupes d'aphorismes : *les aphorismes qui montrent les erreurs de la métaphysique ; *les aphorismes qui posent les questions méthodologiques et morales sur les conséquences de l'impossibilité d'une perspective métaphysique sur le monde. Le point sans doute essentiel est que Nietzsche fait dès le début du livre entrer le temps dans le champ de la pensée. Il n'est plus question de se demander ce qui vaut éternellement, et de donner ainsi une valeur absolue à certaines réalités, mais de penser le monde d'un point de vue fini, celui de l'homme, c'est-à-dire d'un être vivant, donc mortel, qui ne sait en somme pas grand chose sur le monde qui l'entoure ni sur lui-même. Il y a là une certaine ressemblance avec la démarche socratique, qui nous appelle à la modestie. Nous verrons que cette perspective temporelle sur la finitude humaine entraîne une redéfinition complète du champ de la philosophie, en particulier une prise en considération de ces nombreux aspects de la vie humaine qui furent longtemps refoulés par la pensée éternelle (par exemple le rêve, dont l'interprétation a une place clé dans la méthode nietzschéenne). À la fin de l'aphorisme, Nietzsche énonce les domaines qui doivent faire l'objet d'un nouvel examen ; ces domaines forment le plan du livre : *''représentations et sentiments moraux'', chapitre II *''religieux'', chapitre III *''esthétiques'', chapitre IV *''basse et haute civilisation'', chapitre VI *''société'', chapitre VII, VIII, IX *''la solitude'', chapitre X Les trois premiers domaines sont donc la morale, la religion et l'art. Leur étude sera approfondie au fil des ans dans ''Aurore'', le ''Gai Savoir'', ''Généalogie de la morale'', ''Crépuscule des idoles'', etc. Nietzsche dégagera en effet les types de l'artiste (Wagner, l'artiste moderne) et de l'homme religieux (psychologie du prêtre dans la ''Généalogie), dont nous trouvons déjà les traits caractéristiques dans ''Humain, trop humain''. Nous trouvons également déjà l'idée d'une double origine de la morale, idée qui sera l'objet de la généalogie. Le domaine suivant, portant sur la société et la politique, conduit à l'élaboration d'une grande politique ; et la solitude est un thème lié au philosophe législateur qui réunit en lui plusieurs traits typiques de l'homme moral, artiste, religieux et politique. Ainsi, la lecture scrupuleuse de ''Humain, trop humain'' donne une idée précise et développée de l'ensemble de la pensée de Nietzsche qui possède une unité et une continuité parfois occultées par le découpage en trois périodes de sa philosophie. Ce premier aphorisme nous donne à lui seul un plan relativement complet de toutes les œuvres de Nietzsche ; néanmoins, il faut garder à l'esprit qu'on ne trouve pas encore explicitement les grands concepts auxquels on réduit Nietzsche - Volonté de puissance, Éternel Retour, Surhomme. ==== § 2. Péché originel des philosophes ==== À l'analyse des sentiments et des idées qu'il propose, Nietzsche oppose le point de vue de tous les philosophes : ceux-ci décrivent l'homme comme une vérité éternelle. Pour répondre à la question de savoir ce qu'est l'homme, les philosophes analysent l'homme actuel, et pensent ainsi le connaître dans son ensemble, ce qui donnerait une clé pour la compréhension du monde en général : le monde est conçu comme originairement semblable à l'homme. Cette théorisation est ainsi une téléogie dont l'homme est le centre. Cette méthode a quelques présupposés que Nietzsche souligne particulièrement : *l'essence de l'homme est éternelle ; *elle est immuable au sein du devenir ; l'homme est en quelque sorte autonome, il est une réalité indépendante des choses ; *l'homme est mesure (Nietzsche fait allusion à l'étymologie de ce mot) absolue des choses ; thèse que Nietzsche reprend en disant que l'homme est l'animal qui fixe des valeurs, en croyant à l'objectivité de ces valeurs. Ces attributs traditionnels de l'essence de l'homme sont étonnants par leur démesure, car il montre qu'en réalité l'homme s'est pensé comme ''Dieu''. L'homme s'est ainsi pensé comme un être atemporel, dont l'essence n'est pas touchée par le monde et le devenir. La thèse opposée soutenue par Nietzsche introduit au contraire, comme nous l'avons signalé plus haut, le temps dans la connaissance que nous pouvons avoir de l'homme. Plus exactement, le temps est l'élément essentiel de cette connaissance. Nous ne pouvons pas sérieusement penser l'homme comme un être sans histoire, qui ne serait pas modifié en son fond de manière substantielle, dont l'existence n'aurait pas fondamentalement de dimension temporelle. La connaissance même que nous pouvons en avoir est soumise au devenir, au changement, au temps. Cette thèse a des conséquences qu'il s'agit d'établir correctement, et ''Humain, trop humain'' en est une étape importante qui sera largement poursuivie par toutes les œuvres suivantes de Nietzsche. Une première étape consiste à modifier le vocabulaire de la philosophie, modification qui va également exprimer un changement dans le champ de déploiement de la pensée : en effet, la dimension historique de l'homme se traduit dans cette aphorisme par l'emploi de mots et d'expressions qui s'opposent au vocabulaire métaphysique : influence, modeler, événement, évolution humaine, résultat d'un devenir. L'emploi de ces mots se fait dans les thèses suivantes : *d'une manière générale, l'homme est le résultat d'un devenir ; *ce devenir commence bien avant l'histoire connue, autrement dit nous ignorons totalement l'essentiel du devenir humain ; *l'histoire connue (à peine 4000 ans) présente une humanité relativement stable ; *les facultés humaines sont elles-mêmes un résultat ; *l'homme est influencé et modelé par la religion et la politique, parfois de manière très éphémère ; *il n'y a ni données éternelles ni vérités éternelles. De là découle cette double conclusion : pour connaître l'homme, il faut établir une philosophie historique ; cette philosophie historique suppose de la modestie. En ce qui concerne la philosophie historique, il s'agit d'étudier l'être homme en tant que tel, c'est-à-dire selon deux axes : *en analysant les composants de ses sentiments et de ses idées ; *en décrivant leur histoire. Cette méthode met particulièrement en valeur l'étude morale des hommes ; contrairement à la métaphysique qui étudie des réalités en apparence très éloignées de la réalité quotidienne de l'être humain, Nietzsche souhaite une science morale qui fasse l'observation de tous les petits courants de la vie (ce point est détaillé par exemple dans le ''Gai Savoir'' : le rythme des jours - fêtes, travail, repos - les problèmes de l'alimentation sur le moral, les conséquences de la vie en communauté, l'étude des différentes mœurs selon le travail, etc.). Quant à la modestie, elle va être illustrée par Nietzsche dans l'aphorisme suivant avec le cas de la vérité. ==== § 3. Estime des vérités discrètes ==== Nietzsche a signalé dès le premier aphorisme la conséquence psychologique radicale de la réévaluation de l'humanité d'un point de vue historique. Sous une forme interrogative, il se demande en effet : faut-il être inhumain (alors que jusque là les philosophes furent trop humains) pour ''voir'' l'homme (ses sentiments et ses idées) et le monde (dénué de finalité) du point de vue de la philosophie historique ? L'aphorisme trois apporte quelques précisions en abordant le problème de la vérité. Pourtant, il y a ici un problème : s'il nous faut étudier l'homme d'un point de vue historique, celui qui l'étudie doit ''relativiser'' sa connaissance. En effet, Nietzsche vient de l'affirmer : ''il n'y a pas de vérité éternelle.'' Dès lors, peut-il y avoir des ''vérités discrètes'' ? Or, ici, au lieu de répondre à cette question qui vient naturellement à l'esprit, Nietzsche se dirige immédiatement vers une évaluation ''psychologique'' de la vérité. Ce sont d'autres aphorismes de cette même partie qui répondront à cette question du scepticisme de la connaissance liée à la question de la possibilité d'une véritable réfutation de la métaphysique. Mais nous pouvons dire cependant que Nietzsche commence déjà à répondre à cette question, en purifiant le concept de vérité de ses dimensions psychologiques injustifiées. Autrement dit, il dégage la question de la vérité de ce qui empêchait d'en poser véritablement la question, et nous avertit implicitement : pour comprendre exactement la philosophie historique, il faut commencer par admettre que les qualités humaines de la vérité sont égarantes et obscurcissent le problème. Ainsi, avant d'en venir à la métaphysique proprement dite, le regard doit se purifier, la pensée doit être claire. Il faut désobstruer ce chemin pollué par l'histoire de la pensée (philosophique, religieuse, morale), chemin qui mène au problème en tant que tel. Nietzsche commence par souligner le caractère modeste des vérités découvertes par une méthode rigoureuse. Ces vérités s'opposent aux conséquences psychologiques des erreurs humaines ; ces erreurs sont en effet : *éblouissantes, enthousiasmante ; *consolatrices et dispensatrices de bonheur ; *belles. Ces qualités sont à rapprocher du platonisme : le désir du bien qui fait la passion philosophique en excitant la recherche des vrais réalités, l'éclat et la beauté de la vérité, des Idées éternelles, la perspective d'une vie meilleure pour les justes évoquée dans le ''Phédon'', etc. Par opposition, on comprend que les vérités que Nietzsche veut soutenir risques de paraître ternes, qu'elles n'existent vraisemblablement pas l'intérêt, et qu'elles ne soulèvent pas les masses ; mais elles sont aussi irritantes, laides et repoussantes, tragiques. Nietzsche rejettera néanmoins plus loin toutes ses qualifications parce ce ne sont jamais que des mystifications, qu'il s'agisse d'optimisme ou de pessimisme. Ces qualifications ne pas en réalité l'essentiel de cet aphorisme, mais il s'agit plus fondamentalement de la modification du jugement à l'égard des vérités, modification qui est le résultat d'une spiritualisation et d'une plus grande intériorité des formes de notre vie. À ce stade de la réflexion, Nietzsche énonce le mot de toute sa pensée : intériorité. C'est ici notre thèse interprétative : toute la philosophie de Nietzsche est centrée sur le progrès de l'intériorisation des activités humaines, intériorisation qui est un approfondissement de la vie de l'esprit, un enrichissement et embellissement de soi. Tout est alors résumé par cette formule : ''[...] combien un simple regard où brille l'esprit doit maintenant avoir pour nous tous plus de valeur que la plus belle proportion, que la plus sublime architecture.'' L'homme est œuvre d'art, la plus sublime. La connaissance historique de l'homme proposée par Nietzsche va dans ce sens. Ainsi, paradoxalement, alors que les vérités discrètes sont d'abord jugées laides, par une plus grande intellectualisation l'homme devient lui-même : *de plus en plus beau (harmonie, éclat de l’œil intelligent), et même sublime (idée de grandeur, de noblesse, de force et de puissance) ; *de plus en plus profond et vaste (il faut s'assimiler toute la connaissance dira Nietzsche dans le ''Gai Savoir'') ; *de plus en plus riche. Ce processus est selon Nietzsche un enlaidissement aux yeux des époques antérieures. ==== Origine et nature des erreurs de la métaphysique ==== Ce problème capital pour la suite est abordé en 2, 4, 5, 7, 8, 9, 10, 11, etc. Pourquoi des explications métaphysiques ? *le langage comme pseudo-science ===== L'interprétation du rêve ===== Dans l'ensemble de l'œuvre de Nietzsche, le rêve a une place importante et multiforme. Dans cette première partie de ''Humain, trop humain'', le rêve est l'objet des aphorismes 5, 12 et 13. L'aphorisme 13 présente une explication psychologique du rêve, appuyée par des aspects physiologiques. L'aphorisme 12 a une importance particulière, car il porte sur les différentes strates affectives et cognitives de l'homme qui justifient l'approche historique de l'homme proposée par Nietzsche dans le l'aphorisme 1. Enfin, l'aphorisme 5 montre que le rêve a rendu possible l'idée d'une seconde réalité. On remarque d'emblée que l'analyse du rêve recoupe toutes les analyses de la métaphysique ; bien plus, l'interprétation du rêve est une explication intégrale (conditions de possibilités, raisonnements logiques, fonction fabulatrice, etc.) de la pensée métaphysique et de toutes les inventions de l'esprit humain. Mais cette interprétation a également une dimension morale de première importante. Nous allons analyser à présent l'ensemble de ces dimensions. ==== Réévaluer le problème de la connaissance ==== *la place de l'illogique *la nécessité de l'erreur ==== Le problème de la finalité de la connaissance ==== *la philosophie est-elle tragique ? [[Catégorie:Commentaire philosophique]] [[Catégorie:Nietzsche : Introduction à sa philosophie (livre)]] ffm63fsc9appgy7ewd360ss0v4t1p9b Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites 0 3895 764993 674994 2026-04-25T07:53:17Z PandaMystique 119061 PandaMystique a déplacé la page [[Ecce Homo - Humain, trop humain et deux suites]] vers [[Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites]] 674994 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Ecce Homo]] - [[Philosophie/Nietzsche/Humain, trop humain|Humain, trop humain]]</div> |- | width="33%"| | width="34%" align="center"|'''[[Philosophie/Nietzsche|Friedrich Nietzsche]]''' | width="33%" align="right"| |} L'explication par Nietzsche lui-même de la genèse de ''Humain, trop humain'' est l'une des plus longues de ''Ecce Homo''. Cette longueur se justifie par le tournant que l’œuvre représente tant sur le plan philosophique que sur le plan biographique. À ce titre, Nietzsche nous livre des considérations qui s'entremêlent (la pensée n'est ainsi pas séparable de la vie), mais que l'on peut distinguer artificiellement pour s'en donner plus facilement une représentation aussi exacte que possible. Toutes ses considérations se ramènent à la nécessité de reprendre possession de soi afin de réaliser une tâche propre. Cette nécessité était déjà évoquée dans la troisième ''Considérations Inactuelles''. En premier lieu, Nietzsche explique que ce livre fut une libération de l'idéalisme, libération qui fait l'esprit libre. Le sous-titre de ''Humain, trop humain'' est en effet : ''Un livre pour esprit libre''. Le processus de libération est décrit comme une crise, par laquelle Nietzsche s'est dépouillé de tout ce qui n'était pas lui. Il précisera un peu plus loin cette pensée, mais il donne une indication essentielle : ce dont il se dépouille, d'une part est gelé par le mépris. Ce thème du gel est déjà développé dans la première partie de ''Humain, trop humain.'' D'autre part, ce qui est gelé, c'est : le génie, le saint, le héros, la pitié. Or, par ces termes, on comprend que Nietzsche vise ici Schopenhauer, et - de ce fait - Wagner. C'est justement du compositeur dont il va être question, ce qui implique des considérations d'ordre biographique, notamment parce que Nietzsche a cessé toute relation avec Wagner à l'époque de la publication de ''Humain, trop humain''. Ce dernier livre devient l'expression d'une opposition irréductible avec ''Parsifal'' et la culture allemande. De plus, dans la partie intitulé "le voyageur et son ombre", Nietzsche traduit ici sa propre expérience de la décadence. '''[[Wikisource:Ecce Homo#Humain, trop humain et deux suites|Lire ce texte]]''' [[Catégorie:Commentaire philosophique]] 8r11gtk1apjn1aqtyur3n44ah7jl16a 764995 764993 2026-04-25T07:53:41Z PandaMystique 119061 764995 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Ecce Homo]] - [[Nietzsche : Introduction à sa philosophie/Humain, trop humain|Humain, trop humain]]</div> |- | width="33%"| | width="34%" align="center"|'''[[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]]''' | width="33%" align="right"| |} L'explication par Nietzsche lui-même de la genèse de ''Humain, trop humain'' est l'une des plus longues de ''Ecce Homo''. Cette longueur se justifie par le tournant que l’œuvre représente tant sur le plan philosophique que sur le plan biographique. À ce titre, Nietzsche nous livre des considérations qui s'entremêlent (la pensée n'est ainsi pas séparable de la vie), mais que l'on peut distinguer artificiellement pour s'en donner plus facilement une représentation aussi exacte que possible. Toutes ses considérations se ramènent à la nécessité de reprendre possession de soi afin de réaliser une tâche propre. Cette nécessité était déjà évoquée dans la troisième ''Considérations Inactuelles''. En premier lieu, Nietzsche explique que ce livre fut une libération de l'idéalisme, libération qui fait l'esprit libre. Le sous-titre de ''Humain, trop humain'' est en effet : ''Un livre pour esprit libre''. Le processus de libération est décrit comme une crise, par laquelle Nietzsche s'est dépouillé de tout ce qui n'était pas lui. Il précisera un peu plus loin cette pensée, mais il donne une indication essentielle : ce dont il se dépouille, d'une part est gelé par le mépris. Ce thème du gel est déjà développé dans la première partie de ''Humain, trop humain.'' D'autre part, ce qui est gelé, c'est : le génie, le saint, le héros, la pitié. Or, par ces termes, on comprend que Nietzsche vise ici Schopenhauer, et - de ce fait - Wagner. C'est justement du compositeur dont il va être question, ce qui implique des considérations d'ordre biographique, notamment parce que Nietzsche a cessé toute relation avec Wagner à l'époque de la publication de ''Humain, trop humain''. Ce dernier livre devient l'expression d'une opposition irréductible avec ''Parsifal'' et la culture allemande. De plus, dans la partie intitulé "le voyageur et son ombre", Nietzsche traduit ici sa propre expérience de la décadence. '''[[Wikisource:Ecce Homo#Humain, trop humain et deux suites|Lire ce texte]]''' [[Catégorie:Commentaire philosophique]] ezg4jtjvnel6kfrv9zh7am8kv618esb 765000 764995 2026-04-25T08:04:20Z PandaMystique 119061 765000 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Ecce Homo]] - [[Nietzsche : Introduction à sa philosophie/Humain, trop humain|Humain, trop humain]]</div> |- | width="33%"| | width="34%" align="center"|'''[[Nietzsche : Introduction à sa philosophie|Friedrich Nietzsche]]''' | width="33%" align="right"| |} L'explication par Nietzsche lui-même de la genèse de ''Humain, trop humain'' est l'une des plus longues de ''Ecce Homo''. Cette longueur se justifie par le tournant que l’œuvre représente tant sur le plan philosophique que sur le plan biographique. À ce titre, Nietzsche nous livre des considérations qui s'entremêlent (la pensée n'est ainsi pas séparable de la vie), mais que l'on peut distinguer artificiellement pour s'en donner plus facilement une représentation aussi exacte que possible. Toutes ses considérations se ramènent à la nécessité de reprendre possession de soi afin de réaliser une tâche propre. Cette nécessité était déjà évoquée dans la troisième ''Considérations Inactuelles''. En premier lieu, Nietzsche explique que ce livre fut une libération de l'idéalisme, libération qui fait l'esprit libre. Le sous-titre de ''Humain, trop humain'' est en effet : ''Un livre pour esprit libre''. Le processus de libération est décrit comme une crise, par laquelle Nietzsche s'est dépouillé de tout ce qui n'était pas lui. Il précisera un peu plus loin cette pensée, mais il donne une indication essentielle : ce dont il se dépouille, d'une part est gelé par le mépris. Ce thème du gel est déjà développé dans la première partie de ''Humain, trop humain.'' D'autre part, ce qui est gelé, c'est : le génie, le saint, le héros, la pitié. Or, par ces termes, on comprend que Nietzsche vise ici Schopenhauer, et - de ce fait - Wagner. C'est justement du compositeur dont il va être question, ce qui implique des considérations d'ordre biographique, notamment parce que Nietzsche a cessé toute relation avec Wagner à l'époque de la publication de ''Humain, trop humain''. Ce dernier livre devient l'expression d'une opposition irréductible avec ''Parsifal'' et la culture allemande. De plus, dans la partie intitulé "le voyageur et son ombre", Nietzsche traduit ici sa propre expérience de la décadence. '''[[Wikisource:Ecce Homo#Humain, trop humain et deux suites|Lire ce texte]]''' [[Catégorie:Commentaire philosophique]] [[Catégorie:Nietzsche : Introduction à sa philosophie (livre)]] cly3c9kaxzgdqct7khferq9n0dbml48 Philosophie 0 5270 764832 764828 2026-04-24T12:04:51Z ~2026-25114-99 123599 764832 wikitext text/x-wiki <!-- ══════════════════════════════════════════════ EN-TÊTE ══════════════════════════════════════════════ --> <div style="padding: 6px 0 18px; border-bottom: 2px solid #1a2230; margin-bottom: 22px;"> <div style="font-size: 1.6em; font-weight: 600; color: #1a2230; line-height: 1.2; margin-bottom: 4px;">Classification de la philosophie</div> <div style="font-size: 0.9em; color: #555e6b; line-height: 1.5;">Portail raisonné des livres, manuels et dictionnaires de philosophie sur Wikilivres. Les entrées sont rangées en cinq grandes aires, subdivisées selon la taxonomie standard des champs philosophiques.</div> </div> {{PhiloRecherche}} <!-- ══════════════════════════════════════════════ ŒUVRE À LA UNE (Idée 7) ══════════════════════════════════════════════ --> <div style="background: #f4ebe0; border: 1px solid #c8b898; border-radius: 8px; padding: 20px 24px; margin: 22px 0 26px;"> <table style="width: 100%; border-collapse: collapse;"> <tr> <td style="width: 76px; vertical-align: top; padding-right: 20px;"> <div style="background: #9a7840; color: #f4ebe0; text-align: center; padding: 34px 4px; font-size: 13px; letter-spacing: 0.15em; font-weight: 500; border-radius: 2px;">1641</div> </td> <td style="vertical-align: top;"> <div style="font-size: 0.72em; letter-spacing: 0.25em; text-transform: uppercase; color: #9a7840; font-weight: 600; margin-bottom: 6px;">Œuvre à la une</div> <div style="font-size: 1.3em; font-weight: 600; color: #1a2230; line-height: 1.2; margin-bottom: 3px;">''[[Méditations métaphysiques|Méditations métaphysiques]]''</div> <div style="font-size: 0.92em; color: #7a6238; font-style: italic; margin-bottom: 10px;">René Descartes</div> <div style="font-size: 0.9em; color: #4a5568; line-height: 1.65;">Six méditations qui fondent la connaissance sur le doute hyperbolique et la certitude du cogito. Le commentaire de l'œuvre est disponible sur Wikilivres.</div> <div style="margin-top: 10px; font-size: 0.88em;">[[Méditations métaphysiques|Lire le commentaire →]]</div> </td> </tr> </table> </div> <!-- ══════════════════════════════════════════════ CLUSTER 1 — MÉTAPHYSIQUE ET ÉPISTÉMOLOGIE (bleu ardoise) ══════════════════════════════════════════════ --> <div style="margin: 26px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Métaphysique et épistémologie</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Philosophie/Théorie de la connaissance|Théorie de la connaissance]] <span style="color: #8a94a3; font-weight: 400;">(8)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie de la connaissance/Une définition traditionnelle|Définition traditionnelle]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie de la connaissance/Le Problème de Gettier|Problème de Gettier]]</span><br/> [[Dictionnaire de philosophie/Vérité|Vérité]]<br/> [[Dictionnaire de philosophie/Certitude|Certitude]]<br/> [[Dictionnaire de philosophie/A priori|A priori]]<br/> [[Dictionnaire de philosophie/Abduction|Abduction]]<br/> [[Dictionnaire de philosophie/Agnosticisme|Agnosticisme]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Métaphysique <span style="color: #8a94a3; font-weight: 400;">(12)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Absolu|Absolu]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Acte/Puissance|Acte et Puissance]]</span><br/> [[Dictionnaire de philosophie/Accident|Accident]]<br/> [[Dictionnaire de philosophie/Attribut|Attribut]]<br/> [[Dictionnaire de philosophie/Atomisme|Atomisme]]<br/> [[Dictionnaire de philosophie/Déterminisme|Déterminisme]]<br/> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Philosophie/Philosophie de l'esprit|Philosophie de l'esprit]] <span style="color: #8a94a3; font-weight: 400;">(14)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie de l'esprit/Introduction|Introduction]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie de l'esprit/Ce que Marie ne savait pas|Ce que Marie ne savait pas]]</span><br/> [[Dictionnaire de philosophie/Conscience|Conscience]]<br/> [[Dictionnaire de philosophie/Âme|Âme]] </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie du langage <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Langage|Langage]]</span><br/> [[Dictionnaire de philosophie/Analogie|Analogie]]<br/> [[Dictionnaire de philosophie/Argument|Argument]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie de l'action <span style="color: #8a94a3; font-weight: 400;">(5)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Action|Action]]<br/> [[Dictionnaire de philosophie/Aboulie|Aboulie]]<br/> [[Dictionnaire de philosophie/Altruisme|Altruisme]]<br/> [[Dictionnaire de philosophie/Authenticité|Authenticité]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Liberté|Liberté]]</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie de la religion <span style="color: #8a94a3; font-weight: 400;">(5)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Religion|Religion]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Athéisme|Athéisme]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Déisme|Déisme]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Monothéisme|Monothéisme]]</span><br/> [[Dictionnaire de philosophie/Panthéisme|Panthéisme]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 2 — THÉORIE DE LA VALEUR (argile toscane) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Théorie de la valeur</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Éthique normative <span style="color: #8a94a3; font-weight: 400;">(9)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Morale|Morale]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Devoir|Devoir]]</span><br/> [[Dictionnaire de philosophie/Bonheur|Bonheur]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Liberté|Liberté (terminale)]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Ataraxie|Ataraxie]]</span><br/> [[Dictionnaire de philosophie/Amour|Amour]]<br/> [[Dictionnaire de philosophie/Amitié|Amitié]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Éthique appliquée <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Avortement|Avortement (éthique)]]<br/> [[Dictionnaire de philosophie/Animal|Animal (droits)]]<br/> [[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Esthétique <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Art|Art]]</span><br/> [[Dictionnaire de philosophie/Art|Art (dictionnaire)]]<br/> [[Dictionnaire de philosophie/Art (introduction)|Art — introduction]]<br/> [[Dictionnaire de philosophie/Art et Vérité|Art et vérité]] </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie sociale et politique <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/État|État]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Justice|Justice]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Travail|Travail]]</span><br/> [[Dictionnaire de philosophie/Absolutisme|Absolutisme]]<br/> [[Dictionnaire de philosophie/Anarchisme|Anarchisme]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Aliénation|Aliénation]]</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Autrui et reconnaissance <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Autrui|Autrui]]</span><br/> [[Dictionnaire de philosophie/Altérité|Altérité]]<br/> [[Dictionnaire de philosophie/Autorité|Autorité]]<br/> [[Dictionnaire de philosophie/Autonomie|Autonomie]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Métaéthique <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Absurde|Absurde]]<br/> [[Dictionnaire de philosophie/Affection|Affection]]<br/> [[Dictionnaire de philosophie/Angoisse|Angoisse]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 3 — SCIENCE, LOGIQUE ET MATHÉMATIQUES (vert sauge) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Science, logique et mathématiques</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Logique <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/A (logique)|A (logique)]]<br/> [[Dictionnaire de philosophie/Abstraction|Abstraction]]<br/> [[Dictionnaire de philosophie/Antinomie|Antinomie]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Aporie|Aporie]]</span><br/> [[Dictionnaire de philosophie/Axiome|Axiome]]<br/> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie des sciences <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie et expérience|Théorie et expérience]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Science|Science]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Technique|Technique]]</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie du vivant <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Nature|Nature]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Vivant|Vivant]]</span><br/> [[Dictionnaire de philosophie/Animal|Animal]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 4 — HISTOIRE DE LA PHILOSOPHIE (parchemin vieilli) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]] <span style="color: #8a94a3; font-weight: 400; font-size: 0.92em;">(30)</span></div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Antiquité <span style="color: #8a94a3; font-weight: 400;">(14)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">VI<sup>e</sup>&nbsp;av.&nbsp;— V<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="font-weight: 500; color: #1a2230;">Présocratiques</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Thalès de Milet|Thalès de Milet]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Anaximandre de Milet|Anaximandre]]</span></span><br/> <span style="padding-left: 10px;">[[Dictionnaire de philosophie/Anaxagore|Anaxagore]]</span><br/> <span style="padding-left: 10px;">[[Dictionnaire de philosophie/Empédocle|Empédocle]]</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Présocratiques/Liste des Présocratiques|Liste complète]]</span></span><br/> <span style="color: #1a2230; font-weight: 500;">[[Pour lire Platon|Platon]]</span><br/> [[Dictionnaire de philosophie/Aristote|Aristote]]<br/> <span style="font-weight: 500; color: #1a2230;">Philosophie hellénistique</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Commentaire philosophique/Lettre à Ménécée|Épicure]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Ataraxie|Stoïcisme]]</span></span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie médiévale <span style="color: #8a94a3; font-weight: 400;">(0)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">V<sup>e</sup>&nbsp;— XV<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #8a94a3; line-height: 1.85; font-style: italic;"> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Augustin<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Anselme<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Thomas d'Aquin<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Averroès<br/> <span style="font-size: 0.85em; color: #a8aeb8;">— pages à rédiger</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie classique <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">XVI<sup>e</sup>&nbsp;— XVIII<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Méditations métaphysiques|Descartes — Méditations]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Commentaire du passage à propos de l'Homme esclave du divertissement|Pascal — Divertissement]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Commentaire de l'Éthique|Spinoza — Éthique]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Vocabulaire/David Hume|Hume]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Vocabulaire/Kant|Kant]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes|Rousseau — Inégalité]]</span> </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie contemporaine <span style="color: #8a94a3; font-weight: 400;">(5)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">XIX<sup>e</sup>&nbsp;— XXI<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche|Nietzsche]]</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La culture grecque|Culture grecque]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La culture moderne|Culture moderne]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La métaphysique|Métaphysique]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La moralité des mœurs|Moralité des mœurs]]</span></span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Courants du XX<sup>e</sup> siècle <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">Écoles et traditions</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie analytique|Philosophie analytique]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Existence et temps|Existentialisme]]</span><br/> [[Dictionnaire de philosophie/Dasein|Phénoménologie / Dasein]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Traditions non occidentales <span style="color: #8a94a3; font-weight: 400;">(2)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">Afrique, Amériques</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Philosophie africaine|Philosophie africaine]]<br/> [[Dictionnaire de philosophie/Argentine (Philosophie)|Argentine — XX<sup>e</sup> siècle]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 5 — OUVRAGES DE RÉFÉRENCE (gris encre) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Ouvrages de référence et pédagogiques</div> </div> <!-- Autres ouvrages --> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Manuel de terminale de philosophie|Manuel de terminale]] <span style="color: #8a94a3; font-weight: 400;">(26)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> Éthique &amp; action <span style="color: #8a94a3;">(4)</span><br/> Esprit &amp; conscience <span style="color: #8a94a3;">(4)</span><br/> Connaissance &amp; vérité <span style="color: #8a94a3;">(5)</span><br/> Monde &amp; société <span style="color: #8a94a3;">(4)</span><br/> Culture &amp; sens <span style="color: #8a94a3;">(6)</span><br/> Méthode &amp; ressources <span style="color: #8a94a3;">(3)</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[:Catégorie:Commentaire philosophique|Commentaires d'œuvres]] <span style="color: #8a94a3; font-weight: 400;">(20)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> <span style="font-weight: 500;">[[Commentaire philosophique/Lettre à Ménécée|Lettre à Ménécée]]</span> <span style="color: #8a94a3;">·</span> Épicure<br/> <span style="font-weight: 500;">[[Méditations métaphysiques|Méditations]]</span> <span style="color: #8a94a3;">·</span> Descartes<br/> <span style="font-weight: 500;">[[Commentaire de l'Éthique|Éthique]]</span> <span style="color: #8a94a3;">·</span> Spinoza<br/> <span style="font-weight: 500;">[[Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes|Inégalité]]</span> <span style="color: #8a94a3;">·</span> Rousseau<br/> <span style="font-weight: 500;">[[Philosophie/Commentaire du passage à propos de l'Homme esclave du divertissement|Divertissement]]</span> <span style="color: #8a94a3;">·</span> Pascal </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; margin-bottom: 6px;">[[:Catégorie:Vocabulaire philosophique|Vocabulaires]] <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> <span style="font-weight: 500;">[[Pour lire Platon/Vocabulaire|Platon]]</span><br/> <span style="font-weight: 500;">[[Philosophie/Vocabulaire/David Hume|David Hume]]</span><br/> <span style="font-weight: 500;">[[Philosophie/Vocabulaire/Kant|Kant]]</span> </div> <div style="height: 1px; background: #e2e8ef; margin: 10px 0;"></div> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; margin-bottom: 10px;">[[Philosophie/Une brève introduction|Une brève introduction]] </div> </td> </tr> </table> <!-- Dictionnaire — pleine largeur --> <div style="background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 14px 16px 16px; margin-bottom: 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Dictionnaire de philosophie|Dictionnaire de philosophie]] <span style="color: #8a94a3; font-weight: 400;">(35)</span></div> <table style="width: 100%; border-collapse: separate; border-spacing: 5px 5px;"> <tr> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/A|A]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/B|B]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/C|C]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/D|D]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/E|E]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/F|F]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/G|G]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/H|H]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/I|I]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/J|J]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/K|K]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/L|L]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/M|M]]</td> </tr> <tr> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/N|N]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/O|O]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/P|P]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Q|Q]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/R|R]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/S|S]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/T|T]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/U|U]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/V|V]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/W|W]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/X|X]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Y|Y]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Z|Z]]</td> </tr> </table> </div> <br> <!-- ══════════════════════════════════════════════ PIED DE PAGE (+ légende de convention, idée 5) ══════════════════════════════════════════════ --> <div style="margin-top: 10px; padding: 14px 0 4px; border-top: 1px solid #d4dae2; font-size: 0.86em; color: #555e6b;"> <div style="margin-bottom: 6px;"><span style="font-weight: 600; color: #1a2230;">Consulter ailleurs</span> &nbsp;·&nbsp; [[w:Philosophie|Wikipédia]] &nbsp;·&nbsp; [[wikt:philosophie|Wiktionnaire]] &nbsp;·&nbsp; [[v:Philosophie|Wikiversité]] &nbsp;·&nbsp; [[s:Portail:Philosophie|Wikisource]]</div> <div style="margin-bottom: 10px;"><span style="font-weight: 600; color: #1a2230;">Catégories sources</span> &nbsp;·&nbsp; [[:Catégorie:Discipline philosophique|Disciplines]] &nbsp;·&nbsp; [[:Catégorie:Histoire de la philosophie|Histoire]] &nbsp;·&nbsp; [[:Catégorie:Philosophe|Philosophes]] &nbsp;·&nbsp; [[:Catégorie:Dictionnaire de philosophie (livre)|Dictionnaire]] &nbsp;·&nbsp; [[:Catégorie:Manuel de terminale de philosophie (livre)|Manuel]] &nbsp;·&nbsp; [[:Catégorie:Commentaire philosophique|Commentaires]]</div> </div> </div> [[Catégorie:Philosophie|*]] oiwvot8lx6cnkk1v6h5winj4h0ziv4h 764922 764832 2026-04-25T06:22:36Z PandaMystique 119061 764922 wikitext text/x-wiki <!-- ══════════════════════════════════════════════ EN-TÊTE ══════════════════════════════════════════════ --> <div style="padding: 6px 0 18px; border-bottom: 2px solid #1a2230; margin-bottom: 22px;"> <div style="font-size: 1.6em; font-weight: 600; color: #1a2230; line-height: 1.2; margin-bottom: 4px;">Classification de la philosophie</div> <div style="font-size: 0.9em; color: #555e6b; line-height: 1.5;">Portail raisonné des livres, manuels et dictionnaires de philosophie sur Wikilivres. Les entrées sont rangées en cinq grandes aires, subdivisées selon la taxonomie standard des champs philosophiques.</div> </div> {{PhiloRecherche}} <!-- ══════════════════════════════════════════════ ŒUVRE À LA UNE (Idée 7) ══════════════════════════════════════════════ --> <div style="background: #f4ebe0; border: 1px solid #c8b898; border-radius: 8px; padding: 20px 24px; margin: 22px 0 26px;"> <table style="width: 100%; border-collapse: collapse;"> <tr> <td style="width: 76px; vertical-align: top; padding-right: 20px;"> <div style="background: #9a7840; color: #f4ebe0; text-align: center; padding: 34px 4px; font-size: 13px; letter-spacing: 0.15em; font-weight: 500; border-radius: 2px;">1641</div> </td> <td style="vertical-align: top;"> <div style="font-size: 0.72em; letter-spacing: 0.25em; text-transform: uppercase; color: #9a7840; font-weight: 600; margin-bottom: 6px;">Œuvre à la une</div> <div style="font-size: 1.3em; font-weight: 600; color: #1a2230; line-height: 1.2; margin-bottom: 3px;">''[[Méditations métaphysiques|Méditations métaphysiques]]''</div> <div style="font-size: 0.92em; color: #7a6238; font-style: italic; margin-bottom: 10px;">René Descartes</div> <div style="font-size: 0.9em; color: #4a5568; line-height: 1.65;">Six méditations qui fondent la connaissance sur le doute hyperbolique et la certitude du cogito. Le commentaire de l'œuvre est disponible sur Wikilivres.</div> <div style="margin-top: 10px; font-size: 0.88em;">[[Méditations métaphysiques|Lire le commentaire →]]</div> </td> </tr> </table> </div> <!-- ══════════════════════════════════════════════ CLUSTER 1 — MÉTAPHYSIQUE ET ÉPISTÉMOLOGIE (bleu ardoise) ══════════════════════════════════════════════ --> <div style="margin: 26px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Métaphysique et épistémologie</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Philosophie/Théorie de la connaissance|Théorie de la connaissance]] <span style="color: #8a94a3; font-weight: 400;">(11)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie de la connaissance/Une définition traditionnelle|Définition traditionnelle]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie de la connaissance/Le Problème de Gettier|Problème de Gettier]]</span><br/> [[Dictionnaire de philosophie/Vérité|Vérité]]<br/> [[Dictionnaire de philosophie/Certitude|Certitude]]<br/> [[Dictionnaire de philosophie/A priori|A priori]]<br/> [[Dictionnaire de philosophie/Abduction|Abduction]]<br/> [[Dictionnaire de philosophie/Acatalépsie|Acatalépsie]]<br/> [[Dictionnaire de philosophie/Agnosticisme|Agnosticisme]]<br/> [[Dictionnaire de philosophie/Empirisme|Empirisme]]<br/> [[Dictionnaire de philosophie/Épistémologie|Épistémologie]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Métaphysique <span style="color: #8a94a3; font-weight: 400;">(12)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Absolu|Absolu]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Acte/Puissance|Acte et Puissance]]</span><br/> [[Dictionnaire de philosophie/Accident|Accident]]<br/> [[Dictionnaire de philosophie/Attribut|Attribut]]<br/> [[Dictionnaire de philosophie/Atomisme|Atomisme]]<br/> [[Dictionnaire de philosophie/Déterminisme|Déterminisme]]<br/> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Philosophie/Philosophie de l'esprit|Philosophie de l'esprit]] <span style="color: #8a94a3; font-weight: 400;">(14)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie de l'esprit/Introduction|Introduction]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie de l'esprit/Ce que Marie ne savait pas|Ce que Marie ne savait pas]]</span><br/> [[Dictionnaire de philosophie/Conscience|Conscience]]<br/> [[Dictionnaire de philosophie/Âme|Âme]]<br/> [[Dictionnaire de philosophie/Dualisme|Dualisme]]<br/> [[Dictionnaire de philosophie/Émergence|Émergence]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Sujet|Sujet]]</span> </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie du langage <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Langage|Langage]]</span><br/> [[Dictionnaire de philosophie/Analogie|Analogie]]<br/> [[Dictionnaire de philosophie/Argument|Argument]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie de l'action <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Action|Action]]<br/> [[Dictionnaire de philosophie/Aboulie|Aboulie]]<br/> [[Dictionnaire de philosophie/Altruisme|Altruisme]]<br/> [[Dictionnaire de philosophie/Authenticité|Authenticité]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Désir|Désir]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Liberté|Liberté]]</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #3a5a80; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie de la religion <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Religion|Religion]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Athéisme|Athéisme]]</span><br/> [[Dictionnaire de philosophie/Déisme|Déisme]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Monothéisme|Monothéisme]]</span><br/> [[Dictionnaire de philosophie/Panthéisme|Panthéisme]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 2 — THÉORIE DE LA VALEUR (argile toscane) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Théorie de la valeur</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Éthique normative <span style="color: #8a94a3; font-weight: 400;">(10)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Morale|Morale]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Devoir|Devoir]]</span><br/> [[Dictionnaire de philosophie/Bonheur|Bonheur]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Liberté|Liberté (terminale)]]</span><br/> [[Dictionnaire de philosophie/Ataraxie|Ataraxie]]<br/> [[Dictionnaire de philosophie/Amour|Amour]]<br/> [[Dictionnaire de philosophie/Amitié|Amitié]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Éthique appliquée <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Avortement|Avortement (éthique)]]<br/> [[Dictionnaire de philosophie/Animal|Animal (droits)]]<br/> [[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Esthétique <span style="color: #8a94a3; font-weight: 400;">(5)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Art|Art]]</span><br/> [[Dictionnaire de philosophie/Art|Art (dictionnaire)]]<br/> [[Dictionnaire de philosophie/Art (introduction)|Art — introduction]]<br/> [[Dictionnaire de philosophie/Art et Vérité|Art et vérité]]<br/> </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie sociale et politique <span style="color: #8a94a3; font-weight: 400;">(7)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/État|État]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Justice|Justice]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Travail|Travail]]</span><br/> [[Dictionnaire de philosophie/Absolutisme|Absolutisme]]<br/> [[Dictionnaire de philosophie/Anarchisme|Anarchisme]]<br/> [[Dictionnaire de philosophie/Aliénation|Aliénation]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Autrui et reconnaissance <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Autrui|Autrui]]</span><br/> [[Dictionnaire de philosophie/Altérité|Altérité]]<br/> [[Dictionnaire de philosophie/Autorité|Autorité]]<br/> [[Dictionnaire de philosophie/Autonomie|Autonomie]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #a86b3d; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Métaéthique <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Absurde|Absurde]]<br/> [[Dictionnaire de philosophie/Affection|Affection]]<br/> [[Dictionnaire de philosophie/Angoisse|Angoisse]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 3 — SCIENCE, LOGIQUE ET MATHÉMATIQUES (vert sauge) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Science, logique et mathématiques</div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Logique <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/A (logique)|A (logique)]]<br/> [[Dictionnaire de philosophie/Abstraction|Abstraction]]<br/> [[Dictionnaire de philosophie/Antinomie|Antinomie]]<br/> [[Dictionnaire de philosophie/Aporie|Aporie]]<br/> [[Dictionnaire de philosophie/Axiome|Axiome]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie des sciences <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Théorie et expérience|Théorie et expérience]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Science|Science]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Technique|Technique]]</span><br/> [[Dictionnaire de philosophie/Épistémologie|Épistémologie]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #5a7a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie du vivant <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Nature|Nature]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Manuel de terminale de philosophie/Vivant|Vivant]]</span><br/> [[Dictionnaire de philosophie/Animal|Animal]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 4 — HISTOIRE DE LA PHILOSOPHIE (parchemin vieilli) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]] <span style="color: #8a94a3; font-weight: 400; font-size: 0.92em;">(33)</span></div> </div> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Antiquité <span style="color: #8a94a3; font-weight: 400;">(15)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">VI<sup>e</sup>&nbsp;av.&nbsp;— V<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="font-weight: 500; color: #1a2230;">Présocratiques</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Thalès de Milet|Thalès de Milet]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Anaximandre de Milet|Anaximandre]]</span></span><br/> <span style="padding-left: 10px;">[[Dictionnaire de philosophie/Anaxagore|Anaxagore]]</span><br/> <span style="padding-left: 10px;">[[Dictionnaire de philosophie/Empédocle|Empédocle]]</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Présocratiques/Liste des Présocratiques|Liste complète]]</span></span><br/> <span style="color: #1a2230; font-weight: 500;">[[Pour lire Platon|Platon]]</span><br/> [[Dictionnaire de philosophie/Aristote|Aristote]]<br/> <span style="font-weight: 500; color: #1a2230;">Philosophie hellénistique</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Commentaire philosophique/Lettre à Ménécée|Épicure]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Ataraxie|Stoïcisme]]</span></span><br/> <span style="padding-left: 10px;">[[Dictionnaire de philosophie/Acatalépsie|Scepticisme — Acatalépsie]]</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie médiévale <span style="color: #8a94a3; font-weight: 400;">(0)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">V<sup>e</sup>&nbsp;— XV<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #8a94a3; line-height: 1.85; font-style: italic;"> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Augustin<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Anselme<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Thomas d'Aquin<br/> <span style="color: #c8bc8a; font-style: normal;">○</span>&nbsp;Averroès<br/> <span style="font-size: 0.85em; color: #a8aeb8;">— pages à rédiger</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie classique <span style="color: #8a94a3; font-weight: 400;">(6)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">XVI<sup>e</sup>&nbsp;— XVIII<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Méditations métaphysiques|Descartes — Méditations]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Commentaire du passage à propos de l'Homme esclave du divertissement|Pascal — Divertissement]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Commentaire de l'Éthique|Spinoza — Éthique]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Vocabulaire/David Hume|Hume]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Vocabulaire/Kant|Kant]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes|Rousseau — Inégalité]]</span> </div> </td> </tr> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Philosophie contemporaine <span style="color: #8a94a3; font-weight: 400;">(7)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">XIX<sup>e</sup>&nbsp;— XXI<sup>e</sup>&nbsp;siècle</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Karl Marx|Karl Marx]]<br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche|Nietzsche]]</span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La culture grecque|Culture grecque]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La culture moderne|Culture moderne]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La métaphysique|Métaphysique]]</span></span><br/> <span style="padding-left: 10px;"><span style="color: #1a2230; font-weight: 500;">[[Philosophie/Nietzsche/La moralité des mœurs|Moralité des mœurs]]</span></span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Courants du XX<sup>e</sup> siècle <span style="color: #8a94a3; font-weight: 400;">(3)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">Écoles et traditions</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Philosophie analytique|Philosophie analytique]]</span><br/> <span style="color: #1a2230; font-weight: 500;">[[Philosophie/Existence et temps|Existentialisme]]</span><br/> [[Dictionnaire de philosophie/Dasein|Phénoménologie / Dasein]] </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #9a7840; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">Traditions non occidentales <span style="color: #8a94a3; font-weight: 400;">(2)</span></div> <div style="font-size: 0.82em; color: #8a94a3; margin-bottom: 6px;">Afrique, Amériques</div> <div style="font-size: 0.88em; color: #5a6578; line-height: 1.75;"> [[Dictionnaire de philosophie/Philosophie africaine|Philosophie africaine]]<br/> [[Dictionnaire de philosophie/Argentine (Philosophie)|Argentine — XX<sup>e</sup> siècle]] </div> </td> </tr> </table> <!-- ══════════════════════════════════════════════ CLUSTER 5 — OUVRAGES DE RÉFÉRENCE (gris encre) ══════════════════════════════════════════════ --> <div style="margin: 22px 0 10px; padding: 6px 0 4px; border-bottom: 1px solid #1a2230;"> <div style="font-size: 1.15em; font-weight: 700; color: #1a2230;">Ouvrages de référence et pédagogiques</div> </div> <!-- Autres ouvrages --> <table style="width: 100%; border-collapse: separate; border-spacing: 14px 14px;"> <tr> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Manuel de terminale de philosophie|Manuel de terminale]] <span style="color: #8a94a3; font-weight: 400;">(26)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> Éthique &amp; action <span style="color: #8a94a3;">(4)</span><br/> Esprit &amp; conscience <span style="color: #8a94a3;">(4)</span><br/> Connaissance &amp; vérité <span style="color: #8a94a3;">(5)</span><br/> Monde &amp; société <span style="color: #8a94a3;">(4)</span><br/> Culture &amp; sens <span style="color: #8a94a3;">(6)</span><br/> Méthode &amp; ressources <span style="color: #8a94a3;">(3)</span> </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[:Catégorie:Commentaire philosophique|Commentaires d'œuvres]] <span style="color: #8a94a3; font-weight: 400;">(20)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> <span style="font-weight: 500;">[[Commentaire philosophique/Lettre à Ménécée|Lettre à Ménécée]]</span> <span style="color: #8a94a3;">·</span> Épicure<br/> <span style="font-weight: 500;">[[Méditations métaphysiques|Méditations]]</span> <span style="color: #8a94a3;">·</span> Descartes<br/> <span style="font-weight: 500;">[[Commentaire de l'Éthique|Éthique]]</span> <span style="color: #8a94a3;">·</span> Spinoza<br/> <span style="font-weight: 500;">[[Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes|Inégalité]]</span> <span style="color: #8a94a3;">·</span> Rousseau<br/> <span style="font-weight: 500;">[[Philosophie/Commentaire du passage à propos de l'Homme esclave du divertissement|Divertissement]]</span> <span style="color: #8a94a3;">·</span> Pascal </div> </td> <td style="width: 33.33%; vertical-align: top; background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 12px 16px 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; margin-bottom: 6px;">[[:Catégorie:Vocabulaire philosophique|Vocabulaires]] <span style="color: #8a94a3; font-weight: 400;">(4)</span></div> <div style="font-size: 0.88em; color: #1a2230; line-height: 1.75;"> <span style="font-weight: 500;">[[Pour lire Platon/Vocabulaire|Platon]]</span><br/> <span style="font-weight: 500;">[[Philosophie/Vocabulaire/David Hume|David Hume]]</span><br/> <span style="font-weight: 500;">[[Philosophie/Vocabulaire/Kant|Kant]]</span> </div> <div style="height: 1px; background: #e2e8ef; margin: 10px 0;"></div> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; margin-bottom: 10px;">[[Philosophie/Une brève introduction|Une brève introduction]] </div> </td> </tr> </table> <!-- Dictionnaire — pleine largeur --> <div style="background: #fbfcfd; border: 1px solid #d4dae2; border-left: 4px solid #4a4a4a; border-radius: 0 8px 8px 0; padding: 14px 16px 16px; margin-bottom: 14px; box-shadow: 0 1px 4px rgba(26,34,48,0.05);"> <div style="font-size: 0.96em; font-weight: 600; color: #1a2230; padding-bottom: 8px; border-bottom: 1px solid #dfe4eb; margin-bottom: 10px;">[[Dictionnaire de philosophie|Dictionnaire de philosophie]] <span style="color: #8a94a3; font-weight: 400;">(35+)</span></div> <!-- Sélection d'articles thématiques du Dictionnaire --> <table style="width: 100%; border-collapse: separate; border-spacing: 5px 5px;"> <tr> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/A|A]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/B|B]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/C|C]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/D|D]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/E|E]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/F|F]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/G|G]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/H|H]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/I|I]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/J|J]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/K|K]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/L|L]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/M|M]]</td> </tr> <tr> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/N|N]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/O|O]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/P|P]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Q|Q]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/R|R]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/S|S]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/T|T]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/U|U]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/V|V]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/W|W]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/X|X]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Y|Y]]</td> <td style="width: 7.69%; text-align: center; background: #eef2f7; border: 1px solid #dbe2eb; border-radius: 4px; padding: 9px 0; font-size: 1.08em; font-weight: 500;">[[Dictionnaire de philosophie/Z|Z]]</td> </tr> </table> </div> <br> <!-- ══════════════════════════════════════════════ PIED DE PAGE (+ légende de convention, idée 5) ══════════════════════════════════════════════ --> <div style="margin-top: 10px; padding: 14px 0 4px; border-top: 1px solid #d4dae2; font-size: 0.86em; color: #555e6b;"> <div style="margin-bottom: 6px;"><span style="font-weight: 600; color: #1a2230;">Consulter ailleurs</span> &nbsp;·&nbsp; [[w:Philosophie|Wikipédia]] &nbsp;·&nbsp; [[wikt:philosophie|Wiktionnaire]] &nbsp;·&nbsp; [[v:Philosophie|Wikiversité]] &nbsp;·&nbsp; [[s:Portail:Philosophie|Wikisource]]</div> <div style="margin-bottom: 10px;"><span style="font-weight: 600; color: #1a2230;">Catégories sources</span> &nbsp;·&nbsp; [[:Catégorie:Discipline philosophique|Disciplines]] &nbsp;·&nbsp; [[:Catégorie:Histoire de la philosophie|Histoire]] &nbsp;·&nbsp; [[:Catégorie:Philosophe|Philosophes]] &nbsp;·&nbsp; [[:Catégorie:Dictionnaire de philosophie (livre)|Dictionnaire]] &nbsp;·&nbsp; [[:Catégorie:Manuel de terminale de philosophie (livre)|Manuel]] &nbsp;·&nbsp; [[:Catégorie:Commentaire philosophique|Commentaires]]</div> </div> </div> [[Catégorie:Philosophie|*]] kfa21qyx8sotm05hqfaf1mpjoyxedn3 Philosophie/Thalès de Milet 0 5276 764920 750868 2026-04-25T06:10:54Z PandaMystique 119061 764920 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]</div> |- | width="33%"| | width="34%" align="center"|'''[[Philosophie/Présocratiques|Présocratiques]]''' | width="33%" align="right"|'''[[Philosophie/Anaximandre de Milet|Anaximandre de Milet]]''' |} [[w:Thal%C3%A8s|<big>'''Thalès'''</big>]] [[#Thalès|<span id="Thalès_back"><sup>'''I'''</sup></span>]] <big>'''de'''</big> [[w:Milet|<big>''<i>Milet</i>''</big>]] [[#Milet|<span id="Milet_back"><sup>'''II'''</sup></span>]] ''<i>([[w:Ann%C3%A9es_620_av._J.-C.|-625/-620]]</i>'' <sup>[[w:VIIe_siècle_av._J.-C.|⏳]]</sup>''<i>, à Milet — [[w:Ann%C3%A9es_540_av._J.-C.|-548/-545]]</i>'' <sup>[[w:VIe_siècle_av._J.-C.|⏳]]</sup>''<i>, à Milet)</i>'' <poem> <div style="text-align: justify; direction: ltr; margin-left: 1em; margin-right: 1em;">[[w:Philosophe|''<i>Philosophe</i>'']] [[#Philosophe|<span id="Philosophe_back"><sup>'''III'''</sup></span>]] [[w:Présocratiques|''<i>présocratique</i>'']] [[#Présocratique|<span id="Présocratique_back"><sup>'''IV'''</sup></span>]] [[w:Ionie|''<i>ionien</i>'']] [[#ionien|<span id="ionien_back"><sup>'''V'''</sup></span>]].</div> </poem> {{Boîte déroulante/début|titre=NdA Thalès de ''<i>Milet</i>''|couleurFondT=#ffffff|couleurFond=#ffffff|couleurBordure=#ffffff|alignT=right|couleurTexteT=#3366BB;}} <div style="text-align: justify; direction: ltr; height: auto; margin-top: 0em; border: 2px solid #3366BB; text-indent: 15px; border-radius:15px;"><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#Thalès_back|<span id="Thalès"><sup>I</sup></span>]] Du nom propre grec ancien Θαλῆς / Thalễs [[wikt:en:Θαλῆς#Ancient_Greek|(en)]], potentiellement « celui qui prospère » ;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ du verbe θᾰ́λλω / thállō [[wikt:en:θάλλω#Ancient_Greek|(en)]], « Fleurir, germer. Grandir, s’épanouir, prospérer. Grossir, abonder. » ;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ +‎ du suffixe adjectival [[wikt:-ής#Grec_ancien|-ής / -ês]] ;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">Selon Mathilde Brémond [https://encyclo-philo.fr/les-presocratiques-a {{Info|<sup>🔍</sup>|Brémond, Mathilde (2019), «Les Présocratiques (A)», dans Maxime Kristanek (dir.), service gratuit créé dans le but de favoriser la réflexion personnelle et collective.}}], Maîtresse de conférences en philosophie à l’Université Clermont Auvergne, toutes les attributions faites à Thales de ''<i>Milet</i>'', plutôt tardives, sont difficiles à vérifier, et pourraient être dues à la volonté de faire remonter à une grande figure de ''<i>philosophe</i>'' certaines découvertes scientifiques. Mais il est possible que Thalès ait introduit en Grèce un certain nombre de théories scientifiques qui avaient été développées par les ''<i>Égyptiens</i>'' en ''<i>géométrie</i>'' ou les ''<i>Babyloniens</i>'' en ''<i>astronomie</i>''.</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#Milet_back|<span id="Milet"><sup>II</sup></span>]] Du nom propre grec ancien Μίλητος / Mílētos [[wikt:en:Μίλητος#Ancient_Greek|(en)]];<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">Ancienne cité grecque d’[[w:Ionie|''<i>Ionie</i>'']] [[#ionien|<sup>V</sup>]], fondée, selon diverses légendes, par [[w:Milétos|Milétos]], un héro mythologique. Le tyran [[w:Thrasybule_de_Milet|Thrasybule]] conserva l’indépendance de ''<i>Milet</i>'' à la fin du [[w:VIIe_siècle_av._J.-C.|VII<sup>ème</sup> siècle {{Info|<small>AEC</small>|Avant l’Ère Commune}}]] grâce à une guerre de 12 ans contre la ''<i>Lydie</i>'' ; mais elle tomba au début du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|<small>AEC</small>|Avant l’Ère Commune}}]]; et, au milieu du siècle, passa aux mains des ''<i>perses</i>'', à la défaite du roi de ''<i>Lydie</i>'' Crésus par le roi ''<i>achéménide</i>'' Cyrus II.</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#Philosophe_back|<span id="Philosophe"><sup>III</sup></span>]] De l’adjectif grec ancien [[wikt:φιλόσοφος#Grec_ancien|φιλόσοφος / philósophos]], « celui qui aime la sagesse »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ de l’adjectif [[wikt:φίλος#Grec_ancien|φίλος / phílos]], « ce qui est aimé »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ + de l’adjectif [[wikt:σοφός#Grec_ancien|σοφός / sophós]], « 1. Habile. 2. (En parlant de l’intelligence ou du caractère) • Prudent, sage; • (En particulier) Initié à la sagesse; • (En particulier) Ingénieux, fin, rusé. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">Les termes de « philosophie » (φιλοσοφία / philosophíā) et « philosophe » (φιλόσοφος / philósophos) ne sont pas utilisés par les premiers penseurs : les termes apparaissent pour la première fois chez [[w:Gorgias|Gorgias]] de Leontinoi [[#Gorgias|<span id="Gorgias_back"><sup>VI</sup></span>]], dans l’[[w:Éloge_d%27Hélène|''<i>Éloge d’Hélène</i>'']], §13 (le terme apparaît également dans le fragment B93 d’[[w:Héraclite|Héraclite]], mais son authenticité est contestée) :'''<br /><p style="margin-left: 2em; margin-right: 2em; text-align: center;">« ''<i>13. Que la persuasion, en s’ajoutant au discours, arrive à imprimer jusque dans l’âme tout ce qu’elle désire, il faut en prendre conscience.<br />Considérons en premier lieu les discours des [[w:Histoire_de_la_météorologie#Antiquité|''<i>météorologues</i>'']] [[#météorologie|<span id="météorologie_back"><sup>VII</sup></span>]] : en détruisant une opinion et en en suscitant une autre à sa place, ils font apparaître aux yeux de l’opinion des choses incroyables et invisibles.<br />En second lieu, considérons les plaidoyers judiciaires qui produisent leur effet de contrainte grâce aux paroles : c’est un genre dans lequel un seul discours peut tenir sous le charme et persuader une foule nombreuse, même s’il ne dit pas la vérité, pourvu qu’il ait été écrit avec art. <br />En troisième lieu, considérons les discussions '''philosophiques''' : c’est un genre de discours dans lequel la vivacité de la pensée se montre capable de produire des retournements dans ce que croit l’opinion.</i>'' »<br /><p style="margin-left: 2em; margin-right: 2em; text-align: right;">'''[https://ent2d.ac-bordeaux.fr/disciplines/philosophie/wp-content/uploads/sites/24/2019/06/Chap1_philo-textes.pdf <u>Les Écoles présocratiques</u>, ''<i>Gorgias, Éloge d’Hélène, 1, §13</i>''], traduction du grec ancien par Daniel Delattre, Jean-Paul Dumont et Jean-Louis Poirier, Folio essais, 1991, p. 711-713.<br />(version bilingue grec ancien-français également disponible [https://www.cairn.info/revue-de-philosophie-ancienne-2017-1-page-15.htm ici])<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;"> Selon Mathilde Brémond [https://encyclo-philo.fr/les-presocratiques-a {{Info|<sup>🔍</sup>|Brémond, Mathilde (2019), «Les Présocratiques (A)», dans Maxime Kristanek (dir.), service gratuit créé dans le but de favoriser la réflexion personnelle et collective.}}], Maîtresse de conférences en philosophie à l’Université Clermont Auvergne, on peut généralement considérer qu’il y a une rupture à partir de Thalès de Milet entre les mythologues précédents (Homère et surtout Hésiode) et les philosophes, dans l’explication du monde par une causalité unifiée (et non multiple) et systématique (et donc naturelle, plutôt que dépendante des caprices divins, et donc surnaturelle), et dans la nécessité de justification par argumentation de ces derniers.</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#Présocratique_back|<span id="Présocratique"><sup>IV</sup></span>]]Les présocratiques sont des ''<i>philosophes</i>'' [[#Philosophe|<sup>III</sup>]] qui, dans la ''<i>Grèce antique</i>'', ont participé aux [[w:Histoire_de_la_philosophie_en_Occident|''<i>origines de la philosophie</i>'']] du milieu du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|<small>AEC</small>|Avant l’Ère Commune}}]] jusqu’au [[w:IVe_siècle_av._J.-C.|IV<sup>ème</sup> siècle {{Info|<small>AEC</small>|Avant l’Ère Commune}}]], et n’ayant pas subi l’influence de [[w:Socrate#Place_de_Socrate_dans_la_philosophie_antique|Socrate]]. Selon Mathilde Brémond [https://encyclo-philo.fr/les-presocratiques-a {{Info|<sup>🔍</sup>|Brémond, Mathilde (2019), «Les Présocratiques (A)», dans Maxime Kristanek (dir.), service gratuit créé dans le but de favoriser la réflexion personnelle et collective.}}], Maîtresse de conférences en philosophie à l’Université Clermont Auvergne, il est difficile de définir leur unité dans une opposition nette à la philosophie socratique, tant ils se différencient même dans les sujets traités. [[w:Aristote|Aristote]] les désigne par le terme de [[wikt:φυσικός#Nom_commun|φῠσῐκοί / phusikoí]], « [[w:Histoire_de_la_physique#Antiquité|''<i>physiciens</i>'']] », définissant l’objet principal de leurs recherches par la [[w:φύσις#Grec_ancien|φῠ́σῐς / phúsis]], « la nature » [http://www.remacle.org/bloodwolf/philosophes/Aristote/phys1.htm <sup>Physique, liv.I, chap.II., §§1,7 & chap.V., §1</sup>]. Les premiers présocratiques sont originaires de Milet [[#Milet|<sup>II</sup>]] et sont au nombre de trois : Thalès, Anaximandre et Anaximène.</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#ionien_back|<span id="ionien"><sup>V</sup></span>]] Du nom commun grec ancien Ἴων / Íōn [[wikt:en:Ἴων#Ancient_Greek|(en)]], « ''<i>ionien, un habitant d’Ionie</i>''. [[w:Ion_(mythologie)|Ion]], l’ancêtre mythologique du peuple ''<i>ionien</i>'' »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">Région historique du monde grec antique située dans l’ouest de l’<i>Asie Mineure</i>, ou [[w:Anatolie|''<i>Anatolie</i>'']], entre [[w:Phocée|''<i>Phocée</i>'']] au nord et ''<i>Milet</i>'' [[#Milet|<sup>II</sup>]] au sud; qui passa, au milieu du [[w:VIe_siècle_av._J.-C.|VI<sup>ème</sup> siècle {{Info|<small>AEC</small>|Avant l’Ère Commune}}]] d’une indépendance de chaque cité, à une domination ''<i>lydienne</i>'', puis à une [[w:Satrape|''<i>satrapie</i>'']] ''<i>perse</i>''.</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#Gorgias_back|<span id="Gorgias"><sup>VI</sup></span>]] Du nom propre grec ancien Γοργίᾱς / Gorgíās [[wikt:en:Γοργίας#Ancient_Greek|(en)]];<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ de l’adjectif γοργός / gorgós, « 1. Sinistre, féroce, terrible. 2. Fougueux, vigoureux. 3. (du style littéraire) Véhément, vigoureux. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ + du suffixe nominal masculin -ίας / -ías [[wikt:en:-ίας#Ancient_Greek|(en)]].<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">''<i>Philosophe</i>'' [[#Philosophe|<sup>III</sup>]] ''<i>présocratique</i>'' [[#Présocratique|<sup>IV</sup>]], de profession rhéteur enseignant la rhétorique [https://remacle.org/bloodwolf/philosophes/platon/cousin/gorgias.htm#449a <sup>Platon, Gorgias, §449a</sup>] ou orateur [https://www.cs.uky.edu/~raphael/sol/sol-cgi-bin/search.cgi?login=guest&enlogin=guest&db=REAL&field=adlerhw_gr&searchstr=gamma,388 <sup>Souda, Adler id. gamma 388</sup>], et désigné comme sophiste de Léontium [https://remacle.org/bloodwolf/philosophes/platon/cousin/hippias.htm#282b <sup>Platon, Hippias Majeur, §282b</sup>] et fondateur de la sophistique primitive, à savoir « la rhétorique appliquée à la philosophie : elle traite, en effet, dans ses dissertations, les mêmes matières que les philosophes ; seulement, voici la différence : avec leur système d’interrogations insidieuses, et leur manière de traiter les questions par une minutieuse analyse des détails, les philosophes nous avouent, sur bien des points, qu’ils sont encore dans l’ignorance, et, ces points-là, le sophiste des anciens temps en parle comme de choses qu’il connaît [... et traite] sans restriction dans toutes ces matières » [https://remacle.org/bloodwolf/roman/philiostrate/vie.htm <sup>Philostrate, Vies des Sophistes, liv. I, Intro.</sup>]. <br /><p style="text-align: right; margin-left: 2em; margin-right: 2em;">([[w:Floruit|{{Info|''<i>fl.</i>''|Floruit, locution latine que l’on emploie pour indiquer la période au cours de laquelle une personne a été active}}]] [[w:Ve_siècle_av._J.-C.|V<sup>ème</sup>]] — [[w:IVe_siècle_av._J.-C.|IV<sup>ème</sup>]] siècles {{Info|<small>AEC</small>|Avant l’Ère Commune}}) [https://books.google.fr/books?id=DrvWAAAAMAAJ&newbks=1&newbks_redir=0&lpg=PA5&dq=bibliogroup%3A%22Dictionnaire%20des%20philosophes%20antiques%22&hl=fr&pg=PA486#v=onepage&q&f=true {{Info|<sup>🔍</sup>|Dictionnaire des Philosophes Antiques, publié sous la direction de Richard Goulet, Volume III, §28 - Gorgias de Leontinoi}}]</small>'''<br /><br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">'''<small>[[#météorologie_back|<span id="météorologie"><sup>VII</sup></span>]] Du nom commun grec ancien μετεωρολογία / meteōrología [[wikt:en:μετεωρολογία|(en)]], « étude/discussion des corps et phénomènes célestes »; <br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ de l’adjectif μετέωρᾰ / metéōra [[wikt:en:μετέωρος#Ancient_Greek|(en)]], « 1. Élevé, en haut, dans les airs. 2. (nominalisé, neutre pluriel) Phénomènes astronomiques. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 30px;">➥ de la préposition μετά / metá [[wikt:en:μετά#Ancient_Greek|(en)]], « 1. [avec génitif] • Au milieu de, parmi, entre, avec; • En commun, avec l’aide de; • Concernant ses relations avec; • (rare) en même temps. 2. (uniquement en poésie, généralement épique) [avec datif] • Entre, parmi; • D’ailleurs, au-delà. 3. [à l’accusatif] • Comme un mouvement vers : à la poursuite de; • De séquence ou de succession : a. (d’un lieu) Après, derrière; b. (temps) Après; c. (valeur, rang) Suivant, après; • Après, selon; • Parmi, entre. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 30px;">➥ + du verbe ἀείρω / aeírō [[wikt:en:ἀείρω#Ancient_Greek|(en)]], « (Épique, ionique, poétique) 1. (transitif) Élever, lever, soutenir : (d’armées, de navires, transitifs) Pour mettre la flotte sous voiles, appareiller. 2. (transitif) Porter, soutenir. 3. (transitif) Élever, exalter : (transitif) Élever par des mots, louer, exalter. 4. (transitif) Soulever et emporter, enlever : • (transitif, avec le génitif) Pour enlever de; • (κοινὴ διάλεκτος / koinḕ diálektos [[wikt:en:Κοινή#Ancient_Greek|(en)]], le « [[w:Koinè_(grec)|langage commun]] » parlée en Grèce depuis l’époque d’Alexandre environ, et comprise partout où l’on parlait grec, transitif) partir soudainement en catimini, tuer. 5. (voix moyenne, transitive) Prendre pour soi, gagner : • (transitif) Prendre sur soi, subir : (transitif) Entreprendre, commencer; • (transitif) Élever; • (transitif) À emporter. 6. (voix passive, intransitive) à suspendre. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 15px;">➥ + du suffixe -λογία / -logía [[wikt:en:-λογία#Ancient_Greek|(en)]], « Base pour les noms désignant l’étude de quelque chose, ou la branche de connaissance d’une discipline. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 30px;">➥ du nom commun λόγος / lógos, « 1. Ce qui est dit : mot, phrase, discours, histoire, débat, énoncé, argument. 2. Ce qui est pensé : raison, considération, calcul, estimation. 3. Un compte rendu, une explication ou un récit. »;<br /><p style="margin-left: 2em; margin-right: 2em; text-indent: 30px;">➥ + du suffixe nominatif abstractif -ῐ́ᾱ / -íā [[wikt:en:-ία#Ancient_Greek|(en)]].'''<br /><p style="margin-left: 2em; margin-right: 2em; text-align: center;">« ''<i>§ 2. De toute cette étude, il ne nous reste plus qu’à examiner une seule partie, celle que nos devanciers ont ordinairement nommée la '''météorologie'''. Elle comprend tous ces phénomènes qui, bien que se produisant suivant des lois naturelles, ont cependant des conditions moins régulières que celles de l’élément premier des corps, et qui ont lieu dans l’espace le plus rapproché de la révolution des astres ; je veux dire, par exemple, la voie lactée, les comètes, les météores ignés et à mouvement rapide, que nous pouvons regarder comme des accidents communs de l’air et de l’eau. Enfin cette science comprend l’étude de toutes les espèces de la terre, de ses parties, ou des propriétés de ces parties, qui nous peuvent servir à expliquer les causes des vents et des tremblements de terre, et de toutes les circonstances qui accompagnent les mouvements qu’ils provoquent. Parmi ces phénomènes, les uns nous sont inexplicables; les autres nous sont accessibles dans une certaine mesure. Nous traiterons aussi de la chute de la foudre, des ouragans, des tempêtes, et de toute cette série de phénomènes qui par leur combinaison deviennent des modifications de ces mêmes corps.</i>'' »<br /><p style="margin-left: 2em; margin-right: 2em; text-align: right;">'''[https://remacle.org/bloodwolf/philosophes/Aristote/meteorologie.htm#12 <u>Météorologie d’Aristote</u>, ''<i>Livre I, § 2.</i>''], traduite en français par [[w:Jules_Barthélemy-Saint-Hilaire|J. Barthélemy-Saint-Hilaire]], Librairie Philosophique de Ladrange, 1863</small>''' {{Boîte déroulante/fin}} {| style="border:1px solid darkgray" cellpadding="3" cellspacing="3" align="center" |[[Image:Thales.jpg|thumb|150px|Thalès de Milet]] | :Les sources : :[[Philosophie/Thalès de Milet/Liste des sources|Liste des sources]] :Textes et traductions : [[Philosophie/Thalès de Milet/Textes et traductions Ier millénaire AEC|Avant l’Ère Commune (AEC)]] - [[Philosophie/Thalès de Milet/Textes et traductions Ier millénaire EC|de l’Ère Commune (EC)]] :[[Philosophie/Thalès de Milet/Classement thématique|Classement thématique]] :Études : :[[Philosophie/Thalès de Milet/Theodor Gomperz|Notice de Theodor Gomperz]] :[[Philosophie/Thalès de Milet/Tannery|Thalès et ses emprunts à l'Egypte, par P. Tannery]] :[[Philosophie/Thalès de Milet/L'École milésienne|L'École milésienne]] :<small>Autres textes : [[Philosophie/Thalès de Milet/Thalès dans la littérature|Thalès dans la littérature]]</small> |} [[Catégorie:Philosophe]] = Résumé des sources = == Biographie == <poem> <div style="text-align: left; direction: ltr; margin-left: 1em; margin-right: 1em;">• Origine [[w:Ph%C3%A9niciens|''<i>phénicienne</i>'']] : Hérodote, Histoire/Enquête, Livre I — CLIO, Chap. CLXX.</div> </poem> == Astronomie == <poem> <div style="text-align: justify; direction: ltr; margin-left: 1em; margin-right: 1em;">• Prédiction d’une éclipse lors de [[w:Bataille_de_l%27%C3%89clipse|''<i>La bataille de l’Halys</i>'']] : Hérodote, Histoire/Enquête, Livre I — CLIO, Chap. LXXIV.</div> </poem> == Ingénierie == <poem> <div style="text-align: justify; direction: ltr; margin-left: 1em; margin-right: 1em;">• Détournement du fleuve ''<i>Halys</i>'' : Hérodote, Histoire/Enquête, Livre I — CLIO, Chap. LXXV.</div> </poem> == Politique == <poem> <div style="text-align: justify; direction: ltr; margin-left: 1em; margin-right: 1em;">• Conseil d’instituer une assemblée unique et centrale, et de laisser les autres villes se gouverner, comme des États isolés : Hérodote, Histoire/Enquête, Livre I — CLIO, Chap. LXXV.</div> </poem> == Hydrologie == <poem> <div style="text-align: left; direction: ltr; margin-left: 1em; margin-right: 1em;">• Théorie sur la crue du ''<i>Nil</i>'' :<br /><p style="text-indent: 15px;">- Hérodote, Histoire/Enquête, Livre II — EUTERPE, Chap. XX. (Attribution incertaine)</div> </poem> == Mathématiques == <poem> <div style="text-align: justify; direction: ltr; margin-left: 1em; margin-right: 1em;">• Apport de la Géométrie en ''<i>Grèce</i>'' depuis l’<i>Égypte</i> :<br /><p style="text-indent: 15px;">- Hérodote, Histoire/Enquête, Livre II — EUTERPE, Chap. CIX. (Attribution incertaine)</div> </poem> {{DEFAULTSORT:Thalès de Milet}} b63cym3j3sohte5bplph0978tweb6l4 Philosophie/Anaximandre de Milet 0 5305 764918 564331 2026-04-25T06:09:03Z PandaMystique 119061 764918 wikitext text/x-wiki {| border="0" cellpadding="0" width="100%" style="background: #f9f9f9" | colspan="3" height="25"|<div style="text-align: center;">[[Philosophie/Histoire de la philosophie|Histoire de la philosophie]]</div> |- | width="33%"|'''[[Philosophie/Thalès de Milet|Thalès de Milet]]''' | width="34%" align="center"|'''[[Philosophie/Histoire de la philosophie/La philosophie antique|La philosophie antique]]''' | width="33%" align="right"|'''[[Anaximène de Milet]]''' |} <div style="text-align: center;">'''Cette page est presque vide, et n'est qu'une simple présentation en attendant que la page de [[Philosophie/Thalès de Milet|Thalès de Milet]] soit bien avancée.''' </div> '''Anaximandre de Milet''' (en grec Ἀναξίμανδρος / ''Anaxímandros'') (611 av. J.-C., vers 547 av. J.-C.), philosophe grec [[Philosophie/Présocratiques|présocratique]], successeur de [[Philosophie/Thalès de Milet|Thalès]]. {| style="border:1px solid darkgray" cellpadding="3" cellspacing="3" align="center" |[[Fichier:Anaximander.jpg|thumb|90px|Anaximandre de Milet]] | :Les sources : :[[Philosophie/Anaximandre de Milet/Liste des sources|Liste des sources]] :[[Philosophie/Anaximandre de Milet/Textes et traductions|Textes et traductions]] :Les études : :[[Philosophie/Anaximandre de Milet/Theodor Gomperz|Notice de Theodor Gomperz]] :[[Anaximandre de Milet/Tannery|Anaximandre de Milet, par P. Tannery]] :Autres textes : [[Anaximandre de Milet/Anaximandre dans la littérature|Anaximandre dans la littérature]] |} [[Catégorie:Philosophe]] {{DEFAULTSORT:Anaximandre}} q6uhxvtetvq0qsh3zdf47e4kpxls9ux Philosophie/Objectif/subjectif 0 5530 764927 429380 2026-04-25T06:28:20Z PandaMystique 119061 764927 wikitext text/x-wiki Au sens strict, est dit subjectif ce qui appartient au sujet, objectif, ce qui appartient à l'objet. A ce titre, tout ce qui fait partie du champ de la conscience (jugements, sentiments, volontés...) est subjectif et on peut dire que la proposition "la somme des angles d'un triangle est égale à 180°" décrit une propriété objective, celle du triangle. Mais on emploie souvent ces deux termes pour qualifier des genres de connaissances. Une connaissance subjective serait équivalente à partiale, relative, parce que mal mise à distance et donc mal critiquée, et n'aurait de valeur que pour le sujet qui l'affirme; une connaissance objective serait au contraire impartiale, parce que suffisamment distanciée par le sujet pour être partagée par les autres. Pourtant, cette distinction tranchée est sommaire. En effet, tout jugement, parce qu'il est nécessairement émis par un sujet, est subjectif, et en même temps vise l'objectivité quand il construit l'objet de son examen de façon à le comprendre, le mettre en ordre, et ainsi le faire comprendre aux autres. Ainsi, il n'existe pas plus de jugement purement subjectif que de pure objectivité, dans le sens où la pensée s'exerce toujours sur un objet dont le sens est toujours élaboré par un sujet. Lorsqu'on parle d'un jugement de connaissance, cela implique toujours l'effort d'une subjectivité qui veut partager son savoir avec d'autres subjectivités. Si la proposition "la somme des angles d'un triangle est égale à 180°" est un jugement de connaissance qui décrit une propriété objective du triangle, c'est parce que cette propriété a été construite par des sujets de façon à ce que les esprits s'accordent sur ce qu'est un triangle. Il faut donc faire la distinction entre l'usage ordinaire de "subjectif" qui signifie "immédiat, partial, mal maîtrisé" et ne désigne pas une connaissance digne de ce nom, et l'usage philosophique qui suppose une construction réciproque entre subjectif et objectif et qui désigne une connaissance visant l'intersubjectivité. [[Catégorie:Manuel de terminale de philosophie (livre)|Objectif/subjectif]] byfic7wbicy5qh0rdaesylxe4bqxh89 Catégorie:Psychologie 14 9991 765029 760580 2026-04-25T10:03:04Z PandaMystique 119061 765029 wikitext text/x-wiki * Voir le chapitre principal : [[La Coopération|La Coopération]] [[Catégorie:Classe 1 - Philosophie et psychologie‎|*]] oln48enxv28uwgdb56gu6wdq5qku5dl Nietzsche : Introduction à sa philosophie/Volonté de puissance 0 12308 764969 751963 2026-04-25T07:46:23Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Volonté de puissance]] vers [[Nietzsche : Introduction à sa philosophie/Volonté de puissance]] 751963 wikitext text/x-wiki '''Volonté de puissance''' (en allemand : ''Wille zur Macht'') est un concept philosophique central dans la pensée de Friedrich Nietzsche (1844-1900), désignant l'« essence la plus intime de l'Être »<ref>Nietzsche, Friedrich, ''Ainsi parlait Zarathoustra'', Paris, Gallimard, coll. « Folio essais », 1971, p. 174</ref>. Ce concept, qui apparaît explicitement dans ''Ainsi parlait Zarathoustra'' (1883-1885) et se développe dans ''Par-delà bien et mal'' (1886) et ''La Généalogie de la morale'' (1887), désigne une pulsion fondamentale qui anime l'homme et tout ce qui vit, cherchant non pas simplement à se conserver, mais à s'accroître, à se surmonter, à dominer. == Définition et origine du concept == La volonté de puissance constitue, selon Nietzsche, le principe moteur de toute existence. Dans ''Ainsi parlait Zarathoustra'', il écrit : « Partout où j'ai trouvé quelque chose de vivant, j'ai trouvé de la volonté de puissance »<ref>Nietzsche, Friedrich, ''Also sprach Zarathustra'', II, « Von der Selbst-Überwindung », in ''Kritische Studienausgabe'', vol. 4, Berlin/New York, de Gruyter, 1988, p. 147</ref>. Cette formulation indique que la volonté de puissance n'est pas un attribut particulier de certains êtres, mais la caractéristique essentielle de tout ce qui vit. === Opposition à Schopenhauer === Le concept nietzschéen se construit en opposition explicite à la « volonté de vivre » (''Wille zum Leben'') d'Arthur Schopenhauer. Là où Schopenhauer identifiait dans la volonté de vivre un principe métaphysique fondamental menant à la souffrance et appelant à la négation ascétique, Nietzsche affirme au contraire que « la vie elle-même est volonté de puissance »<ref>Nietzsche, Friedrich, ''Jenseits von Gut und Böse'', § 13, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, p. 27</ref>. Dans ''Par-delà bien et mal'', il précise : « Les physiologistes devraient réfléchir avant de poser l'instinct de conservation comme instinct cardinal d'un être organique. Un être vivant veut avant tout décharger sa force — la vie elle-même est volonté de puissance »<ref>Nietzsche, Friedrich, ''Jenseits von Gut und Böse'', § 13, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, p. 27</ref>. === Formulations originales === Dans le chapitre « De l'auto-dépassement » (''Von der Selbst-Überwindung'') d'''Ainsi parlait Zarathoustra'', la vie elle-même s'adresse à Zarathoustra : « Je suis ce qui doit toujours se surmonter soi-même [...] En vérité, je vous le dis : bien et mal qui seraient éternels — cela n'existe pas ! Ils doivent toujours se surmonter eux-mêmes »<ref>Nietzsche, Friedrich, ''Also sprach Zarathustra'', II, « Von der Selbst-Überwindung », in ''Kritische Studienausgabe'', vol. 4, Berlin/New York, de Gruyter, 1988, p. 148</ref>. Cette auto-transcendance perpétuelle constitue l'essence même de la volonté de puissance. == Nature et caractéristiques == === Une volonté d'accroissement, non de conservation === Contrairement aux théories darwiniennes de la « lutte pour l'existence » et de l'adaptation, que Nietzsche critique sévèrement, la volonté de puissance ne vise pas prioritairement la conservation ou la survie. Elle est « streben » (aspiration, effort) vers plus de puissance, vers le dépassement de la résistance. Dans ''L'Antéchrist'', Nietzsche définit : « Qu'est-ce qui est bon ? — Tout ce qui élève le sentiment de puissance, la volonté de puissance, la puissance elle-même dans l'homme. Qu'est-ce qui est mauvais ? — Tout ce qui procède de la faiblesse. Qu'est-ce que le bonheur ? — Le sentiment que la puissance croît, qu'une résistance est surmontée »<ref>Nietzsche, Friedrich, ''Der Antichrist'', § 2, in ''Kritische Studienausgabe'', vol. 6, Berlin/New York, de Gruyter, 1988, p. 170</ref>. === La puissance comme surmontement de la résistance === Un aspect essentiel, souvent méconnu, réside dans le fait que la volonté de puissance nécessite la résistance pour s'exercer. Nietzsche écrit dans ses fragments posthumes : « Toute expansion, incorporation, croissance signifie lutter contre quelque chose qui résiste »<ref>Nietzsche, Friedrich, ''Nachgelassene Fragmente'' 1887-1889, 11[75], in ''Kritische Studienausgabe'', vol. 13, Berlin/New York, de Gruyter, 1988, p. 37</ref>. La puissance n'existe donc qu'en tant que processus dynamique de surmontement, jamais comme état statique de domination acquise. Cela explique pourquoi Nietzsche peut affirmer que la volonté de puissance « désire » même la souffrance et l'obstacle, car c'est dans leur surmontement que s'exerce la puissance. === Pluralité des volontés de puissance === La volonté de puissance n'est pas une force monolithique unique, mais une multiplicité de forces en conflit. Nietzsche récuse l'idée d'un sujet unifié, d'un « moi » substantiel : « Ce que nous appelons « moi » n'est qu'une fiction grammaticale »<ref>Schacht, Richard, ''Nietzsche'', London, Routledge, 1983, p. 310</ref>. L'être humain est traversé par une pluralité de pulsions (''Triebe''), chacune manifestant une volonté de puissance qui cherche à dominer les autres. La santé psychique correspond à une hiérarchisation réussie de ces pulsions, où les plus fortes commandent aux plus faibles, tandis que la décadence se caractérise par un désordre pulsionnel, une « anarchie des atomes »<ref>Nietzsche, Friedrich, ''Nachgelassene Fragmente'' 1885-1887, 2[87], in ''Kritische Studienausgabe'', vol. 12, Berlin/New York, de Gruyter, 1988, p. 104</ref>. == Dimensions et applications == === Dimension psychologique === Sur le plan psychologique, la volonté de puissance constitue le principe explicatif fondamental de tous les comportements humains. Nietzsche soutient que même les actions apparemment altruistes, la compassion, ou les pratiques ascétiques relèvent, en dernière analyse, d'une volonté de puissance. Dans ''La Généalogie de la morale'', il montre comment la morale des esclaves, avec son idéal de bonté, d'humilité et de compassion, constitue en réalité une stratégie sophistiquée par laquelle les faibles exercent leur volonté de puissance contre les forts<ref>Nietzsche, Friedrich, ''Zur Genealogie der Moral'', I, §§ 7-10, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, pp. 266-275</ref>. L'ascète qui se mortifie, loin de nier la vie, exerce sa volonté de puissance en conquérant une maîtrise sur soi-même, en s'élevant au-dessus de ses instincts : « L'idéal ascétique exprime une volonté : où est la volonté opposée qui exprimerait un idéal opposé ? »<ref>Nietzsche, Friedrich, ''Zur Genealogie der Moral'', III, § 23, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, p. 396</ref>. Même dans le renoncement apparent, c'est une affirmation de la volonté de puissance qui s'exprime. === Dimension épistémologique : la volonté de puissance comme connaissance === La théorie de la connaissance de Nietzsche découle directement de sa doctrine de la volonté de puissance. La connaissance n'est pas une représentation neutre et objective du réel, mais une interprétation active, une appropriation, une simplification du chaos du devenir au service de la vie et de la puissance. Dans ''Par-delà bien et mal'', Nietzsche affirme que « la falsification, le rejet de la reconnaissance du réel » sont nécessaires à la vie<ref>Nietzsche, Friedrich, ''Jenseits von Gut und Böse'', § 24, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, p. 42</ref>. Le « perspectivisme » nietzschéen découle de cette conception : il n'existe pas de connaissance absolue, mais seulement des perspectives multiples, chacune étant l'expression d'une configuration particulière de volonté de puissance. La vérité elle-même devient un concept problématique : elle n'est plus adéquation de l'esprit et de la chose, mais instrument au service de la puissance. === Dimension métaphysique ou cosmologique ? === La question de savoir si Nietzsche entendait faire de la volonté de puissance un principe métaphysique universel, s'appliquant non seulement au vivant mais à toute réalité, y compris la matière inorganique, demeure controversée parmi les interprètes. Certains fragments posthumes semblent aller dans ce sens : « Ce monde est volonté de puissance — et rien d'autre ! Et vous-mêmes aussi êtes cette volonté de puissance — et rien d'autre ! »<ref>Nietzsche, Friedrich, ''Nachgelassene Fragmente'' 1885-1887, 38[12], in ''Kritische Studienausgabe'', vol. 11, Berlin/New York, de Gruyter, 1988, p. 611</ref>. Cependant, l'interprétation métaphysique, défendue notamment par Martin Heidegger<ref>Heidegger, Martin, ''Nietzsche'', vol. I et II, Paris, Gallimard, 1971</ref>, fait l'objet de critiques importantes. D'une part, ces textes appartiennent aux fragments posthumes, dont la valeur doctrinale est discutable. D'autre part, une telle interprétation semble contredire la critique nietzschéenne de toute métaphysique. Pour des commentateurs comme Gilles Deleuze, la volonté de puissance n'est pas un principe métaphysique substantiel, mais un principe génétique et différentiel qui rend compte du devenir et de la multiplicité<ref>Deleuze, Gilles, ''Nietzsche et la philosophie'', Paris, PUF, 1962, pp. 49-96</ref>. == La volonté de puissance et la morale == === Critique de la morale traditionnelle === La volonté de puissance sert de clé herméneutique pour la critique nietzschéenne de la morale. Dans ''La Généalogie de la morale'', Nietzsche montre que les valeurs morales traditionnelles — le bien, le mal, la compassion, l'altruisme — ne sont pas des vérités éternelles, mais des créations historiques issues de configurations particulières de volonté de puissance. La morale judéo-chrétienne, qu'il nomme « morale des esclaves », est née du ressentiment des faibles contre les forts<ref>Nietzsche, Friedrich, ''Zur Genealogie der Moral'', I, § 10, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, p. 270</ref>. Cette morale opère un renversement des valeurs : elle glorifie la faiblesse, l'humilité, l'obéissance, tout en diabolisant la force, la fierté, l'affirmation de soi. Elle représente selon Nietzsche une volonté de puissance « décadente » ou « réactive », qui ne crée pas positivement, mais se définit négativement par opposition à ce qu'elle condamne. === Vers une morale aristocratique === À cette morale des esclaves, Nietzsche oppose la morale aristocratique ou « morale des maîtres », caractérisée par l'affirmation de soi, la création active de valeurs, la distinction hiérarchique. Dans cette perspective, la volonté de puissance s'exprime de manière « ascendante » : elle crée, elle ordonne, elle légifère. C'est la morale des « esprits libres », de ceux qui osent penser par-delà bien et mal, qui ont le courage de l'indépendance intellectuelle et existentielle<ref>Nietzsche, Friedrich, ''Jenseits von Gut und Böse'', § 257-260, in ''Kritische Studienausgabe'', vol. 5, Berlin/New York, de Gruyter, 1988, pp. 205-211</ref>. == La volonté de puissance et l'art == L'art occupe une place privilégiée dans la philosophie nietzschéenne de la volonté de puissance. Il représente l'activité par excellence où s'exerce une volonté de puissance créatrice, affirmative, « dionysiaque ». Dans ''La Naissance de la tragédie'' (1872), déjà, Nietzsche opposait l'art à la science socratique et présentait l'art tragique grec comme l'expression la plus haute de la volonté de vivre<ref>Nietzsche, Friedrich, ''Die Geburt der Tragödie'', § 15, in ''Kritische Studienausgabe'', vol. 1, Berlin/New York, de Gruyter, 1988, p. 97</ref>. Cette valorisation de l'art se maintient tout au long de son œuvre, mais avec une signification renouvelée par le concept de volonté de puissance. L'artiste incarne l'« homme supérieur » (''höherer Mensch'') qui donne forme au chaos du devenir, qui transfigure la souffrance en beauté, qui affirme la vie jusque dans ses aspects les plus terribles. L'art devient ainsi « le grand stimulant de la vie », opposé à toutes les formes de négation ascétique ou nihiliste<ref>Nietzsche, Friedrich, ''Der Wille zur Macht'', § 853, in ''Kritische Studienausgabe'', vol. 13, Berlin/New York, de Gruyter, 1988, p. 305 (fragment posthum)</ref>. == Problèmes d'interprétation == === Ambiguïtés et malentendus === Le concept de volonté de puissance a donné lieu à de nombreuses interprétations erronées. La plus grave consiste à l'identifier à une volonté de domination politique ou militaire, à un darwinisme social brutal. Cette lecture, favorisée par la sœur de Nietzsche, Elisabeth Förster-Nietzsche, et par l'appropriation nazie de sa philosophie, est profondément contraire à la pensée nietzschéenne authentique<ref>Kaufmann, Walter, ''Nietzsche: Philosopher, Psychologist, Antichrist'', Princeton, Princeton University Press, 1974 (4e éd.), pp. 285-310</ref>. Nietzsche distingue rigoureusement ''Kraft'' (force) et ''Macht'' (puissance). La ''Macht'' dont il parle n'est pas d'abord pouvoir sur autrui, domination extérieure, mais maîtrise de soi, capacité de sublimation, de création, d'auto-dépassement. Le surhomme (''Übermensch'') n'est pas le conquérant militaire, mais l'individu qui a surmonté en lui-même la morale du ressentiment pour affirmer créativement la vie. === La question du ''Wille zur Macht'' comme livre === Un problème philologique majeur concerne le statut du livre intitulé ''La Volonté de puissance'' (''Der Wille zur Macht''), publié pour la première fois en 1901 par Elisabeth Förster-Nietzsche et Peter Gast. Cette compilation, qui prétendait être l'œuvre maîtresse de Nietzsche, était en réalité un assemblage de fragments posthumes, sélectionnés et arrangés selon les intentions idéologiques de sa sœur<ref>Montinari, Mazzino, « La "volonté de puissance" n'existe pas », in ''Nietzsche aujourd'hui ?'', vol. 2, Paris, UGE, 1973, pp. 187-221</ref>. L'édition critique de Colli et Montinari (''Kritische Studienausgabe'', 1967-1988) a définitivement établi que Nietzsche avait abandonné le projet d'un livre intitulé ''La Volonté de puissance'' et que cette compilation ne correspondait pas à ses intentions. Les fragments sur la volonté de puissance doivent donc être lus dans leur contexte chronologique et expérimental, comme des tentatives de formulation plutôt que comme une doctrine systématique et achevée<ref>D'Iorio, Paolo, « La superstition des philologues. Nietzsche et Colli/Montinari », in ''Philosophie'', n° 38, 1993, pp. 12-31</ref>. == Postérité et influence == === Réceptions philosophiques === La volonté de puissance a exercé une influence considérable sur la philosophie du XXe siècle, bien que souvent sous des formes controversées. Martin Heidegger a développé une interprétation métaphysique de la volonté de puissance comme « essence de la modernité » et comme « achèvement de la métaphysique occidentale »<ref>Heidegger, Martin, ''Nietzsche'', vol. I : « La Volonté de puissance en tant qu'art », Paris, Gallimard, 1971, pp. 13-89</ref>. Cette lecture, bien qu'influente, a été critiquée pour avoir « métaphysicisé » Nietzsche contre ses propres intentions. Gilles Deleuze a proposé une interprétation radicalement différente, faisant de la volonté de puissance non pas un principe métaphysique, mais un principe génétique et différentiel, intimement lié à la théorie de l'éternel retour. Pour Deleuze, la volonté de puissance est « l'élément différentiel dont dérivent à la fois la différence quantitative des forces en rapport et la qualité qui, dans ce rapport, revient à chaque force »<ref>Deleuze, Gilles, ''Nietzsche et la philosophie'', Paris, PUF, 1962, p. 60</ref>. Michel Foucault s'est inspiré du concept nietzschéen de volonté de puissance pour développer son analytique du pouvoir, bien qu'il transforme profondément le concept nietzschéen en l'appliquant à l'analyse des micro-pouvoirs et des dispositifs disciplinaires dans les sociétés modernes<ref>Foucault, Michel, « Nietzsche, la généalogie, l'histoire », in ''Hommage à Jean Hyppolite'', Paris, PUF, 1971, pp. 145-172</ref>. === Réceptions critiques === La volonté de puissance a également suscité de vives critiques. Jürgen Habermas y voit l'expression d'un irrationalisme dangereux, qui récuse toute rationalité communicationnelle au profit d'une affirmation arbitraire de la force<ref>Habermas, Jürgen, ''Le Discours philosophique de la modernité'', Paris, Gallimard, 1988, pp. 109-145</ref>. Luc Ferry et Alain Renaut ont critiqué le « subjectivisme » nietzschéen et son incapacité supposée à fonder une éthique universaliste<ref>Ferry, Luc et Renaut, Alain, ''La Pensée 68. Essai sur l'anti-humanisme contemporain'', Paris, Gallimard, 1985, pp. 47-98</ref>. Ces critiques reposent souvent sur une incompréhension du concept : Nietzsche ne prône pas l'arbitraire ou la violence brutale, mais une transformation radicale des critères d'évaluation morale, fondée sur l'affirmation de la vie et la création de valeurs nouvelles. == Notes et références == <references /> == Bibliographie == === Œuvres de Nietzsche === * Nietzsche, Friedrich, ''Kritische Studienausgabe'' (KSA), édition de Giorgio Colli et Mazzino Montinari, 15 volumes, Berlin/New York, de Gruyter, 1988 (édition de référence en allemand). * Nietzsche, Friedrich, ''Ainsi parlait Zarathoustra'', traduction de Georges-Arthur Goldschmidt, Paris, Le Livre de Poche, 1983. * Nietzsche, Friedrich, ''Par-delà bien et mal'', traduction de Patrick Wotling, Paris, Flammarion, coll. « GF », 2000. * Nietzsche, Friedrich, ''La Généalogie de la morale'', traduction de Patrick Wotling, Paris, Le Livre de Poche, 2000. * Nietzsche, Friedrich, ''L'Antéchrist'', traduction d'Éric Blondel, Paris, Flammarion, coll. « GF », 1996. === Études critiques === * Deleuze, Gilles, ''Nietzsche et la philosophie'', Paris, PUF, 1962. * Heidegger, Martin, ''Nietzsche'', traduction de Pierre Klossowski, 2 volumes, Paris, Gallimard, 1971. * Kaufmann, Walter, ''Nietzsche: Philosopher, Psychologist, Antichrist'', Princeton, Princeton University Press, 1974 (4e éd.). * Müller-Lauter, Wolfgang, ''Nietzsche. Seine Philosophie der Gegensätze und die Gegensätze seiner Philosophie'', Berlin/New York, de Gruyter, 1971. * Reginster, Bernard, ''The Affirmation of Life. Nietzsche on Overcoming Nihilism'', Cambridge (Mass.), Harvard University Press, 2006. * Schacht, Richard, ''Nietzsche'', London, Routledge, 1983. * Wotling, Patrick, ''Nietzsche et le problème de la civilisation'', Paris, PUF, 1995. === Sur la question philologique === * Colli, Giorgio et Montinari, Mazzino (éd.), ''Kritische Studienausgabe'', Berlin/New York, de Gruyter, 1967-1988. * D'Iorio, Paolo, « La superstition des philologues. Nietzsche et Colli/Montinari », in ''Philosophie'', n° 38, 1993, pp. 12-31. * Montinari, Mazzino, ''Nietzsche lesen'', Berlin/New York, de Gruyter, 1982 ; trad. fr. ''Nietzsche'', Paris, PUF, 2001. == Voir aussi == === Articles connexes === * [[Friedrich Nietzsche]] * [[Ainsi parlait Zarathoustra]] * [[Par-delà bien et mal]] * [[La Généalogie de la morale]] * [[Surhomme]] * [[Éternel retour]] * [[Nihilisme]] * [[Perspectivisme]] === Liens externes === * [http://www.nietzschesource.org Nietzsche Source] - Édition numérique critique complète des œuvres et de la correspondance de Nietzsche * [http://www.nietzschesource.org/eKGWB/Za-II-Ueberwindung Von der Selbst-Überwindung] - Texte original allemand du chapitre « De l'auto-dépassement » d'''Ainsi parlait Zarathoustra'' [[Catégorie:Friedrich Nietzsche]] [[Catégorie:Concept philosophique]] [[Catégorie:Philosophie allemande]] [[Catégorie:Philosophie du XIXe siècle]] [[Catégorie:Métaphysique]] [[Catégorie:Philosophie morale]] eqa7uowxkg21qv7i9gjkqfo11w0ihhe Catégorie:Manuel de terminale de philosophie (livre) 14 21731 765023 485118 2026-04-25T10:01:50Z PandaMystique 119061 765023 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Livres de niveau lycée]] [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] h65ki5nu6p2qotgduvklmfsz4syx1wf Pour lire Platon/Guide des dialogues/Ion 0 29697 765004 764593 2026-04-25T08:07:20Z PandaMystique 119061 765004 wikitext text/x-wiki == Introduction générale == === Statut et datation du dialogue === {{wikisource|Ion (Platon)|Ion}} L{{'}}''Ion'' est l'un des plus brefs dialogues du corpus platonicien, une douzaine de pages Stephanus (530a-542b) pour une conversation dont la durée fictive n'excède pas la demi-heure entre Socrate et le rapsode Ion d'Éphèse. Cette brièveté, jointe au caractère apparemment simpliste d'Ion comme interlocuteur, a longtemps nourri un soupçon d'inauthenticité ou de légèreté. Goethe voyait dans le dialogue « ''nichts als eine Persiflage'' » (« rien qu'une parodie »), et plusieurs philologues, Wilamowitz en tête, ont douté qu'il fût de Platon, avant que Wilamowitz lui-même, vers la fin de sa carrière, ne revienne partiellement sur son jugement. L'authenticité est aujourd'hui largement admise, sans être absolument consensuelle. La datation reste débattue. Traditionnellement rangé parmi les dialogues de jeunesse, voire parmi les premiers écrits platoniciens,, l{{'}}''Ion'' a été rapproché par Albert Rijksbaron de la période où Platon rédigeait la ''République'' et le ''Phèdre'', sur la base d'un vocabulaire technique et de procédures argumentatives communs à ces œuvres. Cette thèse n'est pas universellement acceptée : plusieurs commentateurs maintiennent une date plus précoce, et les critères stylométriques sont ici peu concluants, comme le rappelle Aguirre. La date dramatique fictive se laisse conjecturer à partir d'indices internes : Ion revient d'Épidaure, où il vient de remporter les concours rapsodiques des fêtes d'Asclépios, et attend les Grandes Panathénées à Athènes. La conversation se placerait donc vraisemblablement, mais sans certitude, dans la période précédant ces Panathénées, dont la journée principale tombait le 28 Hécatombéon. Rijksbaron note d'ailleurs que, si l'on accepte cette reconstruction, Ion aurait passé plusieurs semaines désœuvré à Athènes, ce qui n'est pas sans poser question. === Les deux personnages === Socrate apparaît ici tel qu'on le connaît : ironique, réservé, méthodique, se disant ''idiôtês'' (profane, 532d9) face aux « sages ». Il refuse d'emblée la qualification de ''sophos'' qu'Ion lui attribue (532d) et la renvoie, non sans malice, aux rapsodes, acteurs et poètes eux-mêmes. Ion d'Éphèse est un rapsode présenté comme célèbre, mais son historicité reste incertaine : aucune source indépendante ne le mentionne, et il est possible qu'il s'agisse d'un personnage fictif. Le portrait qu'en donne le dialogue correspond en tout cas, dans ses grandes lignes, au type social du rapsode professionnel tel qu'on peut le reconstituer pour l'époque classique : tournée de concours, prestations en tenue somptueuse avec couronne d'or, rémunération substantielle, prétention à être non seulement récitant mais ''hermêneus'' (interprète) de la pensée du poète, et ambition de se poser en éducateur au titre de spécialiste d'Homère. Il ne faut toutefois pas confondre le temps dramatique du dialogue, le temps de Platon écrivant, et les pratiques attestées de la rhapsodie : le texte est un portrait littéraire, construit pour les besoins de l'argument, avant d'être un document historique sur les rhapsodes. Par ce personnage, Platon vise un ensemble : l'héritier de l'aède, qui a renoncé à la cithare mais garde le ''rhabdos'' (bâton), et qui porte la culture épique dans les festivals publics. Cette figure condense, aux yeux de Platon, le système éducatif traditionnel fondé sur la mémorisation et l'interprétation des poèmes homériques. === Structure générale et enjeu === Le dialogue s'articule en trois grandes sections organisées autour d'un noyau central : * Partie I (530a-533c) : dialogue dialectique qui met en question la possibilité, pour Ion, de posséder une ''technê'' rhapsodique au sens strict, puisqu'il prétend n'être expert que d'Homère alors que la poésie, ''si'' elle est une ''technê'', constitue un tout. * Partie II (533c-536d) : long développement de Socrate où la notion de ''technê'' est remplacée par celle d{{'}}''enthousiasmos'', une puissance divine (''theia dynamis'') qui fait du poète et du rapsode les maillons d'une chaîne magnétique partant de la Muse. * Partie III (536d-541e) : retour à l'examen de la ''technê'' par l'analyse de passages homériques concrets, aboutissant au dilemme final. * Épilogue (541e-542b) : alternative entre deux statuts qu'Ion peut revendiquer, injuste (s'il possède une ''technê'' qu'il refuse de montrer) ou divin (s'il n'en a pas). La question du sens global du dialogue reste discutée. Une lecture forte, répandue chez les commentateurs modernes (Rijksbaron, Aguirre, von der Walde notamment), y voit un geste de disqualification de la poésie traditionnelle comme savoir et comme modèle éducatif du citoyen grec. Dans cette perspective, l{{'}}''Ion'' préparerait déjà les thèses du livre X de la ''République''. Une autre lecture, défendue notamment par Penelope Murray et reprise, avec des nuances, par Grace Ledbetter ou Suzanne Stern-Gillet, insiste davantage sur l'instabilité du texte : Socrate mobiliserait la doctrine de l'inspiration sans nécessairement l'endosser de façon simple, et le dialogue serait plus suggestif que conclusif. Le commentaire qui suit privilégie, par commodité d'exposition, la première ligne, tout en signalant, aux moments décisifs, les points où l'autre lecture peut légitimement se faire entendre. == I. Le prologue (530a-531a) : la mise en place == === 530a-b : les salutations et le contexte === Le dialogue s'ouvre sur une formule de salutation étonnamment solennelle : « Τὸν Ἴωνα χαίρειν », le nom propre à l'accusatif, précédé de l'article, suivi du verbe à l'infinitif. Ce n'est pas l'habituel « ὦ Ἴων » que Socrate utilise avec ses proches ; c'est une formule de déférence, presque protocolaire, qui présente Ion comme un personnage illustre. On peut y entendre, rétrospectivement, une charge ironique : la suite confirme que Socrate ne partage pas, en réalité, l'estime que suggère ce salut. Les salutations révèlent que les deux hommes se connaissent déjà : Socrate sait qu'Ion est Éphésien, connaît son activité et le motif de son séjour à Athènes. L'échange initial, avec son ''hêmin'' (« nous ») qui feint la camaraderie, crée une connivence qui se dissipera à mesure que Socrate reprendra ses distances. Ion vient de remporter « les premiers prix » à Épidaure, lors des concours rapsodiques associés aux fêtes d'Asclépios, et espère vaincre également aux Panathénées athéniennes, les deux plus importants festivals rapsodiques du monde grec. Cette double mention établit le prestige d'Ion ; elle peut aussi, plus discrètement, poser la question de la valeur réelle d'une couronne remportée dans de telles compétitions. La vie itinérante du rapsode, toujours en voyage d'un concours à l'autre, est un trait qui le rapproche du mode de vie des sophistes, et contraste avec l'enracinement athénien de Socrate (qui n'a quitté Athènes que pour trois campagnes militaires). === 530b-c : la double dimension du rapsode === Socrate enchaîne sur un éloge du rapsode qui pose, en réalité, les termes conceptuels de la discussion à venir. Trois motifs se détachent : # L'apparence (''kekosmêsthai'') : le rapsode se présente dans une tenue somptueuse qui convient à son art. Cet aspect physique reviendra à plusieurs reprises (535d, 541c) et sera tourné en dérision. # La fréquentation des poètes : le rapsode est nécessairement en contact avec les plus grands, « en particulier avec Homère, le meilleur et le plus divin (''theiotatos'') de tous ». Le qualificatif ''theiotatos'' appliqué à Homère est suggestif : il prépare la terminologie qui structurera la conclusion du dialogue, où « divin » sera opposé à « technicien ». # L'exigence herméneutique : le rapsode ne doit pas seulement mémoriser les vers (''ta epê'') mais en saisir la pensée (''dianoia'') : « il ne serait pas un bon rapsode s'il ne comprenait pas ce que dit le poète » (530b-c). Cette phrase installe le cadre épistémique dans lequel Socrate va conduire l'examen : ''epê'' d'un côté, ''dianoia'' de l'autre, mots et pensée. Le vocabulaire cognitif est dense : ''syniénai, gignôskein, epistasthai, phrontizein, krinein, eidenai'', toute une constellation qui amène insensiblement la rhapsodie sur le terrain du savoir. Socrate introduit alors le concept-clef de la première partie : le rapsode est ''hermêneus'', interprète, médiateur, de la pensée du poète auprès des auditeurs (530c). Le terme va jouer un rôle double dans le dialogue : * d'abord comme interprète au sens herméneutique (celui qui ''explique'' le texte) ; * puis, dans la partie centrale, comme simple intermédiaire par lequel passe une parole qui ne lui appartient pas. === 530c-531a : Ion se vante === Ion, ravi, confirme et surenchérit. Il a, dit-il, mis tout son soin à comprendre la pensée d'Homère et « parle mieux que quiconque » à son sujet. Il se dit digne de recevoir la couronne d'or des Homérides. La vanité d'Ion apparaît dans sa forme la plus directe, mais pas caricaturale : c'est celle d'un professionnel persuadé de la valeur de son métier. Socrate propose alors la première esquive : il réclame un entretien préalable à toute ''epideixis'' (exhibition publique), stratégie qu'il emploiera à plusieurs reprises pour empêcher Ion de se dérober dans la performance (531a, 536d, 538d). Socrate pose alors la question qui va déclencher toute l'argumentation : « Es-tu expert seulement sur Homère, ou bien aussi sur Hésiode et Archiloque ? » Ion, dans ce que Sales et Menza ont appelé, respectivement, « le motif possibilisateur du dialogue » et la « proposition catalysante », répond fièrement : « Nullement, mais seulement sur Homère, car cela me suffit ». Cette réponse est l'étincelle. Si Ion affirme être excellent sur Homère ''et seulement'' sur Homère, une question devient inévitable : comment cela est-il possible, dès lors qu'Homère parle des mêmes thèmes que les autres poètes ? La tension entre la prétention universelle de la compétence homérique et sa restriction à Homère seul va fournir le levier de toute la première réfutation. == II. Première partie (531a-533c) : l'argument du ''tout'' == === 531a-d : le problème des sujets communs === Socrate commence par une question apparemment innocente : Homère et Hésiode parlent-ils des mêmes choses ? Oui, répond Ion, sur beaucoup de sujets. Sur ces sujets communs, donc, Ion explique-t-il aussi bien Hésiode qu'Homère ? Oui, concède-t-il, au moins sur ce qu'ils disent de la même manière. Quant aux sujets où ils divergent, par exemple la mantique (où Homère et Hésiode disent « quelque chose »), c'est un devin qui jugera le mieux, non Ion. Socrate déploie alors un premier mouvement décisif (531b-c). Si quelqu'un est devin au point de pouvoir expliquer ce que les poètes disent de la même manière, il doit aussi être capable d'expliquer ce qu'ils disent différemment. La compétence d'expert porterait donc sur la ''matière'' et non sur l'auteur. Un expert en mantique juge ''toute'' énonciation mantique, d'où qu'elle vienne ; il ne saurait être expert des énoncés divinatoires d'Homère seul et ignorant de ceux d'Hésiode. Socrate élargit alors la gamme des sujets qu'Homère traite (531c-d) : la guerre, les relations humaines (entre bons et méchants, profanes et spécialistes), les rapports entre dieux et hommes, les événements célestes et infernaux, la généalogie des dieux et des héros. L'éventail est quasi encyclopédique, et c'est précisément cette prétention à l'universalité des contenus poétiques qui permet à Socrate de la retourner. Les autres poètes n'ont-ils pas traité les mêmes sujets ? Ion concède qu'ils l'ont fait, mais « bien moins bien qu'Homère ». Cette concession est décisive : Ion admet implicitement qu'il existe un critère de qualité, donc une norme selon laquelle juger. === 531d-532b : le critère unique de jugement === Socrate introduit alors le principe fondamental : celui qui reconnaît qui parle ''bien'' sur un sujet reconnaît aussi qui parle ''mal''. Si plusieurs personnes parlent de nombres, celui qui reconnaîtra l'expert reconnaîtra aussi le médiocre, c'est l'arithméticien. Si plusieurs parlent d'aliments sains, c'est le médecin qui départagera. Un expert juge donc à la fois le bon et le mauvais dans son domaine. Application (532b) : puisqu'Ion dit qu'Homère et les autres poètes traitent des mêmes sujets, et puisque le bon juge reconnaît tant l'excellent que le moins bon, Ion, s'il est vraiment expert, devrait être « juge compétent » (''kritês hikanos'') de tous les poètes, non d'Homère seul. Ion sent le piège, « il semblerait » (''éoiken ge''), répond-il, avec réticence, mais accepte la conclusion tout en maintenant son exclusivité homérique. La contradiction est désormais pleinement formulée : Ion prétend posséder une compétence à prétention universelle (il peut juger tout ce que dit Homère, qui parle de tout) tout en confessant une incompétence universelle sur les autres poètes qui parlent des mêmes choses. === 532c-533c : le principe de totalité de la ''technê'' === Socrate formule alors le principe méthodologique central : toute ''technê'' est un ''tout'' (''holon''). Il est remarquable qu'il introduise ici la ''technê'' poétique avec un prudent ''pou'' (« je suppose ») : « ποιητικὴ γάρ πού ἐστιν τὸ ὅλον » (532c7-8), « car il y a, je suppose, un art poétique comme un tout ». Ce ''pou'' n'est pas anodin. Rijksbaron, suivi par d'autres, estime que la ''technê'' poétique n'est introduite ici qu{{'}}''argumenti causa'', pour les besoins de la démonstration, sans que Platon lui reconnaisse d'existence effective. Cette lecture est cohérente avec l'ensemble du dialogue et elle est commune aujourd'hui, mais on peut aussi, plus prudemment, y voir une simple réserve rhétorique. Socrate multiplie alors les exemples de ''technai'' réelles où le principe s'applique : * La peinture (532e-533a) : existe-t-il quelqu'un d'expert sur Polygnote seul, capable d'expliquer ses réussites et ses échecs, mais qui reste « sans voix, endormi et sans rien à dire » devant les autres peintres ? Non, bien sûr. * La sculpture (533b) : même démonstration avec Dédale de Métion, Épeios de Panopée, Théodore de Samos. * La musique, flûte, cithare, chant à la cithare (533b-c) : même principe ; personne n'est expert d'Olympos ou de Thamyras seulement. * La rhapsodie elle-même (533c) : personne n'est expert de Phémios (le rapsode ithacien de l{{'}}''Odyssée'') seul et incapable de juger Ion d'Éphèse. Chaque exemple renvoie à des figures réelles, mythiques ou historiques, et évoque un domaine entier où le principe est évidemment valide. Socrate souligne qu'« il importe peu que l'on prenne ''telle ou telle'' ''technê'' comme illustration : la même méthode d'examen vaudra pour toutes les ''technai'' » (532d-e). La conclusion de ce mouvement est la suivante : si la poésie était une ''technê'', son expert serait capable de juger tous les poètes également. Or Ion ne peut parler bien que d'Homère. Donc, ou bien la poésie n'est pas une ''technê'', ou bien Ion n'est pas un expert. En prenant la ''poiêtikê'' comme tout, Socrate tend à unir, dans un même objet d'analyse, composition (le poète) et interprétation (le rapsode). L'examen dialectique paraît englober toute la chaîne. === 533c : l'aveu d'Ion et la demande d'explication === Ion, rendu perplexe (« je ne peux te contredire sur ce point »), revient cependant à sa conviction : « Je suis conscient que sur Homère je parle mieux que quiconque… et tous les autres disent que je parle bien. Mais regarde ce que cela signifie ». Cette demande d'éclaircissement marque la transition vers la partie centrale. Socrate n'insiste pas sur la réfutation dialectique. Il offre à Ion une forme de consolation, dont le statut est précisément l'un des points les plus débattus du dialogue : si l'on suit Rijksbaron ou Aguirre, c'est une consolation empoisonnée, une apparente promotion qui se révèle être, au fil du développement, une disqualification ; si l'on suit Murray ou Stern-Gillet, la doctrine que Socrate va développer peut être prise plus au sérieux qu'on ne le dit, ou à tout le moins comporter une ambivalence. La question mérite d'être posée dès ce seuil, car elle engage la lecture de toute la section centrale. == III. Partie centrale (533c-536d) : l{{'}}''enthousiasmos'' et la chaîne magnétique == === 533c-534e : la métaphore de la pierre magnétique === Socrate annonce : « Je vais te montrer de quoi il s'agit » (''erchomai ge soi apophanoumenos''). Ce qui permet à Ion de bien parler d'Homère ne serait pas une ''technê'' mais une « puissance divine » (''theia dynamis'', 533d3). Socrate développe alors l'une des métaphores les plus célèbres de l'œuvre platonicienne. La pierre qu'Euripide appelait « Magnésienne » (fragment 571 Nauck, tiré de l{{'}}''Oineus'') et que la plupart appellent « Héraclée », la pierre aimantée, non seulement attire les anneaux de fer, mais leur transmet sa propre force d'attraction, si bien qu'ils peuvent à leur tour attirer d'autres anneaux, formant une chaîne. De même la Muse, directement (''autê'', « par elle-même », et non par quelque intermédiaire technique), rend les poètes ''entheoi'' (« inspirés », littéralement « qui ont le dieu en eux ») et, à travers ces inspirés, fait de toute une ligne d'autres personnes des ''enthousiazontes''. Le passage est d'une grande densité sémantique. Les verbes ''artaô, anartaô, exartaô'' (« pendre, être suspendu ») disent la dépendance du poète à l'égard de la source divine. La syntaxe elle-même, comme le suggère Omert Schrier (cité par Rijksbaron), adopte un rythme qui imite presque iconiquement le frémissement corybantique. Il existe enfin une distinction sémantique fine, mais significative, entre ''entheoi'' (les poètes, qui ''ont'' le dieu en eux) et ''enthousiazontes'' (les rapsodes et spectateurs, que l'inspiration reçue par transmission met en mouvement). La description, si on la prend à la lettre, rompt avec une part importante de la tradition poétique grecque. Comme le souligne von der Walde, les poètes archaïques, Homère, Hésiode, Pindare, ne se présentent pas, dans leurs propres textes, comme passifs et possédés. L'invocation aux Muses chez Homère (''Iliade'' II, 480-492) ou Hésiode (''Théogonie'' 104-115) n'implique pas, à première vue, extase ou perte de conscience. C'est Platon qui, dans l{{'}}''Ion'', les ''Lois'' (719c) et le ''Phèdre'', articule fortement l'image du poète à la figure du ''mainomenos'' (fou), du ''mantis'' en transe, de la Pythie sur son trépied. Le « ''palaios mythos'' » dont parlent les ''Lois'' est, selon plusieurs interprètes, plus une reconstruction platonicienne qu'une tradition ancienne attestable. Reste que d'autres sources archaïques (certains hymnes, certains fragments lyriques) peuvent être lues dans le sens d'une continuité partielle : le dossier n'est pas entièrement à sens unique. === 534a-b : poètes lyriques, corybantes, bacchantes === Socrate élargit l'analyse aux poètes lyriques (''melopoioi''). Ceux-ci ne composeraient pas leurs beaux vers quand ils sont ''emphrones'' (dans leur bon sens), mais seulement quand ils sont « entrés dans l'harmonie et dans le rythme ». Les comparaisons s'accumulent : les corybantes ne dansent pas quand ils sont dans leur bon sens, les bacchantes ne tirent du miel et du lait des fleuves que quand elles sont possédées. Le jeu phonétique est savant : ''melopoioi'' (534a1, a6) résonne avec ''melê'' (chants, 534a2), ''meli'' (miel, 534a5) et ''melirryton'' (qui coule comme du miel, 534b1). Le tissage sonore renforce l'analogie et tend à dissoudre les frontières conceptuelles entre poètes, corybantes et bacchantes. Socrate livre alors l'une des définitions les plus fameuses de l{{'}}''Ion'' : le poète est « chose légère, ailée et sacrée » (''kouphon… ptênon… hieron''), « incapable de composer avant d'être inspiré, hors de lui et qu'en lui il n'y ait plus de raison » (534b). La métaphore de l'abeille, commune dans la tradition poétique grecque (Pindare, Bacchylide, Callimaque, Euripide), est reprise : le poète butine les sources et les jardins des Muses, ce qui évoque simultanément la douceur du chant et la dépossession, ''kouphon'' peut aussi signifier « vide ». Les ailes et le vol rapprochent le poète du chamane. Toute cette imagerie oriente vers l'idée que l'activité poétique ne résulterait pas d'un savoir, mais d'un don divin exceptionnel et transitoire. Le verdict est posé en 534c1 et répété en 535a4 : c'est par ''theia moira'' (« allotissement divin ») que les poètes font ce qu'ils font, ''ou technêi'' (« non par art »). On notera la quasi-équivalence, dans ce passage, des termes ''theia dynamis'' (533d3), ''theia moira'' (534c1, 535a4), ''katokochê'' (« possession », 533e7) et ''enthousiasmos'' (533e5, 535c2, 536b3). Platon accumule les expressions synonymes pour souligner le caractère non rationnel de l'activité poétique, ce qui ne préjuge pas encore de la valeur finale qu'il accorde à cette inspiration. === 534c-535a : les exemples confirmants === Socrate illustre alors son propos par trois considérations : # Spécialisation des inspirations : chaque poète n'est capable de bien composer que dans le genre où la Muse l'a poussé, dithyrambes, encomiums, hyporchèmes, épopées, iambes. « Dans les autres genres, il est nul ». La diversité des talents poétiques trahirait ainsi leur origine divine : si c'était une ''technê'', un poète devrait pouvoir exceller en tous genres. # Tynnichos de Chalcis (534d) : preuve la plus belle, dit Socrate. Ce poète par ailleurs médiocre (''phaulotatos poiêtês'') a composé un péan en l'honneur d'Apollon que tout le monde chante encore et qui est « presque la plus belle de toutes les chansons ». Il le disait lui-même : « une invention des Muses ». Le cas illustrerait que le dieu parle à travers les poètes, comme l'oracle, précisément pour que les hommes sachent que ces beaux poèmes ne sont pas humains (''ouk anthrôpina''), mais divins (''theia''), les poètes n'étant que des ''hermêneis tôn theôn'' (« interprètes des dieux »), chacun possédé par le dieu qui l'a pris. On observe ici que le terme ''hermêneus'' s'est déjà déplacé par rapport à l'usage initial (530c) : il ne désigne plus celui qui ''explique'' le texte, mais celui qui ''transmet passivement'' le message divin. # L'unicité rhapsodique d'Ion : c'est pour cette raison que le dieu, par dessein, chanterait les plus beaux vers à travers le poète le plus médiocre, pour que nul n'attribue les œuvres divines à un talent proprement humain. Ion, à ce point, avoue être « touché » par les paroles de Socrate (535a2). Il concède : « Les bons poètes nous transmettent par ''theia moira'' ces choses qui viennent des dieux ». Et quand Socrate lui demande si les rapsodes ne sont pas, eux aussi, les interprètes des poètes, Ion acquiesce. La formule qu'il accepte a un poids considérable : les rapsodes sont « ἑρμηνέων ἑρμηνῆς » (535a8), « des interprètes d'interprètes ». Selon la lecture qu'on retient, cette formule peut marquer soit l'effondrement de la position d'Ion (il ne serait plus qu'un maillon passif dans une chaîne d'ignorance transitoire), soit, de façon plus ambivalente, l'indication que l'activité rhapsodique trouve son sens ailleurs que dans la possession d'une ''technê'', sans être pour autant insignifiante. Penelope Murray, par exemple, tient que le passage central a une tonalité partiellement « élogieuse » (''eulogistic''), même s'il retire aux poètes la ''technê'' traditionnellement reconnue. === 535b-d : l'état mental du rapsode === Socrate pose alors la question : quand Ion récite Homère, Ulysse sautant sur le seuil, Achille s'élançant contre Hector, les lamentations d'Andromaque, d'Hécube, de Priam, est-il ''dans son bon sens'' (''emphrôn'') ou ''hors de lui'' (''exô heautou''), son âme s'imaginant dans les événements qu'il narre ? Ion avoue sans détour : « Quand je récite quelque chose de pitoyable, mes yeux se remplissent de larmes ; quand c'est effrayant ou terrible, mes cheveux se dressent et mon cœur palpite ». Cette description recoupe ce que Gorgias avait décrit dans l{{'}}''Éloge d'Hélène'' (§9), et elle n'est pas très éloignée, dans la lettre, de ce qu'Aristote nommera plus tard ''catharsis'' par ''eleos'' et ''phobos'', même si Platon et Aristote évaluent ces mêmes phénomènes de manière diamétralement opposée. Socrate pousse alors l'argument (535d) : peut-on être ''emphrôn'' quand, orné d'une étoffe bariolée et de couronnes d'or, on pleure pendant des sacrifices et des fêtes solennelles sans rien avoir perdu, ou qu'on a peur au milieu de ''vingt mille personnes'' (''dismyrioi'', chiffre peut-être hyperbolique) qui ne sont pas du tout hostiles ? La disproportion entre la situation objective (spectacle avec couronne d'or) et la réaction affective (larmes, tremblements) tend à montrer que le rapsode est ''ekphrôn'', hors de sa raison. === 535d-536d : le spectateur, dernier anneau === Socrate montre ensuite que l'état du rapsode se transmet aux spectateurs. Ion le confirme : « Je les vois, du haut de l'estrade, pleurant et me regardant terrifiés, stupéfaits de ce que j'énonce… Car il faut que je leur prête grande attention : s'ils pleurent, je rirai en touchant l'argent ; s'ils rient, c'est moi qui pleurerai pour l'argent perdu ». Le mercantilisme avoué d'Ion, qui rappelle l{{'}}''Hippias Majeur'' 282b-283b et constitue, aux yeux de Platon, un trait commun aux rapsodes et aux sophistes, n'arrange pas sa position. Surtout, Ion décrit l'effet de contagion affective qu'il produit. Socrate peut alors donner sa forme finale à la métaphore (535e-536a) : {| class="wikitable" ! Anneau !! Occupant |- | Premier anneau || Le poète (Homère) |- | Anneau intermédiaire || Le rapsode-acteur (Ion) |- | Dernier anneau || Le spectateur |} La divinité, à travers tous, « attire l'âme des hommes là où elle veut ». Chaque dieu suscite une chaîne propre : Orphée attire les uns, Musée les autres, Homère la plupart. Ion est possédé par Homère, ce qui expliquerait pourquoi il ne peut bien parler que de lui, et reste « sans voix » devant les autres poètes (536b-c). Même les corybantes ne sont sensibles qu'à la mélodie du dieu qui les possède. La conclusion, en 536c-d, est nette : « Ce n'est pas par une ''technê'', mais par ''theia moira'' que tu es un formidable louangeur d'Homère ». Ion ne serait donc pas un technicien de la poésie. Que cela constitue, comme le pense la tradition interprétative majoritaire, une disqualification radicale, ou comme d'autres le soutiennent, une caractérisation plus ambivalente, c'est un point sur lequel on peut encore débattre. == IV. Troisième partie (536d-541e) : retour à la ''technê'' par l'examen des passages == === 536d-537a : le refus d'Ion et la transition === Ion, touché dans sa dignité professionnelle, refuse pourtant la description que Socrate fait de lui. Il ne peut croire qu'il est « hors de lui ou possédé ». Il invite Socrate à venir l'écouter en personne. Socrate esquive une fois encore l{{'}}''epideixis'' et propose une nouvelle question préalable, c'est la troisième partie qui s'ouvre. La stratégie de cette partie est de reprendre l'hypothèse de la ''technê'' rhapsodique comme si elle était encore vraie, pour en examiner concrètement le contenu. Si Ion est expert de tout ce que dit Homère, sur quoi précisément est-il expert ? Socrate va parcourir une série de passages homériques en demandant, pour chacun, quelle ''technê'' particulière est compétente pour en juger. === 537a-c : le passage de l'aurige (Nestor à Antilocos) === Socrate se propose de citer un passage sur l'art de l'aurige, mais Ion l'interrompt pour le réciter lui-même : il s'agit d{{'}}''Iliade'' XXIII, 335-340, les conseils de Nestor à son fils Antilocos pour prendre le tournant dans la course funèbre en l'honneur de Patrocle. Question : qui jugera le mieux si Homère dit cela correctement, un médecin ou un aurige ? Ion concède : l'aurige, « parce qu'il possède cet art ». Socrate formule alors le principe de spécialisation des ''technai'' (537c-d) : « À chaque art n'a-t-il pas été accordé par la divinité la fonction de connaître un objet déterminé ? Car ce que nous connaissons par l'art du pilote, nous ne le connaissons pas par celui du médecin ». Le principe s'applique à toutes les ''technai'' (''kata pasôn tôn technôn''). La différence entre les ''technai'' repose sur la différence des objets connus : à objets différents, ''technai'' distinctes ; à même objet, même ''technê'' (illustration : l'arithmétique, par laquelle Socrate et Ion savent tous deux qu'il y a cinq doigts à la main). Corollaire (538a-b) : celui qui ne possède pas une ''technê'' n'est pas capable de juger ce qui est dit ou fait selon cette ''technê''. Par conséquent, pour le passage sur la course de chars, c'est l'aurige qui juge, non Ion. La distinction est cruciale : posséder la ''technê'' rhapsodique, si elle existe, n'est pas posséder la ''technê'' de l'aurige. Le rapsode est expert ''en tant que rapsode'', non en tant qu'aurige. On peut signaler ici une objection connue, formulée notamment par Goethe : à la question de savoir si l'aurige ou le poète juge mieux ce que Nestor dit à Antilocos, on pourrait soutenir que le poète juge mieux, ''en tant que poète'', car l'aurige saurait seulement si Homère dit des choses techniquement exactes, tandis que le poète saurait si Homère les dit ''de manière convenable'' pour sa fiction. L'argument socratique suppose en réalité qu'il n'y a pas de critère proprement poétique distinct des critères techniques. Pour qui n'accorde pas cette prémisse, une partie de la démonstration perd de sa force. === 538b-d : le médecin, le pêcheur === Socrate enchaîne les exemples : * Le médecin (538b-c) : le passage où Hécamède verse au blessé Machaon une boisson de vin pramnien avec du fromage de chèvre râpé (''Iliade'' XI, 639-640). Qui juge ? La médecine, pas la rhapsodie. * Le pêcheur (538d) : le passage où un plomb descend dans l'eau « pour apporter malheur aux poissons voraces » (''Iliade'' XXIV, 80-82). Qui juge ? La pêche, pas la rhapsodie. === 538e-539d : le devin et l'élargissement de la liste === Socrate anticipe avec une ironie fine qu'Ion pourrait lui demander si la ''technê'' du devin fait aussi partie de celles capables de juger Homère. Oui, répond-il, et il cite deux exemples : * La prophétie du devin Théoclymène, descendant de Mélampous, aux prétendants dans l{{'}}''Odyssée'' XX, 351-357 (« Malheureux ! Quel mal vous frappe ? ») ; * L'augure du combat où un aigle porte un serpent vivant sur l'armée troyenne, en ''Iliade'' XII, 200 et suiv. Le mouvement est révélateur : à mesure que Socrate parcourt la poésie homérique, il indique que ''chaque passage'' relève de la compétence d'une ''technê'' particulière ''autre que la rhapsodie''. Le rapsode n'est expert ni en conduite de char, ni en médecine, ni en pêche, ni en divination. Que reste-t-il, alors, à la ''technê'' rhapsodique ? === 539e-540b : la question inverse === Socrate retourne la question à Ion : puisque tu es plus expérimenté que moi en matière homérique, dis-moi toi-même quels sont les passages qui concernent spécifiquement le rapsode et sa ''technê'', ceux qu'il lui revient, à lui plus qu'à tout autre, d'examiner et de juger. Ion répond avec grandiloquence : « Tous, Socrate ». Socrate pointe immédiatement la contradiction : l'ordre vient d'être établi qu'à ''technê'' distincte correspond objet distinct ; Ion a reconnu que la ''technê'' rhapsodique était distincte des autres ; donc elle ne peut pas connaître ''tous'' les objets. Ion se rétracte : « Tous sauf, peut-être, ces choses-là », c'est-à-dire, précise Socrate, « à peu près tout ce qui concerne les ''autres technai'' ». Ion tente alors une formulation plus étroite (540b) : ce que le rapsode connaîtrait, ce serait « les choses qui conviennent à un homme, à une femme, à un esclave, à un libre, à un gouverné, à un gouvernant ». Mais Socrate démonte cette défense en série : ce qui convient de dire à un pilote dans la tempête, le pilote le sait mieux ; ce qui convient au malade, le médecin le sait mieux ; à l'esclave bouvier face à un bœuf enragé, le bouvier le sait mieux ; à la fileuse sur le travail de la laine, la fileuse le sait mieux… === 540d-541c : le repli sur le général (''stratêgos'') === Acculé, Ion joue alors une dernière carte : le rapsode connaîtrait ce qui convient de dire à un général qui harangue ses soldats. Socrate feint la surprise : « L'art du rapsode serait-il donc celui du général ? » Ion affirme qu'il connaîtrait effectivement ce qui convient à un général, et Socrate rétorque : « Alors tu es peut-être aussi doué pour la stratégie, Ion ». La question suit : quand tu distingues les bons chevaux, le fais-tu en tant que cavalier ou en tant que citharède ? En tant que cavalier. Mais, pour les affaires militaires, les connais-tu en tant que bon rapsode ou en tant que général ? Ion s'égare : « Il me semble qu'il n'y a pas de différence ». Socrate resserre la prise : « Comment, pas de différence ? L'art du rapsode et celui du général sont-ils un seul art, ou bien deux ? », « Il me semble que c'est un seul art ». Socrate en tire alors la conclusion (541a) : tout bon rapsode est donc bon général, et inversement. Ion accepte la première implication mais refuse la seconde, il pense donc que le bon rapsode est nécessairement bon général, mais que le bon général n'est pas nécessairement bon rapsode. Cette dissymétrie éclaire la structure de la croyance d'Ion : pour lui, le critère fondamental du savoir semble être l'habileté rhétorique et l'effet émotionnel sur l'auditoire. Puisque le général doit galvaniser ses hommes, et que le rapsode maîtrise cet art, le rapsode englobe le général, mais pas l'inverse. Ion confond alors la performance discursive avec la compétence pratique : le général sur le champ de bataille doit connaître les manœuvres, le terrain, l'ennemi, la logistique, et non seulement exhorter. Socrate pousse l'argument à son terme (541b) : puisque Ion est le meilleur rapsode de Grèce, il serait donc aussi le meilleur général de Grèce. Pourquoi alors ne commande-t-il pas des armées ? Parce que, répond Ion à côté de la question, sa cité (Éphèse) est sous tutelle athénienne et n'a pas besoin de général, et ni les Athéniens ni les Lacédémoniens ne le choisiraient, pensant se suffire à eux-mêmes. Socrate, ironique, renverse alors cet argument (541c-d) en citant des généraux ''étrangers'' que les Athéniens ont effectivement élus, Apollodore de Cyzique, Phanosthène d'Andros, Héraclide de Clazomènes. Éphèse n'est pas une cité inférieure, et les Éphésiens sont Athéniens par origine (cf. Strabon, XIV, 1 ; Pausanias, VII, 2, 5). Les Athéniens pourraient très bien élire Ion d'Éphèse s'il était vraiment un bon général. Le choix du ''stratêgos'' comme ''technê'' ultime n'est pas indifférent : cette fonction est élective à Athènes (contrairement à la plupart des magistratures, tirées au sort), ce qui suppose que les citoyens identifient le savoir militaire comme un savoir ''réel'', vital pour la survie de la polis. Hors du théâtre où Ion manipule les émotions du public, la pratique politique concrète paraît reposer sur une distinction implicite entre savoir effectif et performance rhétorique. Goethe jugeait sévèrement la « méchanceté proprement aristophanesque » de ce passage ; d'autres commentateurs y voient au contraire l'un des arguments décisifs du dialogue, en ce qu'il oblige Ion à choisir entre un savoir sérieux et une simple pose. === 541e : la rupture du dialogue === Socrate rompt alors le dialogue avec le « ἀλλὰ γάρ », « mais en réalité ». Ce marqueur, comme le souligne Rijksbaron, est particulièrement abrupt : Socrate se prive lui-même de la possibilité de continuer à questionner Ion, pour passer au résumé conclusif. Le ton se raidit. L'emploi de l'indicatif conditionnel (''ei alêthê legeis'', « si tu dis la vérité ») marque un scepticisme manifeste. == V. Épilogue (541e-542b) : le dilemme final == === 541e-542a : l'accusation === Socrate formule directement son accusation. Ion est ''adikos'' (injuste) : il a promis une ''epideixis'' sur Homère (530d4-5), il a prétendu posséder une connaissance à prétention universelle, il a maintenu qu'il ''connaissait beaucoup de belles choses'' sur le poète, mais il n'a cessé d'esquiver la démonstration que Socrate lui réclamait. Comme Protée, le dieu marin de l{{'}}''Odyssée'' IV (capture par Ménélas aux vers 384-461), dont la capacité de métamorphose est proverbiale, et que Platon utilise dans l{{'}}''Euthydème'' 288b-c pour critiquer les sophistes, Ion prend mille formes, « va de haut en bas », jusqu'à se présenter comme général pour ne pas avoir à montrer en quoi il est « habile dans la sagesse homérique ». L'analogie protéenne prend ici tout son sens. Protée change de forme pour échapper à qui voudrait lui arracher la vérité. Ion, de même, change d'identité professionnelle, rapsode, juge de ''technai'', conseiller de rôles sociaux, général, pour ne pas avoir à produire le contenu positif de sa ''technê''. On peut suivre Aguirre lorsqu'il voit dans cette figure l'image d'un savoir sans identité stable, dont la consistance n'excède pas le temps du spectacle. === 542a-b : l'alternative === Socrate pose alors la dichotomie finale, dans une construction conditionnelle rigoureuse : * Si Ion possède une ''technê'' (''ei men… technikos ôn'') et ne l'a pas montrée, alors il ment et il est injuste (''adikos'') envers Socrate. * Si Ion ne possède pas de ''technê'' (''ei de mê technikos ei'') mais est « possédé par Homère par ''theia moira'' » et dit sans savoir beaucoup de belles choses, alors il n'est pas injuste. « Choisis donc ce que tu préfères qu'on te considère : homme injuste ou homme divin (''adikos anêr einai ê theios'') ». La structure du dilemme est exemplaire de l'ironie socratique. Formellement, elle offre un choix. Mais les deux termes ne sont pas équivalents dans le lexique du dialogue : * Être ''technikos'' supposerait que l'on possède un savoir authentique, or Ion vient de reconnaître, passage après passage, qu'il n'en a aucun clairement identifiable. Choisir cette branche supposerait d'admettre une certaine imposture. * Être ''theios'' sonne flatteusement, mais c'est, dans le lexique platonicien tel qu'il s'est déployé dans l{{'}}''Ion'', proche d{{'}}''ekphrôn'' : possédé, sans savoir, simple canal. La noblesse apparente peut ainsi dissimuler, pour qui relit tout le dialogue, un statut de médiateur passif. Ion tranche : « Il y a une grande différence, Socrate : il est bien plus beau d'être considéré divin ». Socrate conclut : « Eh bien, le plus beau est à ton actif : tu es, selon nous, un louangeur d'Homère parce que tu es divin et non technicien (''theios kai mê technikos'') ». Les derniers mots font écho aux premiers vrais mots de Socrate après le prologue (530b5-11) : l'inclusion est soignée, le dialogue a fait le tour de la question. Le qualificatif « ''par' hêmin'' » (« auprès de nous », 542b3) que Socrate ajoute mérite attention. Il indique que cette reconnaissance est conditionnelle, relative au point de vue de Socrate et de son petit cercle. On peut, avec Penelope Murray, voir dans cette précision la marque d'une réserve ironique : l'idée qu'Ion soit inspiré serait, ''aux yeux de Socrate'', une hypothèse de travail plutôt qu'une conviction pleine. L{{'}}''ho Iôn'' solennel du début peut ainsi devenir ''theios Iôn'', mais dans un sens qui n'est pas nécessairement celui qu'Ion lui-même entend. == VI. La portée philosophique du dialogue == === 1. La dualité structurante : ''technê'' et ''enthousiasmos'' === L'architecture conceptuelle du dialogue repose sur l'opposition entre deux modèles du savoir : * La ''technê'' est rationnelle, communicable, spécifique à un domaine d'objets, et implique la capacité de rendre raison de son savoir (''logon didonai''). Elle est le modèle du savoir véritable que Platon thématisera pleinement dans le ''Gorgias'' et la ''République''. * L{{'}}''enthousiasmos'' (ou ''theia moira'', ou ''theia dynamis'') est non rationnel, opaque, transitoire, imprévisible, et ne se transmet pas par enseignement. Il produit des effets, parfois de beaux poèmes, mais ne constitue pas, dans les termes du dialogue, un savoir. Cette opposition est structurante. Les parties I et III (réfutation par la ''technê'') encadrent le noyau central (description de l{{'}}''enthousiasmos''). En ne laissant à Ion, au bout du compte, que l{{'}}''enthousiasmos'', le dialogue tend à placer l'activité poétique en marge de ce qu'il nomme savoir rationnel. Aristote contredira ce point de vue dans la ''Poétique'' (1460b14-15) : « la rectitude de la politique et celle de l'art poétique ne sont pas la même, ni celle d'un autre art et celle de l'art poétique ». Pour le Platon de l{{'}}''Ion'' au moins, en revanche, la poésie, tant qu'elle est rapportée à l{{'}}''enthousiasmos'', semble ne pas pouvoir fournir de fondement à la pédagogie du citoyen. Reste que ce jugement n'épuise pas nécessairement la pensée platonicienne sur la poésie : le ''Phèdre'' (245a) distingue plusieurs formes de ''mania'' et accorde à l'inspiration poétique une place positive, ce qui invite à lire l{{'}}''Ion'' moins comme un dernier mot que comme une pièce d'un ensemble plus mobile. === 2. L'enjeu éducatif et politique === Le dialogue ne se réduit pas à une querelle esthétique. L'enjeu porte sur le modèle d'éducation du citoyen grec. La culture grecque traditionnelle repose en partie sur la ''paideia'' homérique : on apprend à vivre en mémorisant, chantant, interprétant les poèmes épiques, considérés comme dépositaires du savoir éthique, politique, militaire, religieux. Les rapsodes, et surtout les poètes, prétendent être les pédagogues du peuple. En déniant à la poésie le statut de ''technê'', le dialogue tend à contester aux poètes et rapsodes ce droit pédagogique. Si Homère ne possède aucun savoir véritable, ni en médecine, ni en stratégie, ni en gouvernement, ni en éducation, alors il ne peut guider le citoyen vers l'excellence morale. Ce thème sera repris et systématisé dans la ''République'' X, 599b-e, où Socrate demande à Homère : « Quelle guerre se rappelle-t-on qu'il ait bien conduite ? Quelle cité a-t-il fondée ? Quelle loi a-t-il donnée ? » Aucune. L{{'}}''Ion'' peut donc être lu, de ce point de vue, comme une anticipation de la critique plus large développée dans la ''République''. La métaphore de la chaîne magnétique peut, sous cet angle, être lue comme portant un diagnostic politique. L'unité qu'elle décrit serait précaire : elle naît dans le moment du spectacle, s'évanouit à sa fin ; elle homogénéise les différences individuelles et sociales ; elle repose sur la connexion des émotions ; elle suspend, pour un temps, l'autonomie rationnelle. À cette unité que l'on peut appeler liturgique, Platon oppose, non dans l{{'}}''Ion'' lui-même, mais dans l'ensemble de son œuvre, une unité plus durable, celle qu'assure selon lui l'examen philosophique. Il faut se garder, pour autant, de faire dire au seul ''Ion'' ce qui n'apparaît clairement que dans la ''République''. === 3. La figure du rapsode comme intermédiaire compromis === Le choix de faire dialoguer Socrate avec un rapsode plutôt qu'avec un poète n'est pas anodin. Le rapsode cumule deux fonctions problématiques : * il est récitant, avec une dimension émotionnelle et collective ; * il est interprète (exégète), avec une prétention à éclairer le texte. Cette double fonction permet à Platon d'étendre la critique : en visant le rapsode, il atteint à la fois la performance publique de la poésie et la prétention interprétative (notamment les interprétations allégoriques évoquées en 530c-d, celles de Métrodore de Lampsaque, Stésimbrote de Thasos, Glaucon). Dans une culture largement orale, poète et rapsode constituent deux moments inséparables du même processus poétique, ce que la métaphore de la chaîne magnétique représente par les anneaux successifs. Le rapsode apparaît par ailleurs comme un parent des sophistes : vie itinérante, exhibitions rémunérées (''epideixis''), culte de la performance oratoire, relation mercenaire au public. Dans l{{'}}''Hippias Mineur'' et l{{'}}''Hippias Majeur'', Platon tisse explicitement cette connexion. === 4. L{{'}}''hermêneus'' et la question de la médiation === La notion d{{'}}''hermêneus'' mérite attention. Au début du dialogue (530c), le rapsode est ''hermêneus'' au sens d{{'}}interprète qui explique, commente, éclaire la pensée du poète. Dans la partie centrale (534e, 535a), le terme se déplace : les rapsodes deviennent ''hermêneis hermêneôn'', « interprètes d'interprètes », c'est-à-dire simples intermédiaires d'un message dont ni eux ni les poètes ne sont les auteurs. La médiation herméneutique active tend à se transformer en transmission passive. Ce glissement du même mot trace, à lui seul, une bonne partie de la trajectoire argumentative du dialogue. Il soulève, accessoirement, une question générale : peut-on comprendre un texte dont on ne partage pas le savoir, dont on n'est pas soi-même l'auteur ? Le Socrate de l{{'}}''Ion'' semble répondre que l'interprétation authentique suppose la possession d'une ''technê'' sur le contenu interprété. D'autres dialogues, et d'autres traditions interprétatives, donneront des réponses différentes. === 5. La dimension comique et l'ironie === L{{'}}''Ion'' a aussi une dimension comique assumée. Aguirre rapproche Ion du type de l{{'}}''alazôn'' (le fanfaron qui se donne pour plus qu'il n'est) et Socrate de l{{'}}''eirôn'' (celui qui se diminue) de la comédie ancienne. L'opposition est adoucie par Platon : Ion n'est pas un rustre grotesque, il est affable et sincèrement intéressé par la conversation ; Socrate n'est ni sarcastique ni humiliant, et reste dans le registre de son ironie habituelle. Le comique naît des décalages, la solennité du salut initial, la vanité d'Ion, l'absurde du raisonnement sur la stratégie, la grandiloquence du « Tous, Socrate ! » face à la demande de préciser une compétence. Cette tonalité comique n'est pas étrangère à la gravité philosophique : elle en est souvent, chez Platon, un vecteur. === 6. Poésie, vérité, mensonge === L{{'}}''Ion'' effleure enfin la question, qui sera pleinement thématisée dans la ''République'' II (376c-383c), du rapport entre poésie et vérité. Si le poète inspiré ne sait pas ce qu'il dit, il ne peut être tenu pour garant de la vérité de son discours. La poésie peut être belle sans être vraie au sens fort que Platon accorde à ce mot. Elle produit des effets sur l'âme, des ''pathê'' collectifs, mais ne fait pas nécessairement connaître. C'est sur cette base que la ''République'' II accusera Homère et Hésiode d'avoir propagé de fausses représentations des dieux et de nourrir l'ignorance chez leurs auditeurs. L{{'}}''Ion'', plus modestement, prépare ce terrain sans encore le labourer. == Conclusion == L{{'}}''Ion'', malgré sa brièveté, accomplit plusieurs choses à la fois. En une demi-heure de conversation simulée, Platon : # expose le statut ambigu de la rhapsodie, pratique culturelle centrale dans l'éducation grecque traditionnelle ; # élabore l'opposition, qui sera durablement féconde, entre ''technê'' rationnelle et transmissible, d'une part, et ''enthousiasmos'' non rationnel et imprévisible, d'autre part ; # formule l'une des métaphores les plus durables de la poétique occidentale, la chaîne magnétique de l'inspiration,, que Longin, puis les Romantiques, reprendront ; # anticipe, sur un mode plus restreint, la critique que le livre X de la ''République'' développera contre la poésie mimétique ; # met en place un schéma socratique typique, où la réfutation dialectique se double d'une fausse concession qui enferme l'interlocuteur dans une alternative contrainte. À la fin, Ion choisit d'être « divin ». Selon la lecture majoritaire, il y perd beaucoup : la ''technê'' que l'examen lui a contestée, et une part de la parole autonome que la théorie de l'inspiration lui dénie. Selon une lecture plus retenue, il gagne une place, mineure mais non nulle, dans une économie divine de la parole ; reste à savoir quel prix Platon lui-même attache à cette place. Dans les deux cas, ce qui semble clair, c'est que la parole pleinement responsable tend à se déplacer, dans le dialogue, vers la figure du philosophe. Ce bref texte, longtemps jugé mineur, apparaît à l'examen comme une pièce articulée du dispositif platonicien, une préparation conceptuelle à la « querelle ancienne » (''palaia diaphora'', ''République'' X, 607b) entre philosophie et poésie, dont il pose les premiers termes sans encore les systématiser. == Plan récapitulatif des grandes articulations == {| class="wikitable" |- ! Passage !! Contenu |- | 530a-531a || Prologue : rencontre, salutations, présentation de la rhapsodie, question sur l'exclusivité homérique |- | 531a-533c || Première partie : argument du ''tout'', la ''technê'' comme unité de jugement ; exemples (arithmétique, médecine, peinture, sculpture, musique, rhapsodie) |- | 533c-534e || Partie centrale I : la pierre magnétique ; les poètes ''entheoi'' ; comparaison avec les corybantes et les bacchantes ; Tynnichos de Chalcis |- | 534e-536d || Partie centrale II : les trois anneaux (poète, rapsode, spectateur) ; l'émotion rhapsodique ; conclusion sur la ''theia moira'' |- | 536d-538d || Troisième partie I : principe de spécialisation des ''technai'' ; analyse des passages (aurige, médecin, pêcheur) |- | 538d-540b || Troisième partie II : le devin ; retour à Ion et sa prétention universelle ; repli sur « ce qui convient à chacun » |- | 540b-541c || Troisième partie III : l'art du général ; raisonnement par l'absurde ; les généraux étrangers |- | 541c-542b || Épilogue : rupture du dialogue ; analogie protéenne ; dilemme final ; choix d'Ion |} == Bibliographie == === Éditions, traductions et commentaires === * Aguirre Santos, Javier, ''Platón. Platón y la poesía : Ion'', Madrid, Plaza y Valdés (coll. « Clásicos europeos »), 2013. * Allen, Reginald E. (trad.), ''Plato: Ion, Hippias Minor, Laches, Protagoras'', New Haven / London, Yale University Press, 1996. * Canto, Monique (trad., introd. et notes), ''Platon, Ion'', Paris, Flammarion (GF), 2{{e}} éd. 2001 (1{{re}} éd. 1989). * Capuccino, Carlotta, ''Filosofi e rapsodi. Testo, traduzione e commento dello Ione platonico'', Bologna, CLUEB, 2005. * Heitsch, Ernst (trad. et comm.), ''Platon, Ion oder Über die Ilias'' (''Platon Werke'', Band VII.3), Göttingen, Vandenhoeck & Ruprecht, 1997. * Méridier, Louis (éd., trad., notice), ''Platon. Œuvres complètes'', t. V, 1{{re}} partie : ''Ion, Ménexène, Euthydème'', Paris, Les Belles Lettres (Collection des Universités de France), 1931 (nombreuses rééditions). * Murray, Penelope, ''Plato on Poetry. Ion ; Republic 376e-398b ; Republic 595-608b'', Cambridge, Cambridge University Press, 1996. * Pradeau, Jean-François (trad., introd. et notes), ''Platon, Ion'', Paris, Ellipses, 2001. * Rijksbaron, Albert (éd.), ''Plato. Ion, or: On the Iliad'', Amsterdam Studies in Classical Philology 14, Leiden / Boston, Brill, 2007. * Saunders, Trevor J. (trad.), ''Plato, Early Socratic Dialogues'', London, Penguin, 2{{e}} éd. 2005. * von der Walde, Giselle, ''Poesía y mentira : la crítica de Platón a las poéticas de Homero, Hesíodo y Píndaro en el Ion y en República 2'', Bogotá, Universidad de los Andes, 2010. * Woodruff, Paul (trad.), ''Plato. Two Comic Dialogues : Ion and Hippias Major'', Indianapolis, Hackett, 1983. === Études critiques === * Bremer, John, ''Plato's Ion. Philosophy as Performance'', North Richland Hills (Texas), Bibal Press, 2005. * Brandwood, Leonard, ''The Chronology of Plato's Dialogues'', Cambridge, Cambridge University Press, 1990. * Diès, Auguste, ''Autour de Platon'', Paris, Beauchesne, 1927. * Finkelberg, Margalit, ''The Birth of Literary Fiction in Ancient Greece'', Oxford, Clarendon Press, 1998. * Flashar, Hellmut, ''Der Dialog Ion als Zeugnis platonischer Philosophie'', Berlin, Akademie-Verlag, 1958. * Ford, Andrew, ''The Origins of Criticism. Literary Culture and Poetic Theory in Classical Greece'', Princeton, Princeton University Press, 2002. * Heitsch, Ernst, « Die Argumentationsstruktur im Ion », ''Rheinisches Museum für Philologie'' 133, 1990, p. 243-259. * Janaway, Christopher, ''Images of Excellence. Plato's Critique of the Arts'', Oxford, Clarendon Press, 1995. * Kahn, Charles H., ''Plato and the Socratic Dialogue. The Philosophical Use of a Literary Form'', Cambridge, Cambridge University Press, 1996. * Ledbetter, Grace M., ''Poetics Before Plato. Interpretation and Authority in Early Greek Theories of Poetry'', Princeton, Princeton University Press, 2003. * Levin, Susan B., ''The Ancient Quarrel Between Philosophy and Poetry Revisited. Plato and the Greek Literary Tradition'', Oxford, Oxford University Press, 2001. * Lowenstam, Steven, « Is Literary Criticism an Illegitimate Discipline ? A Fallacious Argument in Plato's Ion », ''Ramus'' 22, 1993, p. 19-32. * Moore, John D., « The Dating of Plato's Ion », ''Greek, Roman and Byzantine Studies'' 15, 1974, p. 421-440. * Morris, Thomas F., « Plato's Ion on What Poetry Is About », ''Ancient Philosophy'' 13, 1993, p. 265-272. * Murray, Penelope, « Poetic Inspiration in Early Greece », ''Journal of Hellenic Studies'' 101, 1981, p. 87-100. * Murray, Penelope, « Inspiration and Mimesis in Plato », in A. Barker & M. Warner (éd.), ''The Language of the Cave'', Edmonton, Academic Printing and Publishing, 1992, p. 27-46. * Nightingale, Andrea W., ''Genres in Dialogue. Plato and the Construct of Philosophy'', Cambridge, Cambridge University Press, 1995. * Stern-Gillet, Suzanne, « On (Mis)interpreting Plato's Ion », ''Philosophy'' 79, 2004, p. 169-192. * Tigerstedt, Eugène N., ''Plato's Idea of Poetical Inspiration'', Helsinki, ''Commentationes Humanarum Litterarum'' 44, Societas Scientiarum Fennica, 1969. * Tigerstedt, Eugène N., « Furor Poeticus : Poetic Inspiration in Greek Literature Before Democritus and Plato », ''Journal of the History of Ideas'' 31, 1970, p. 163-178. * Verdenius, Willem Jacob, « L'Ion de Platon », ''Mnemosyne'' 11, 1943, p. 233-262. * Vicaire, Paul, ''Platon : critique littéraire'', Paris, Klincksieck, 1960. * Westermann, Hartmut, ''Die Intention des Dichters und die Zwecke der Interpreten. Zur Theorie und Praxis der Dichterauslegung in den platonischen Dialogen'', Berlin / New York, De Gruyter, 2002. * Wilamowitz-Moellendorff, Ulrich von, ''Platon'', Band 2 : ''Beilagen und Textkritik'', Berlin, Weidmann, 1919. {{AutoCat}} [[Catégorie:Commentaire philosophique]] 5n4k8pbw7am0n17m9panl9jtee76fjt Pour lire Platon 0 29731 765015 764623 2026-04-25T09:55:46Z PandaMystique 119061 765015 wikitext text/x-wiki == Introduction == {{version imprimable}} Ce livre propose de fournir au lecteur les connaissances nécessaires à la compréhension des œuvres de Platon. Il s'adresse aux débutants (par exemple, des élèves de terminale, mais également tous ceux qui souhaitent acquérir une culture générale ou découvrir ce philosophe sans avoir de culture philosophique particulière) et aux lecteurs intermédiaires ou avancés, c'est-à-dire à des lecteurs qui ont lu quelques dialogues parmi les moins difficiles et qui sont éventuellement familiers de quelques-unes des notions principales de Platon. Après une partie introductive, qui s'efforce de donner quelques outils simples et abordables, le ''Guide des Dialogues'' se compose de commentaires plus substantiels, sans être trop techniques, dans le but de progresser dans la lecture. Ce livre ne s'adresse pas aux spécialistes de Platon qui ne trouveront ici rien qu'ils ne connaissent déjà par la fréquentation assidue des dialogues et des commentateurs. == Table des matières == === '''[[/Premiers pas/]]''' === * [[Pour lire Platon/Premiers pas#Qui est Platon ?|1 Qui est Platon ?]] * [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit ?|2 Pourquoi Platon a-t-il écrit ?]] * [[Pour lire Platon/Premiers pas#Qu’a-t-il écrit ?|3 Qu’a-t-il écrit ?]] * [[Pour lire Platon/Premiers pas#Dans quel ordre Platon a-t-il écrit ses dialogues ?|4 Dans quel ordre Platon a-t-il écrit ses dialogues ?]] * [[Pour lire Platon/Premiers pas#Pourquoi Platon a-t-il écrit des dialogues et non des traités ?|5 Pourquoi Platon a-t-il écrit des dialogues et non des traités ?]] * [[Pour lire Platon/Premiers pas#Qui sont les personnages des dialogues de Platon ?|6 Qui sont les personnages des dialogues de Platon ?]] * [[Pour lire Platon/Premiers pas#Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?|7 Pourquoi Socrate est-il le personnage principal des dialogues de Platon ?]] * [[Pour lire Platon/Premiers pas#De quoi Platon parle-t-il dans ses dialogues ?|8 De quoi Platon parle-t-il dans ses dialogues ?]] * [[Pour lire Platon/Premiers pas#Les dialogues de Platon forment-ils un système philosophique ?|9 Les dialogues de Platon forment-ils un système philosophique ?]] * [[Pour lire Platon/Premiers pas#Pourquoi lire un auteur mort il y a vingt-quatre siècles ?|10 Pourquoi lire un auteur mort il y a vingt-quatre siècles ?]] === '''[[/Conseils pour la lecture|Conseils pour la lecture]]''' === <small>''Quelques conseils élémentaires avant de se lancer''</small> * [[Pour lire Platon/Conseils pour la lecture#Quelles traductions choisir ?|1 Quelles traductions choisir ?]] * [[Pour lire Platon/Conseils pour la lecture#Faut-il apprendre le grec pour bien comprendre Platon ?|2 Faut-il apprendre le grec pour bien comprendre Platon ?]] * [[Pour lire Platon/Conseils pour la lecture#Par quels dialogues commencer ?|3 Par quels dialogues commencer ?]] * [[Pour lire Platon/Conseils pour la lecture#Comment tirer profit de la lecture des dialogues ?|4 Comment tirer profit de la lecture des dialogues ?]] * [[Pour lire Platon/Conseils pour la lecture#Quels outils utiliser au cours de la lecture ?|5 Quels outils utiliser au cours de la lecture ?]] * [[Pour lire Platon/Conseils pour la lecture#Quels livres lire sur Platon ?|6 Quels livres lire sur Platon ?]] === [[Pour lire Platon/Introduction par les dialogues|Introduction par les dialogues]] === * Le philosophe ** Qu'est-ce que l'amour de la sagesse ? ** Qu'est-ce que savoir ? ** Quelle est la place du philosophe dans la cité * La vie éthique ** Qu'est-ce que l'âme ? ** Qu'est-ce que se connaître soi-même ? ** Qu'est-ce que la vertu ? ** Quel est le bien suprême de la vie ? ** Doit-on craindre la mort ? === [[Pour lire Platon/Introduction par les mythes|Introduction par les mythes]] === === [[Pour lire Platon/Vocabulaire|Vocabulaire]] === == Le Guide des Dialogues == * [[Pour lire Platon/Guide des dialogues/Introduction|Introduction]] * [[Pour lire Platon/Guide des dialogues|Guide des dialogues]] [[Catégorie:Histoire de la philosophie]][[Catégorie:Philosophe]] {{AutoCat}} __NOTOC__ [[Catégorie:Classe 1 - Philosophie et psychologie]] ndb0aaiqroibugax6j5cdx7mknc62ll Dictionnaire de philosophie 0 30495 765018 760544 2026-04-25T09:58:03Z PandaMystique 119061 765018 wikitext text/x-wiki <!-- ═══════════════════════════════════════════════════════════════════ EN-TÊTE PRINCIPAL ═══════════════════════════════════════════════════════════════════ --> <div style="background: linear-gradient(180deg, #2c3e50, #1a252f); border-radius: 8px; padding: 25px 30px; margin-bottom: 20px; text-align: center;"> <div style="font-size: 1.5em; font-weight: 600; color: #ffffff; letter-spacing: 0.02em; margin-bottom: 6px;">Dictionnaire de [[philosophie]]</div> <div style="font-size: 0.95em; color: #a8b8c8; letter-spacing: 0.03em;">Concepts, notions et termes essentiels</div> </div> <!-- ═══════════════════════════════════════════════════════════════════ RECHERCHE ═══════════════════════════════════════════════════════════════════ --> <div style="text-align:center; margin:0 0 20px 0;"> {{PhiloRecherche}} </div> <!-- ═══════════════════════════════════════════════════════════════════ INDEX ALPHABÉTIQUE + DERNIÈRES MISES À JOUR ═══════════════════════════════════════════════════════════════════ --> <table style="width:100%; border-collapse:separate; border-spacing:16px 0;"> <tr> <!-- INDEX ALPHABÉTIQUE --> <td style="width:60%; vertical-align:top;"> <div style="background: linear-gradient(180deg, #fdfcfa, #f5f3f0); border: 1px solid #d5cdbd; border-radius: 8px; padding: 18px 20px;"> <div style="font-size: 0.85em; font-weight: 700; color: #5a5045; text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 14px; text-align: center;">Index alphabétique</div> <!-- Ligne 1 : A-I --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/A|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">A</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/B|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">B</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/C|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">C</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/D|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">D</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/E|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">E</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/F|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">F</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/G|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">G</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/H|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">H</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/I|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">I</span>]]</td> </tr> </table> <!-- Ligne 2 : J-R --> <table style="width:100%; border-collapse:separate; border-spacing:6px; margin-bottom:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/J|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">J</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/K|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">K</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/L|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">L</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/M|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">M</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/N|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">N</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/O|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">O</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/P|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">P</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Q|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">Q</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/R|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">R</span>]]</td> </tr> </table> <!-- Ligne 3 : S-Z --> <table style="width:100%; border-collapse:separate; border-spacing:6px;"> <tr> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/S|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">S</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/T|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">T</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/U|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">U</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/V|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">V</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/W|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">W</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/X|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">X</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Y|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">Y</span>]]</td> <td style="width:11.1%; text-align:center;">[[Dictionnaire de philosophie/Z|<span style="display:block; padding:8px 0; background:linear-gradient(180deg, #ffffff, #f5f4f2); border:1px solid #d5cdbd; border-radius:5px; color:#3a3530; font-weight:600; font-size:1.05em;">Z</span>]]</td> <td style="width:11.1%;"></td> </tr> </table> </div> </td> <!-- DERNIÈRES MISES À JOUR --> <td class="noprint" style="width:40%; vertical-align:top;"> <div style="background: linear-gradient(180deg, #f8f6f2, #f0ede8); border: 1px solid #d5cdbd; border-radius: 8px; overflow: hidden; height: 100%;"> <div style="background: linear-gradient(180deg, #5a5045, #4a4035); padding: 10px 15px; text-align: center;"> <span style="font-size: 0.9em; font-weight: 600; color: #ffffff; letter-spacing: 0.05em;">📝 Dernières mises à jour</span> </div> <div style="padding: 12px 16px; font-size: 0.92em; line-height: 1.8; color: #444;"> <DynamicPageList> category = Dictionnaire de philosophie (livre) count = 5 order = lastedit </DynamicPageList> </div> </div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ ENTRÉES THÉMATIQUES ═══════════════════════════════════════════════════════════════════ --> <div style="margin: 30px 0 12px 0; padding-bottom: 6px; border-bottom: 2px solid #8b7355;"> <span style="font-size: 1.1em; font-weight: 700; color: #5a4a3a; letter-spacing: 0.02em;">ENTRÉES PAR THÈME</span> <span style="font-size: 0.85em; color: #999; margin-left: 12px;">Parcourir par domaine</span> </div> <table style="width:100%; border-collapse:separate; border-spacing:12px;"> <tr> <!-- MÉTAPHYSIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f5f0fa, #ebe4f2); border:1px solid #9080a8; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#4a3860; margin-bottom:6px;">🔮 Métaphysique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Être, substance, existence, essence, néant, possible, nécessaire…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Métaphysique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- ÉPISTÉMOLOGIE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef5fa, #e0ecf5); border:1px solid #5088b0; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#1a4a6a; margin-bottom:6px;">🔬 Épistémologie</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Connaissance, vérité, science, méthode, preuve, certitude…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Épistémologie|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- ÉTHIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #fdf8ed, #f6eedc); border:1px solid #c9a83a; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#5a4500; margin-bottom:6px;">⚖️ Éthique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Bien, mal, vertu, devoir, justice, bonheur, liberté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Éthique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> <tr> <!-- LOGIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #f0f0f5, #e5e5ed); border:1px solid #7078a0; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#2a3060; margin-bottom:6px;">🧮 Logique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Raisonnement, proposition, déduction, induction, syllogisme…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Logique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- ESTHÉTIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #faf4ed, #f2e8dc); border:1px solid #b07848; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#5a3820; margin-bottom:6px;">🎨 Esthétique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">Beau, sublime, art, goût, imagination, création…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Esthétique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> <!-- POLITIQUE --> <td style="width:33%; vertical-align:top; position:relative; background:linear-gradient(180deg, #eef5f0, #e0ede5); border:1px solid #4a9060; border-radius:8px; padding:14px 16px; overflow:hidden;"> <div style="font-weight:bold; font-size:1em; color:#1a5030; margin-bottom:6px;">🏛️ Politique</div> <div style="font-size:0.85em; color:#555; line-height:1.6;">État, pouvoir, droit, contrat, souveraineté, citoyenneté…</div> <div style="position:absolute; top:0; left:0; right:0; bottom:0; z-index:3; font-size:0;">[[Dictionnaire de philosophie/Politique|<span style="position:absolute; top:0; left:0; right:0; bottom:0; display:block;"></span>]]</div> </td> </tr> </table> <!-- ═══════════════════════════════════════════════════════════════════ FOOTER : RESSOURCES ═══════════════════════════════════════════════════════════════════ --> <div style="margin-top: 25px; background: linear-gradient(180deg, #f5f5f3, #eaeae8); border: 1px solid #d8d8d5; border-radius: 8px; padding: 16px 20px;"> <div style="font-size: 0.8em; font-weight: 700; color: #555; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 10px;">Voir aussi</div> <div style="font-size: 0.9em; color: #444; line-height: 1.7;"> → [[Philosophie|Portail Philosophie]] &nbsp;•&nbsp; → [[Manuel de terminale de philosophie|Manuel de Terminale]] &nbsp;•&nbsp; → [[Philosophie/Histoire de la philosophie|Histoire de la philosophie]] &nbsp;•&nbsp; → [[w:Portail:Philosophie|Wikipédia]] &nbsp;•&nbsp; → [https://github.com/PandaMystique/Dictionnaire Application libre sur GitHub] </div> </div> {{CDU multiple| * {{CDU item|0|}} * {{CDU item|1|10}}}} [[Catégorie:Dictionnaire de philosophie (livre)]] [[Catégorie:Philosophie]] {{DEFAULTSORT:*}} [[Catégorie:Classe 1 - Philosophie et psychologie]] jcuhqajpfvur6g3u0gcsoyyjq3gw96m Dictionnaire de philosophie/A 0 30496 764921 762084 2026-04-25T06:14:39Z PandaMystique 119061 764921 wikitext text/x-wiki {{DicoPhilo |A}} <!-- Grille de contenu --> <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 2em; width: 100%; margin-bottom: 2em;"> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/A (logique)|A]] :[[Dictionnaire de philosophie/Abduction|Abduction]] :[[Dictionnaire de philosophie/Aboulie|Aboulie]] :[[Dictionnaire de philosophie/Absolu|Absolu]] :[[Dictionnaire de philosophie/Absolutisme|Absolutisme]] :[[Dictionnaire de philosophie/Abstraction|Abstraction]] :[[Dictionnaire de philosophie/Absurde|Absurde]] :Académie :[[Dictionnaire de philosophie/Acatalépsie|Acatalépsie]] :[[Dictionnaire de philosophie/Accident|Accident]] :[[Philosophie/Acte/Puissance|Acte et Puissance]] :[[Dictionnaire de philosophie/Action|Action]] :[[Dictionnaire de philosophie/Affection|Affection]] :''Afrique'' ::[[Dictionnaire de philosophie/Philosophie africaine|Philosophie africaine]] :[[Dictionnaire de philosophie/Agnosticisme|Agnosticisme]] :{{Page|Aliénation}} :[[Dictionnaire de philosophie/Altérité|Altérité]] :[[Dictionnaire de philosophie/Altruisme|Altruisme]] :[[Dictionnaire de philosophie/Âme|Âme]] :[[Dictionnaire de philosophie/Amitié|Amitié]] </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Amour|Amour]] :Analogie :Analyse :Analytique :[[Dictionnaire de philosophie/Anarchisme|Anarchisme]] :{{Page|Anaxagore}} :[[Dictionnaire de philosophie/Angoisse|Angoisse]] :[[Dictionnaire de philosophie/Animal|Animal]] ::Communication animale ::Droits ::[[Dictionnaire de philosophie/Intelligence animale|Intelligence animale]] :[[Dictionnaire de philosophie/Anthropocentrisme|Anthropocentrisme]] :[[Dictionnaire de philosophie/Antinomie|Antinomie]] :[[Dictionnaire de philosophie/Aporie|Aporie]] :[[Dictionnaire de philosophie/Apparence|Apparence]] :[[Dictionnaire de philosophie/A priori|A priori]] :[[Dictionnaire de philosophie/Argument|Argument]] ::[[Philosophie de l'esprit/Argument de la connaissance|— de la connaissance]] :[[Dictionnaire de philosophie/Argentine (Philosophie)|Argentine]] (philosophie au XX{{e}} siècle) </div> <div style="padding: 1.5em; background: linear-gradient(135deg, #ffffff40 0%, #e0e4e840 100%); border-radius: 10px; box-shadow: 0 3px 10px rgba(0,0,0,0.1);"> :[[Dictionnaire de philosophie/Aristote|Aristote]] ::Aristotélisme :[[Dictionnaire de philosophie/Art (introduction)|Art]] (introduction) ::[[Dictionnaire de philosophie/Art|Art]] (contemporain) ::[[Dictionnaire de philosophie/Art et Vérité|Art et Vérité]] :[[Philosophie/Ataraxie|Ataraxie]] :[[Philosophie/Athéisme|Athéisme]] :Atome ::[[Dictionnaire de philosophie/Atomisme|Atomisme]] :{{Page|Attribut}} :[[Dictionnaire de philosophie/Authenticité|Authenticité]] :[[Dictionnaire de philosophie/Autonomie|Autonomie]] :[[Dictionnaire de philosophie/Autorité|Autorité]] :[[Philosophie/Autrui|Autrui]] :[[Dictionnaire de philosophie/Avortement|Avortement]] (éthique) :[[Dictionnaire de philosophie/Axiome|Axiome]] </div> </div> {{PhiloRecherche}} {{Autocat}} nr54cmrgrgunouzhst3b3yx45lg9t3e Wikilivres:Compilations/Dictionnaire de philosophie 4 30507 764924 221106 2026-04-25T06:25:55Z PandaMystique 119061 Contenu remplacé par « {{delete}} » 764924 wikitext text/x-wiki {{delete}} 35r2j9t4ectnt1cmb7mlgcqvwz6h5k6 Catégorie:Dictionnaire de philosophie (livre) 14 30658 765022 360951 2026-04-25T10:01:31Z PandaMystique 119061 765022 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] ti5ogwbk8s28zyylfgbdyharuik2yfz Catégorie:Pour lire Platon (livre) 14 30835 765005 758702 2026-04-25T08:08:49Z PandaMystique 119061 765005 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Histoire de la philosophie]] [[Catégorie:Philosophie]] nhlaijv5vbifpzneme5rfjxrp936zl6 765026 765005 2026-04-25T10:02:14Z PandaMystique 119061 765026 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Histoire de la philosophie]] [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] 9n4i1eyjss38opkcthjfnx98dj1g8k8 Pour lire Platon/Guide des dialogues/Ménon 0 31164 765003 764632 2026-04-25T08:07:09Z PandaMystique 119061 765003 wikitext text/x-wiki {{sous-pages}} == Introduction == {{wikisource|Ménon|Ménon}} Le ''Ménon'' est l’un des textes les plus étudiés du corpus platonicien. Relativement bref, trente pages Stephanus, de 70a à 100b, il articule pourtant un nombre important de thèmes : la nature de la vertu, la théorie de la définition, la méthode philosophique, la méthode mathématique, l’éducation, l’origine de la connaissance, l’immortalité de l’âme, la politique athénienne, et la distinction entre savoir et opinion vraie. J. S. Mill l’appelait un « philosophical gem » (Mill 1979 : 375) et la plupart des commentateurs continuent d’y voir un texte d’exception. La tradition interprétative situe souvent le ''Ménon'' à un point de bascule entre les dialogues « socratiques » et les œuvres dites de la maturité (''Phédon'', ''République''). Cette qualification de « dialogue de transition », qui remonte surtout aux « développementalistes » du XIX{{e}} et du XX{{e}} siècle (voir Scott 2006 : 5-6), repose sur plusieurs constatations : le dialogue commence à la manière d’un texte socratique (recherche d’une définition, aporie), mais il introduit deux doctrines nouvelles, la réminiscence et la méthode hypothétique, qu’on retrouvera dans le ''Phédon'' et la ''République''. Il convient toutefois d’accueillir cette catégorisation avec prudence. Scott (2006 : 5-7) note qu’elle a eu un effet paradoxal : elle a souvent fait lire le ''Ménon'' à travers d’autres dialogues, plutôt que pour lui-même, or c’est précisément l’inverse que le texte semble exiger, lui qui critique à plusieurs reprises le fait de « couper la vertu en morceaux ». Quant à la date de composition, les indices internes et externes ne permettent pas d’en décider rigoureusement ; Bluck (1961 : 108-20) et Day (1994 : 10-11) penchent pour une rédaction autour de 385 av. J.-C., peu après le premier voyage de Platon en Sicile, ce qui expliquerait la présence d’influences pythagoriciennes plus nettes que dans les dialogues antérieurs. Le ''Ménon'' prolonge une discussion inachevée du ''Protagoras'' : celle de l’enseignabilité de la vertu. Il ajoute cependant un déplacement méthodologique décisif. Le ''Protagoras'' se clôt sur l’exigence de définir la vertu avant d’examiner si elle s’enseigne. C’est précisément là que le ''Ménon'' commence ; et c’est au-delà que le dialogue conduit, en introduisant la méthode hypothétique pour ''examiner'' l’enseignabilité sans attendre d’avoir défini la vertu (Day 1994 : 10). La scène est située à Athènes vers 402 av. J.-C., soit trois ans avant la mort de Socrate. L’interlocuteur principal, Ménon, est un jeune aristocrate thessalien, disciple de Gorgias. Xénophon (''Anabase'' II, 6, 21-29) lui prête une carrière ultérieure peu glorieuse dans l’expédition des Dix Mille, et une fin ignominieuse, témoignage qu’il faut recevoir avec précaution, car Xénophon est hostile à Ménon (Bluck 1961 : 120-6 ; Klein 1965 : 36-8). Le dialogue prend place chez Anytos, qui figurera parmi les accusateurs de Socrate en 399. Bluck (1961 : 124) rappelle que Platon ne charge pas son personnage aussi lourdement que Xénophon, mais que la réputation ultérieure de Ménon était probablement connue des lecteurs contemporains, qui pouvaient donc lire le dialogue avec une conscience aiguë de ce qu’allait devenir ce jeune homme. Le plan général peut se décrire ainsi : * 70a-71d : ouverture, question de Ménon * 71e-79e : les trois tentatives de définition de la vertu * 79e-80d : l’épisode de la torpille * 80d-81a : le paradoxe de l’enquête * 81a-86c : la doctrine de la réminiscence et l’interrogatoire de l’esclave * 86c-89a : méthode hypothétique, la vertu est-elle science ? * 89e-96d : la vertu s’enseigne-t-elle ? L’épisode d’Anytos * 96d-100b : science et opinion droite ; vertu par faveur divine == 1. L’ouverture (70a-71d) == Le dialogue commence sans préambule, par une question que Ménon pose d’emblée : <blockquote>« Peux-tu me dire, Socrate, si la vertu s’enseigne ? Ou bien, si elle ne s’enseigne pas, si elle s’acquiert par la pratique ? Ou bien, ni par la pratique ni par l’enseignement, si elle revient aux hommes par nature, ou de quelque autre manière ? » (70a1-4)</blockquote> Cette ouverture abrupte contraste avec l’usage platonicien ordinaire, qui consiste à ménager une scène, à présenter les personnages et à introduire progressivement le sujet. Bluck (1961 : 108) et Scott (2006 : 13) y voient un indice du personnage de Ménon : jeune et pressé, sûr de lui, habitué à poser des questions plutôt qu’à en recevoir. La lecture reste une reconstruction : Platon ne commente pas cette abruption, mais elle donne immédiatement une coloration dramatique à l’échange. Les quatre options qu’énumère Ménon (enseignement, pratique, nature, « quelque autre manière ») recouvrent ce que l’on appelle souvent la « triade pédagogique » grecque (''physis, didaskalia, askēsis''), à laquelle Ménon ajoute un terme volontairement vague. Cette quatrième option, selon Scott (2006 : 18), peut annoncer rétrospectivement la « faveur divine » (''theia moira'') qui closera le dialogue ; la lecture est attrayante mais spéculative. La question porte sur l’acquisition de la vertu. L’adjectif verbal ''didakton'' est ambigu : il peut signifier « effectivement enseigné » ou « susceptible d’être enseigné » (Scott 2006 : 22-3 ; Bluck 1961 : 202-3). Socrate, dans la suite, traite la question comme portant sur la possibilité en droit, sur la nature de la vertu, non sur le fait empirique. Cette lecture est confirmée par le fait qu’il engage aussitôt la recherche sur ce qu’est la vertu plutôt que de dresser l’inventaire des enseignants athéniens. La réponse de Socrate ne va pas à la question, mais la déplace. Il commence par opposer la Thessalie et Athènes : naguère réputés pour l’équitation et la richesse, les Thessaliens sont désormais renommés pour leur sagesse, grâce à Gorgias et à ses disciples, dont Aristippe, un Aleuade de Larissa, est l’un des plus en vue. L’ironie est reconnue par la plupart des commentateurs (Thompson 1901 : ''ad loc.'' ; Klein 1965 : 39-42 ; Bluck 1961 : 206) : la Thessalie passait pour un pays désordonné, et les Aleuades avaient trahi la Grèce lors de l’invasion perse. La « sagesse » thessalienne ne serait, selon cette lecture, que la rhétorique apprise de Gorgias. Il faut toutefois noter que l’ironie n’est pas explicitement marquée dans le texte : on la reconstruit à partir du contraste entre les faits connus de l’auditoire et la phrase de Socrate. Socrate ajoute qu’à Athènes la sagesse a disparu, et qu’il ne sait même pas, pour sa part, ''ce qu’est'' la vertu. Comment, dès lors, saurait-il si elle s’enseigne ? Si j’ignore qui est Ménon, comment dirais-je s’il est beau, riche ou bien né ? Cette analogie introduit le principe dit de la « priorité de la définition », ou « exigence socratique ». Sa formulation la plus simple (Scott 2006 : 20-4) est : on ne peut connaître les attributs non essentiels d’une chose sans en connaître l’essence. Un débat plus large porte sur la version forte de ce principe (« on ne peut rien savoir de ''x'' sans savoir ce qu’est ''x'' ») et sur la question de savoir si Socrate la soutient (Geach 1966 ; Santas 1972 ; Burnyeat 1977 ; Beversluis 1987 ; Benson 1990 ; Prior 1998 ; Vlastos 1994 : ch. 2). Dans le ''Ménon'' stricto sensu, seule la version restreinte est explicitement formulée (71b3-4) ; mais Scott (2006 : 84-8) argumente qu’une version plus forte est en arrière-plan lorsque Socrate invoque l’« exigence dialectique » à 79d. L’analogie qui appuie le principe est critiquable : connaître Ménon au sens où on le reconnaît n’est pas connaître une essence au sens où l’on définit ce qu’est la vertu (Scott 2006 : 21-2). Mais elle fournit à Ménon une prise intuitive sur l’exigence. Ménon, étonné, demande si Socrate n’a jamais rencontré quelqu’un qui connaisse la vertu, Gorgias, par exemple ? Socrate répond qu’il ne se souvient plus, et prie Ménon de rapporter ce que Gorgias disait, ou de parler en son propre nom. Klein (1965 : 43-9) relève un jeu de mots dans le texte grec : ''ou panu eimi mnēmon, ō Menōn'', « je n’ai pas bonne mémoire, Ménon », qui associe par contraste le nom de Ménon et la racine ''mnēm-'' de la mémoire. La suggestion de Klein, que Ménon incarne une mémoire défaillante (répétant ce qu’il a entendu dire sans le comprendre), est une lecture ingénieuse mais fortement interprétative. Le texte l’autorise sans l’imposer. Plus fondamentalement, la mise à l’écart de Gorgias contraint Ménon à parler en son nom propre. Ce geste a une fonction pédagogique reconnue : Socrate, dans nombre de dialogues, refuse la position de disciple qui reçoit, et impose celle du penseur qui rend raison. == 2. La première définition (71e-73c) == Ménon répond par énumération : <blockquote>« Ce n’est pas difficile, Socrate. Si tu veux la vertu d’un homme, il est facile de dire qu’elle consiste à être capable d’administrer les affaires de la cité, d’y faire du bien à ses amis et du mal à ses ennemis, et de veiller à ne souffrir soi-même aucun mal. Si tu veux la vertu d’une femme, il n’est pas difficile de la décrire non plus : elle doit bien gouverner la maison, en conserver les biens et être soumise à son mari. Il y a aussi une autre vertu pour l’enfant, pour l’esclave, et pour chaque âge, chaque action, chaque condition ; il y a de même autant de formes de vice. » (71e1-72a5)</blockquote> Plusieurs traits méritent attention. D’abord, Ménon ne dégage pas ''une'' nature de la vertu mais présente un catalogue. Socrate parlera plus loin d’un « essaim » (''smēnos'', 72a8) de vertus. Cette manière est représentative d’un pluralisme éthique grec, particulièrement hiérarchisé par genre, âge et condition. Elle n’est pas seulement naïve : elle correspond à une vision morale largement partagée dans l’aristocratie athénienne et, plus encore, thessalienne. Ensuite, la définition de la « vertu d’un homme » que donne Ménon, « faire du bien à ses amis et du mal à ses ennemis », est un topos de l’éthique populaire grecque ; c’est précisément celle que la ''République'' (I, 332a-336a) mettra en question par la bouche de Socrate. Polémarque la défend dans le livre I ; Socrate la réfute. Le ''Ménon'' ne s’y arrête pas, mais le lecteur averti reconnaît la cible. La réponse de Socrate ne porte pas sur le contenu particulier des clauses, mais sur leur forme logique. Il demande ''ce qui est commun'' à toutes ces vertus. Deux analogies sont déployées. La première est celle de l’abeille (72b) : si l’on demande ce qu’est une abeille, on ne cite pas les différences d’espèce ; on cherche ''ce par quoi'' toutes les abeilles sont semblables, leur ''eidos'' (forme), leur ''ousia'' (essence). Scott (2006 : 25) souligne que Socrate n’infère pas l’existence d’une forme unitaire à partir du fait que plusieurs choses reçoivent le même nom : il demande si elles sont toutes ''également'' des cas de ''x'', exigence plus forte qu’une simple observation lexicale. La seconde analogie porte sur la santé, la grandeur, la force : ces propriétés ne varient pas selon qu’elles sont dans un homme ou dans une femme. À ce stade, il est utile de souligner qu’une résistance à l’« hypothèse unitariste » est philosophiquement possible. Wittgenstein, dans les ''Investigations philosophiques'' (§ 66), la mettra en cause avec l’exemple célèbre des « jeux » : il n’est pas sûr que tout terme général renvoie à une essence unique. On peut se demander si Gorgias (dont Ménon récite l’enseignement) n’était pas conscient d’une telle difficulté. Scott (2006 : 24-5) doute que la position gorgienne se laisse rapprocher d’un anti-unitarisme général à la Wittgenstein : l’argument de Ménon s’appuie sur la relativité de la vertu à des rôles sociaux, non sur un scepticisme généralisé à l’égard des définitions. Il n’en reste pas moins que l’hypothèse unitariste socratique demeure une ''supposition'' : elle est présupposée plutôt que démontrée par le dialogue. En 73a-c, Socrate glisse que la vertu est la même pour tous les humains, c’est-à-dire : être bon, ce qui suppose les mêmes qualités. Bluck (1961 : 222-3) note la présence implicite d’une idée d’''ousia'' en sens non transcendant, simple essence commune aux instances particulières, qu’il ne faut pas encore assimiler à la théorie des Formes séparées du ''Phédon''. Cette précaution est importante : on ne doit pas lire dans le ''Ménon'' des éléments qui n’y sont pas textuellement présents, même s’ils le seront plus tard. == 3. La deuxième définition (73c-e) == Pressé de trouver un caractère commun, Ménon propose : <blockquote>« Qu’est-ce d’autre, sinon être capable de commander aux hommes, si tu cherches une définition qui vaille pour tous les cas ? » (73c9-d1)</blockquote> Cette proposition reste conjointe à l’identité sociale de Ménon. Il ne trouve d’unité que dans la vertu d’un homme comme lui, jeune aristocrate destiné à commander. Scott (2006 : 61) rattache ce mouvement à une conception « immoraliste » (celle de Thrasymaque en ''République'' I, 336b-354c, et de Calliclès en ''Gorgias'' 483c-484a), dans laquelle la vertu véritable serait la capacité du fort à imposer sa loi au faible. Cette association interprétative est cohérente, mais reste à demi-conjecturale : Platon ne la marque pas explicitement. Elle est cependant appuyée par le fait que Ménon lui-même reprendra ce thème en 78c, lorsqu’il listera comme « biens » l’or, l’argent, les honneurs et les charges publiques. Socrate objecte que la définition exclut les enfants et les esclaves ; il demande s’il ne faut pas ajouter « avec justice ». Ménon concède. Mais alors, la justice est-elle ''la'' vertu, ou une vertu parmi d’autres ? Ménon admet qu’il existe plusieurs vertus, courage, tempérance, magnificence (''megaloprepeia''), sagesse... On se retrouve devant un essaim. La réfutation est brève : la définition n’a pas tenu même cinq minutes. Socrate conclut qu’il faut reprendre le problème à la racine : Ménon n’a pas compris ce qu’est ''définir''. La leçon suivante y sera consacrée. == 4. La leçon de définition : figure et couleur (74b-77a) == Ce passage, souvent traité rapidement dans la littérature, joue un rôle méthodologique important. Socrate illustre ce qu’est une bonne définition sur des termes non éthiques, moins chargés : la ''figure'' (''schēma'') et la ''couleur'' (''chroma''). Première définition de la figure : « ce qui accompagne toujours la couleur » (75b). Définition extensionnelle, par co-occurrence. Utile mais non rigoureuse, et dépendante d’un terme (couleur) qui reste lui-même à définir. Un interlocuteur imaginaire est introduit (75c-d) qui pourrait dire : « Je ne sais pas plus ce qu’est la couleur que ce qu’est la figure. » Socrate énonce alors ce qu’on peut appeler « l’exigence dialectique » (75d) : une définition doit procéder par des termes que l’interlocuteur ''admet connaître''. On ne peut pas définir par plus obscur (''ignotum per ignotius''). Il s’ajoute à cette exigence une distinction entre l’éristique (qui vise à vaincre) et la dialectique (qui se pratique entre amis et cherche à comprendre), distinction qui préparera la reformulation du paradoxe comme « argument éristique » en 80e. Deuxième définition de la figure : « la figure est la limite du solide » (''peras stereou'', 76a). Plus rigoureuse. Genre (solide) et différence (être sa limite). Un débat interprétatif existe ici sur le sens de ''schēma''. Lloyd (1992) et Vlastos (1991 : 118-21) prennent ''schēma'' au sens de « forme abstraite » (équivalent, à peu près, de l’''epiphaneia'' euclidienne) ; Friedländer (1964 : 279), Klein (1965 : 56-60) et Scott (2006 : 38-46) argumentent pour le sens de « surface » (la surface visible enveloppant un corps). Cette seconde lecture s’accorde mieux avec la troisième définition (celle de la couleur) et avec l’usage platonicien de ''schēma'' dans d’autres passages (''Cratyle'' 432b, ''République'' X 601a, ''Lois'' II 669a). On peut s’en tenir à cette lecture comme plus probable, sans exclure la première. Ménon réclame une définition de la couleur. Socrate s’y prête « à la manière de Gorgias » : <blockquote>« La couleur est un effluent des figures (''schēmatōn''), commensurable à la vue et donc perceptible. » (76d4-5)</blockquote> Définition empédocléenne. Les choses émettent des effluents, les sens ont des pores ; quand l’effluent s’ajuste au pore, il y a perception. Bluck (1961 : 251-3) note qu’il est incertain que cette formule soit empédocléenne au sens strict ; Empédocle tenait la théorie des effluents, mais la formulation précise est peut-être platonicienne (''Timée'' 67c en propose une variante). Socrate la qualifie de ''tragikē'' (76e), terme qui connote la pompe tragique ou la grandiloquence (Bluck 1961 : 252). Ménon la préfère à la définition de la figure ; Socrate, lui, préfère la seconde définition du ''schēma''. Cette préférence est instructive. L’exigence dialectique, dans sa version exigeante, ne se contente pas d’une impression de familiarité : elle réclame que les termes employés soient réellement compris. Ménon, amateur de rhétorique brillante, confond les deux ; Socrate fait voir l’écart. On peut lire dans cet épisode une double fonction. D’une part, Socrate enseigne explicitement ce qu’est une bonne définition : genre, différence, clarté des termes. D’autre part, l’exemple choisi est géométrique, ce qui a paru à certains (Vlastos 1991 : 118-25) anticiper le programme de la ''République'' où la géométrie sert de préparation propédeutique à la philosophie. Scott (2006 : 34-5 et 48) tempère cette lecture : l’intérêt de Socrate porte ici autant sur la couleur que sur la figure, et rien n’indique qu’une préparation spécifiquement mathématique à l’éthique soit en vue. Il est plus prudent de voir dans cet épisode un modèle méthodologique général que l’annonce précise de la propédeutique républicaine. == 5. La troisième définition (77b-79e) == Ménon propose une formule empruntée à un poète (probablement Simonide, selon certaines lectures, mais l’identification n’est pas sûre, Bluck 1961 : 254) : <blockquote>« La vertu, c’est se réjouir du beau et pouvoir (le procurer). » (77b4-5)</blockquote> Il interprète : désirer les belles choses et être capable de se les procurer. Socrate examine successivement les deux moitiés. === 5.1. La critique du désir du mal (77b-78b) === Tous désirent-ils le bien, ou y a-t-il des désirs du mal ? Ménon soutient qu’il y a des deux. Socrate distingue deux cas : ''Cas 1'' : ceux qui pensent que le mal est un bien. Ils désirent en réalité ce qu’ils ''croient'' être un bien ; ils ne désirent pas le mal en tant que mal. ''Cas 2'' : ceux qui savent que c’est un mal et le désirent néanmoins. Socrate demande alors : en pensent-ils qu’il leur fera du bien, ou du mal ? Si du bien, retour au cas 1. Si du mal, qu’il les rendra ''kakodaimones'', ils désireraient donc être malheureux. Or personne ne désire être malheureux. Conclusion : nul ne désire le mal en tant que tel. Tous désirent le bien. L’argument est un classique de l’« intellectualisme socratique ». Il trouve son plein déploiement dans le ''Protagoras'' (voir Vlastos 1969 ; Nakhnikian 1973 ; Nehamas 1987 : 277-93). Il repose sur ce qu’on peut appeler, avec quelques commentateurs modernes, un « eudémonisme psychologique » : le désir humain vise, au fond, le bonheur. On ne peut désirer quelque chose ''parce que'' c’est mauvais. Plusieurs objections se présentent, dont il est utile de relever au moins deux. ''Objection 1'' : l’''akrasia''. Aristote insistera, contre Socrate, sur la possibilité d’agir contre son meilleur jugement (''Éthique à Nicomaque'' VII). La position socratique exclut cette possibilité par principe ; elle la redécrit comme une ignorance. On peut considérer que le texte du ''Ménon'' n’affronte pas sérieusement cette objection, il se contente de produire son conséquent, sans en examiner les limites. ''Objection 2'' : la traduction de ''epithumein'' et de ''boulesthai''. Socrate emploie les deux verbes de façon synonymique ; or Croiset et Bodin (1923) ainsi que Weiss (2001 : 36) suggèrent que Platon pourrait ici distinguer un désir rationnel (''boulesthai'', relatif au bien) d’un désir irrationnel (''epithumein'', relatif au plaisir), comme le fera la ''République''. Scott (2006 : 219-20) montre toutefois que cette distinction fonctionne mal dans le texte : les deux verbes y sont clairement traités comme synonymes. Il vaut mieux lire l’argument comme un tout intellectualiste. L’importance philosophique de l’argument n’est pas à chercher dans ses dernières conséquences (la négation de l’''akrasia''), mais dans ce qu’il prépare : si tous désirent le bien, ce qui distingue le vertueux du vicieux n’est pas l’objet du désir, mais la ''connaissance'' du bien réel. La thèse « la vertu est science » est déjà en vue, bien que le ''Ménon'' ne la soutienne pas pleinement avant 87-89. === 5.2. La critique de la capacité de procurer les biens (78b-79e) === Ménon précise sa liste des biens : santé, richesse, or, argent, honneurs, charges publiques (78c8-d1). Socrate demande s’il faut ajouter « avec justice ». Ménon convient que oui, sinon c’est du vice. Socrate montre alors que la définition se dérègle. Car s’abstenir d’acquérir injustement est aussi une vertu. Donc ce qui est vertueux n’est pas l’acquisition, mais ce qui est fait « avec justice ». La vertu serait donc : faire quelque chose avec une partie de la vertu (79b4-5). Scott (2006 : 55-6) note que, au cours du passage, Socrate semble varier sur le nombre de qualités morales à ajouter (parfois « justice », parfois « justice ou tempérance ou piété », parfois « justice ou toute autre partie de la vertu »). Il ne faut probablement pas surinterpréter ces variations : l’enjeu logique est de faire reconnaître qu’une qualité morale quelconque est constitutive, non d’établir laquelle précisément. La contradiction est double. D’abord, on a éclaté la vertu en parties alors qu’on demandait l’unité. Ensuite, et plus gravement, on viole l’''exigence dialectique'', on définit ''x'' par ce qui est encore en question. Comment prétendre connaître la justice (une partie de la vertu) sans connaître la vertu elle-même ? Ici le texte formule une version plus forte de la priorité de la définition : « As-tu l’impression qu’on peut connaître une partie de la vertu si l’on ignore ce qu’est la vertu elle-même ? » (79c8-9). Cette formulation (79d1-4) est l’une des plus nettes du dialogue sur le primat du genre sur l’espèce en matière de connaissance. Scott (2006 : 84-8) y voit la preuve que Socrate adhère au principe de priorité de la définition dans une version large, non seulement sur les attributs, mais aussi sur les parties et, probablement, sur les instances. Cette lecture est contestée (Benson 2000 et d’autres) mais demeure plausible. == 6. La torpille (79e-80d) == Ménon reconnaît son aporie dans l’un des passages les plus célèbres du dialogue : <blockquote>« Socrate, j’avais entendu dire avant même de te rencontrer que tu ne faisais rien d’autre qu’être toi-même dans l’embarras et plonger les autres dans l’embarras. Et maintenant, il me semble que tu me charmes, que tu m’ensorcelles, que tu me jettes un sort : me voici plein d’aporie. Si je peux plaisanter, tu ressembles tout à fait, en apparence comme pour le reste, à ce poisson plat qu’on appelle la torpille (''narkē''). Elle engourdit qui s’en approche et la touche, et tu m’as fait quelque chose d’analogue : je suis engourdi de corps et d’esprit, et ne sais que te répondre. Pourtant j’ai tenu d’innombrables discours sur la vertu, devant beaucoup de gens, et, je l’imaginais, fort bien. Maintenant je ne puis même plus dire ce qu’elle est. Tu es bien avisé de ne pas quitter Athènes : ailleurs, on t’arrêterait comme sorcier. » (79e7-80b7)</blockquote> Ce discours est un moment décisif de l’économie du dialogue ; il peut être lu à plusieurs niveaux. On peut y lire, d’abord, un aveu d’aporie. Ménon reconnaît qu’il ne sait plus ce qu’il croyait savoir. C’est le moment socratique type : l’interlocuteur prend conscience de son ignorance. L’image de la torpille, le poisson ''Torpedo marmorata'', qui paralyse par décharge électrique, est saisissante et a fixé durablement l’imaginaire du dialogue. On peut y lire aussi une accusation. Comparer Socrate à un ensorceleur, un ''goēs'', n’est pas neutre. Dans le ''Gorgias'' 483e-484a, Calliclès emploie l’image des charmes et de l’ensorcellement pour dénoncer la justice conventionnelle, présentée comme une ruse des faibles. Si l’on admet un parallèle (Scott 2006 : 70 ; Klein 1965 : 88-91), Ménon laisse entendre que Socrate utilise des moyens autres que la raison, charmes, paralysies, pour dominer ses interlocuteurs. La menace d’arrestation comme sorcier (''goēs'') prolonge ce registre sinistre. Il est difficile de ne pas lire, dans le sous-texte, une prolepse du procès. Le texte lui-même ne l’explicite pas ; l’allusion est du commentateur, mais elle est largement partagée. On peut y lire, enfin, une plainte : quelque chose de réel aurait été retiré à Ménon. Avant de rencontrer Socrate, il savait discourir ; maintenant, il ne peut plus. L’elenchos serait donc destructeur, non purgatif. Scott (2006 : 71-2) met en garde contre la lecture dramatique de ce point : dans l’interrogatoire de l’esclave qui suivra (en particulier 84a-c), Socrate reviendra sur la fonction bénéfique de l’aporie, qu’elle n’ôte pas un savoir réel, mais un savoir prétendu. La réponse de Socrate (80c-d) est mesurée. Il feint de croire que Ménon voulait seulement qu’on lui retourne la comparaison. Il la refuse. Il précise que si la torpille lui ressemble, c’est à condition qu’elle soit elle-même engourdie : Socrate ne plonge les autres dans l’aporie que parce qu’il y est lui-même. Puis il propose une chose nouvelle : ''chercher ensemble''. Ce dernier point change le régime de la conversation. Jusqu’ici, Socrate demandait à Ménon de rapporter une thèse qu’il était supposé tenir de Gorgias. Désormais, il propose une enquête commune. L’éthique de la réception cède la place à une éthique de la recherche. Il serait excessif d’y voir un basculement méthodologique de tout le platonisme ; mais il est juste de souligner que, à l’intérieur du dialogue, le régime de parole change ici. == 7. Le paradoxe de Ménon (80d-81a) == Ménon résiste à l’invitation à chercher. Il pose alors une objection célèbre : <blockquote>« Mais de quelle manière vas-tu chercher, Socrate, ce dont tu ne sais absolument pas ce que c’est ? Laquelle, parmi les choses que tu ne connais pas, te proposeras-tu comme objet de ta recherche ? Et, si tu tombes par hasard dessus, comment sauras-tu que c’est elle, puisque tu ne la connaissais pas ? » (80d5-8)</blockquote> On peut distinguer deux volets : :(M1) Sans connaître ''x'', on ne peut même pas spécifier ce qu’on cherche. :(M2) Même si l’on trouvait ''x'', on ne pourrait le reconnaître, puisqu’on ne le connaissait pas. Socrate reformule aussitôt l’argument en un dilemme qu’il qualifie d’« éristique » : <blockquote>« Il est impossible de chercher ce que l’on sait comme ce que l’on ne sait pas. Ce qu’on sait, on ne le chercherait pas : on le sait déjà, et qui sait n’a pas besoin de chercher. Et ce qu’on ne sait pas, on ne peut pas le chercher non plus : on ne sait même pas ce qu’il faudrait chercher. » (80e2-5)</blockquote> Socrate étend l’argument : là où Ménon niait seulement qu’on puisse chercher l’inconnu, Socrate dilemmatise, on ne peut chercher ni le connu ni l’inconnu. L’interprétation de ce passage a fait l’objet d’un débat considérable. On peut en distinguer plusieurs aspects. (a) Le statut de l’argument. Socrate le qualifie d’« éristique » (80e2). White (1974 : 168 n. 1) rappelle qu’''eristikon'' signifie simplement « polémique » ou « obstructionniste », non nécessairement « sophistique » au sens fallacieux. L’argument peut être sérieux, même si l’usage qu’en fait Ménon est stratégique. Scott (2006 : 81-2) défend la thèse que Socrate s’intéresse moins à réfuter logiquement l’argument qu’à diagnostiquer ses usages : Ménon l’emploie pour se dispenser de chercher. (b) La distinction entre deux problèmes. Scott (2006 : 76-8) et d’autres ont distingué dans l’objection de Ménon deux difficultés. La première (M1) est relativement superficielle : on peut avoir une saisie partielle ou vague de ce qu’on cherche sans avoir la science parfaite, et cette saisie partielle suffit à engager la recherche. Ménon lui-même, à preuve, a une idée de la vertu, il en a tenu maints discours. La deuxième (M2) est plus grave : même pourvu d’une idée initiale, comment saurait-on qu’on a trouvé la bonne réponse ? Cette difficulté, que Scott appelle « le problème de la découverte », continue de se poser même si l’on distingue connaissance totale et saisie partielle. (c) La réponse de Socrate. Elle n’est ''pas'', selon l’interprétation majoritaire aujourd’hui (Moravcsik 1978 ; Scott 2006 : 79-82), une réfutation logique stricte du dilemme. Socrate dispose pourtant des ressources pour une telle réfutation, la distinction entre savoir et opinion vraie, qu’il énoncera en fin de dialogue. Mais il choisit plutôt de raconter un mythe (la réminiscence) et de faire une démonstration (l’interrogatoire de l’esclave). La fonction de la réminiscence semble davantage ''motivante'' que ''démonstrative'' : elle fonde la confiance que la recherche peut aboutir. D’autres commentateurs (Vlastos 1965 ; White 1974) ont maintenu qu’il s’agit au moins pour partie d’une réponse épistémologique. Le débat reste ouvert. (d) La profondeur du problème. Socrate pourrait-il ignorer la portée épistémologique réelle du paradoxe et n’en voir que la dimension rhétorique ? Scott a lui-même nuancé sa position : dans Scott 1991 il se demandait si Socrate prend le paradoxe au sérieux ; dans Scott 2006 : 82, il aboutit à une position mesurée : Socrate ne le ''réfute'' pas directement, mais on peut considérer qu’il le prend philosophiquement au sérieux en en faisant le cadre de ses développements suivants. Il paraît prudent de s’arrêter à cette position : le paradoxe touche à une question réelle de la théorie de la connaissance, mais sa fonction dans l’économie du dialogue est aussi psychologique et rhétorique. Ménon l’emploie pour se dérober, et Socrate y répond par une invitation à chercher plutôt que par une dissection conceptuelle. == 8. La théorie de la réminiscence (81a-e) == Socrate répond en convoquant une tradition religieuse et poétique : <blockquote>« J’ai entendu parler des hommes et des femmes versés dans les choses divines… » (81a5)</blockquote> Il s’agit, précise-t-il, de prêtres et de prêtresses soucieux de rendre raison (''logon didonai'') de ce qu’ils pratiquent, ainsi que de poètes divins, Pindare et beaucoup d’autres (81a10-b2). Les contours historiques de ces « prêtres » sont incertains ; Bluck (1961 : 275-6) estime que l’on pense à des « Orphicotélestes » ou à d’autres figures apparentées aux mystères, sans pouvoir identifier un groupe précis. L’idée d’immortalité et de transmigration de l’âme circulait à l’époque, chez les pythagoriciens, chez Empédocle, dans certains milieux orphiques. Socrate se rattache à cette tradition, non pour l’appuyer d’une autorité révélée, mais pour y puiser une thèse qu’il va proposer à Ménon. La thèse peut se résumer en cinq points : # L’âme est immortelle et a existé avant la naissance. # Dans ses existences antérieures, elle a « tout vu ». # L’incarnation s’accompagne d’un oubli. # Apprendre, en cette vie, c’est se ressouvenir. # La nature tout entière étant apparentée (''tēs physeōs hapasēs suggenous ousēs''), la remémoration d’une seule chose permet de retrouver le reste, pourvu qu’on ne se lasse pas de chercher. Socrate cite Pindare, ''fr.'' 133 Snell-Maehler (81b-c), vers sur les âmes que Perséphone renvoie vers la lumière après paiement d’un « prix de l’antique douleur ». L’usage de Pindare confirme que Socrate s’abrite derrière une tradition religieuse ; il ne revendique pas la réminiscence comme thèse personnelle mais comme un cadre qu’il propose à Ménon d’accueillir à titre d’hypothèse motivante. Il faut noter plusieurs traits de cette présentation. D’abord, la distinction entre « prêtres qui rendent raison » et « poètes divins » (81a10-b2) anticipe, selon Scott (2006 : 95), la distinction finale entre savoir et opinion vraie : les poètes disent des choses vraies sans pouvoir les justifier ; les prêtres, eux, rendent raison. Socrate se rapproche des seconds. Ensuite, Socrate n’impose pas la doctrine : il invite Ménon à juger si elle est vraie (81b2-3). Le régime est hypothétique. Enfin, le but déclaré de la doctrine n’est pas de réfuter le paradoxe, mais de motiver la recherche : <blockquote>« Ainsi, il ne faut pas se laisser persuader par cet argument éristique : il nous rendrait paresseux et il est agréable à l’oreille des gens mous. Mais celui-ci [la réminiscence] nous rend actifs et curieux de chercher. Parce que je le tiens pour vrai, je consens à chercher avec toi ce qu’est la vertu. » (81d5-e1)</blockquote> Le statut logique de la réminiscence face au paradoxe fait débat. * Vlastos (1965) voit dans la réminiscence une réponse épistémologique précise, qui garantit qu’il y a dans l’âme de quoi soutenir la recherche. * Moravcsik (1978) propose que la réminiscence soit une analogie avec le souvenir ordinaire, supportant une thèse de la connaissance innée. * Fine (1992) conteste que Platon tienne une théorie de la connaissance innée au sens fort ; l’âme retiendrait plutôt une disposition à préférer le vrai au faux. * White (1974) soutient que la réminiscence répond au paradoxe en soutenant qu’il y a un « objet » de la recherche qui nous reste accessible. * Scott (2006 : 79-82) considère que la réminiscence n’est ''pas'' la réponse logique au paradoxe éristique, mais au « problème de la découverte » (sa version profonde), et qu’elle fonctionne aussi, narrativement, comme incitation à l’effort. Chacune de ces lectures trouve un appui dans le texte. On peut s’en tenir à une prudence combinée : la réminiscence joue un rôle à la fois théorique (elle rend pensable la possibilité de la recherche) et pratique (elle en soutient la motivation). Elle ne prétend pas, dans le ''Ménon'', à un statut démontré ; elle est présentée comme un ''logos'' reçu, que Socrate juge digne de confiance. Ménon demande à Socrate de lui ''enseigner'' la réminiscence. Socrate refuse le mot et propose de ''montrer''. Le passage qui suit est l’épisode de l’esclave. == 9. L’interrogatoire de l’esclave (82b-85d) == Socrate appelle l’un des serviteurs qui accompagnent Ménon, un jeune esclave grec qui n’a jamais étudié la géométrie. Il s’agit d’aboutir, par le seul jeu des questions, à la reconnaissance d’un théorème : le carré construit sur la diagonale d’un carré donné est le double de celui-ci. === 9.1. Structure de la démonstration === Trois phases, ponctuées d’interruptions adressées à Ménon. Phase 1 (82b-e). Socrate dessine un carré ABCD de 2 pieds de côté. L’enfant identifie sa surface (4 pieds carrés). Quel serait le côté d’un carré de surface double (8 pieds carrés) ? L’enfant répond : 4 pieds (doublement du côté). Socrate, à Ménon : l’enfant ''croit'' savoir. Phase 2 (83a-e). Socrate construit le carré de 4 pieds : sa surface est 16, non 8. L’enfant propose 3. Socrate calcule : 3×3=9. L’enfant reconnaît ne pas savoir. Socrate, à Ménon : l’enfant est dans l’aporie, mais cette aporie est bénéfique (84a-c), car elle motive la recherche. Phase 3 (83e-85b). Socrate construit un grand carré de 4 pieds de côté, composé de quatre petits carrés de 4 pieds carrés (total : 16). Il trace les diagonales des quatre petits carrés : elles délimitent un carré intérieur incliné, dont les sommets sont les milieux des côtés du grand carré. Ce carré intérieur est composé de quatre demi-carrés des petits carrés ; sa surface est donc 8, le double du carré initial. Et ses côtés sont les diagonales des carrés de 2 pieds. Conclusion : c’est la diagonale qui produit le carré double. L’enfant suit pas à pas. À la fin, il identifie la diagonale comme solution. === 9.2. Les leçons tirées === Socrate tire quatre leçons en dialogue avec Ménon (85b-d) : # L’enfant n’a donné que ses propres opinions. # L’enfant ne savait pas au début. # Ces opinions étaient en lui. # Qui ne sait pas a néanmoins, sur ce qu’il ignore, des opinions vraies. Et, ajoute Socrate, si on l’interrogeait longuement et sous de nombreux angles, il aurait à la fin un savoir aussi précis que celui de quiconque. Ce savoir serait donc tiré de lui-même : c’est se ressouvenir. L’argument conclusif (85d-86b) a suscité des débats. Socrate demande : puisque l’enfant n’a pas appris la géométrie dans cette vie, il avait ces opinions soit depuis toujours, soit il les a acquises avant sa naissance. Dans les deux cas, l’âme possédait le savoir avant l’incarnation. Le texte conclut à l’immortalité de l’âme (86a-b). Plusieurs commentateurs (Gulley 1962 : 21 ; Sharples 1985 : 156 ; Scott 2006 : 117-8) notent que l’argument n’établit à proprement parler que la préexistence, non la survie future, faiblesse logique que le ''Phédon'' tentera d’aborder plus frontalement (105e-107a). === 9.3. Questions interprétatives === (a) Manipulation ou découverte ? Socrate pose une cinquantaine de questions ; il dessine les figures ; il trace les diagonales. Que reste-t-il à l’enfant ? L’objection de la manipulation est ancienne (Brown 1967) et mérite d’être prise au sérieux. Scott (2006 : 100-2), suivant en cela une longue tradition (Augustin, ''De magistro'' ; Vlastos 1965 : 157 ; Moravcsik 1978 : 122-5), défend la lecture suivante : l’enfant ''comprend'', il reconnaît la nécessité des enchaînements. Quand Socrate le laisse proposer « 4 pieds », il n’oppose pas un démenti, mais fait calculer à l’enfant, qui voit par lui-même que 4×4=16. De même pour « 3 pieds ». L’enfant ne consent pas parce que Socrate insiste, mais parce qu’il ''voit''. La réminiscence, sous cette lecture, n’est pas l’enregistrement de ce que Socrate dit ; c’est l’acte mental par lequel l’esprit reconnaît la nécessité d’une proposition. L’observable (questions et réponses) n’est que le signe d’un acte invisible. Cette lecture est sans doute la plus défendable, mais on peut retenir que le texte n’exclut pas une lecture plus sceptique. (b) Opinion vraie ou savoir ? Socrate précise (85c) que l’enfant n’a encore que des opinions vraies, non un savoir. Pour transformer ces opinions en savoir, il faudrait l’interroger « souvent et de nombreuses manières ». Cette précision prépare la distinction finale entre ''epistēmē'' et ''orthē doxa''. Mais elle complique aussi l’argument : si ce que l’enfant a tiré de lui-même n’est encore que de l’opinion, en quel sens exactement y avait-il ''connaissance latente'' ? Fine (1992) tire parti de cette précision pour soutenir que Platon ne tient pas une théorie de la connaissance innée au sens fort, mais seulement une théorie de la prédisposition à la vérité. Scott (2006 : 109-10) défend la lecture opposée : le texte en 85d parle bien de « savoir qu’il a maintenant », ce qui implique un savoir latent. Le débat n’est pas clos. (c) Portée de la démonstration. Socrate affirme que ce qui vaut pour la géométrie vaut « pour toute la géométrie et pour tous les autres enseignements » (85e), y compris la vertu. La géométrie n’est donc pas, ici, un objet d’étude pour lui-même ; elle joue le rôle d’un paradigme. Mais peut-on légitimement transférer à l’éthique ce qui fonctionne pour une vérité mathématique nécessaire ? La question reste ouverte dans le ''Ménon''. Elle sera plus clairement thématisée dans la ''République'', où l’éducation mathématique précède l’éducation dialectique. == 10. La méthode hypothétique (86c-89a) == Après la démonstration, Ménon consent à poursuivre, mais insiste pour revenir à sa question initiale, la vertu s’enseigne-t-elle. Socrate accepte à contrecœur : il aurait préféré, méthodologiquement, définir d’abord la vertu. Il propose alors une méthode « par hypothèse » (''ex hypotheseōs'', 86e3). Il illustre par un exemple géométrique réputé difficile : <blockquote>« Si l’on demande à un géomètre si telle figure (''chōrion'') peut être inscrite dans tel cercle comme triangle, il répondra : "Je ne puis te dire si oui ou non ; mais posons (''hypothesis'') ceci : si cette figure est telle que, étendue le long de sa ligne donnée, elle soit en défaut d’une figure semblable à elle-même, alors il me semble qu’il s’ensuit une conséquence ; et si ce n’est pas possible, il s’en suit une autre." » (86e4-87b2)</blockquote> Le passage est notoirement obscur. La reconstruction géométrique exacte a occupé un siècle de recherche : Butcher 1888, Benecke 1867, Cook Wilson 1903, Heath 1921, Farquharson 1923, Heijboer 1955, Bluck 1961 (appendice), Scott 2006 (ch. 9 et appendice). Il serait inutile de trancher ici. L’interprétation la plus souvent retenue (Cook Wilson, Heath) suppose une application : étant donné un cercle de diamètre ''BH'' et une aire rectiligne ''X'', il s’agit d’inscrire ''X'' comme un triangle dans le cercle ; la condition est que ''X'' puisse être disposée comme un rectangle ''ABCD'' sur le diamètre de façon à « faire défaut » (''elleipein'') d’un rectangle semblable à lui-même. L’intérêt de cette reconstruction est d’exhiber une ''bi-conditionnelle'' : si la condition est satisfaite, la réponse est oui ; sinon, non. Plus importante que le détail géométrique est l’idée méthodologique. Face à une question qu’on ne peut résoudre directement, on la ramène à une autre équivalente mais plus accessible : on examine ''p'' via ''q'', sachant que ''p'' et ''q'' sont logiquement équivalents. On procède par ''réduction''. Aristote décrit d’ailleurs cette méthode dans les ''Premiers Analytiques'' (II, 25, 69a20-36) et y fait allusion explicite au ''Ménon'', mentionnant précisément le rapport entre « vertu » et « science » comme exemple de réduction (Bluck 1961 : 80-1). Socrate applique la méthode : <blockquote>« Si la vertu est science (''epistēmē''), elle s’enseigne ; si elle n’est pas science, elle ne s’enseigne pas. » (87b-c)</blockquote> L’examen de l’enseignabilité est ramené à celui de la scientificité. Une question ouverte demeure (voir les appendices de Scott 2006) : quelle est exactement l’hypothèse ? La proposition « la vertu est science » (Cherniss 1947 ; Friedländer 1964 ; Robinson 1953 ; Bluck 1961 : 86) ou la bi-conditionnelle « si la vertu est science, elle s’enseigne » (Robinson 1941 ; Weiss 2001 ; Sternfeld & Zyskind 1976) ? Scott (2006 : 138-41 ; appendice 2) soutient que seule la première interprétation fait sens du passage : l’hypothèse doit être quelque chose de tentatif portant sur la nature de la vertu. Suit l’argument célèbre pour établir que la vertu est science : # La vertu est bonne (hypothèse haute, quasi indubitable). # Elle est utile, elle fait du bien à qui la possède. # Examinons ce qu’on tient pour des biens : santé, force, beauté, richesse, pouvoir. # Or ces « biens » peuvent être mal utilisés et devenir nuisibles. # Ils ne sont donc bons que guidés par la prudence (''phronēsis''), nuisibles guidés par la folie. # Il en va de même des qualités de l’âme (courage, tempérance, docilité, mémoire). # Donc le seul bien en soi, qui donne leur valeur à tous les autres, est la science. # La vertu, en tant que bonne et utile, est donc science, ou au moins une espèce de science. # Si elle est science, elle s’enseigne. Cet argument a une postérité considérable. L’''Euthydème'' (278e-282d) en offre une version étendue. Il constitue l’un des fondements de ce que Vlastos (1994) appelait l’« intellectualisme socratique ». Il joue aussi un rôle central dans l’éthique stoïcienne (Sedley 1999 : 309-28). Quelques nuances sont à apporter, que le texte lui-même rend nécessaires : * Socrate distingue deux niveaux d’hypothèse : l’hypothèse « basse » (la vertu est science) dérive d’une hypothèse « haute » (la vertu est bonne). C’est une architecture que la ''République'' VI et le ''Phédon'' 100a-102a développeront. * À 89a, Socrate laisse ouverte la question de savoir si la vertu est ''toute'' science ou seulement ''une'' science (''mia tis epistēmē''). Cette ambiguïté deviendra décisive dans la suite. * L’argument est présenté comme provisoire. Tant que la vertu n’est pas définie, toute affirmation sur elle reste hypothétique. Socrate insiste là-dessus (89c-d). == 11. L’épisode d’Anytos (89e-95a) == Socrate amorce un mouvement en sens contraire : si la vertu est science, il devrait y en avoir des enseignants. Or y en a-t-il ? À ce moment entre en scène Anytos, qui se joint à la conversation. L’intrusion d’Anytos est dramatiquement chargée. Anytos est, historiquement, l’un des trois accusateurs de Socrate en 399 (avec Mélétos, qui fut l’accusateur formel, et Lycon). Son apparition au cœur du ''Ménon'' donne à la discussion qui suit une tonalité que les lecteurs contemporains pouvaient reconnaître comme prémonitoire. === 11.1. Les sophistes === Socrate propose d’abord que, s’il fallait apprendre une ''technē'', on irait chez un professionnel : pour la médecine, chez un médecin ; pour la cordonnerie, chez un cordonnier. Pour la vertu, chez les sophistes ? Anytos explose : les sophistes sont des imposteurs, des corrupteurs. Socrate feint de défendre Protagoras : quarante ans de bonne réputation, des sommes énormes pour ses leçons, s’il corrompait ses élèves comme un cordonnier qui rendrait les chaussures en pire état, on l’aurait démasqué depuis longtemps. Anytos maintient son accusation. Socrate pose alors la question décisive : Anytos a-t-il fréquenté les sophistes ? Non. Il ne les connaît que par ouï-dire (''akoē'', 92b). Scott (2006 : 163-4) souligne que ce trait rapproche Anytos de Ménon en plus extrême : paresse intellectuelle, conviction sans examen, refus de chercher. === 11.2. Les hommes de bien et l’argument des pères === Vers qui aller, alors ? Anytos répond : vers n’importe lequel des ''kaloi kagathoi'', les notables athéniens. Socrate déploie alors ce qu’on appelle l’« argument des pères ». Il prend quatre figures incontestables : Thémistocle, Aristide, Périclès, Thucydide fils de Mélésias (rival politique de Périclès, ostracisé en 443, non l’historien). S’il y avait des enseignants de la vertu, ce seraient eux. Ils ont fait enseigner à leurs fils toutes sortes d’arts (équitation, musique, gymnastique). Ils auraient ''a fortiori'' fait enseigner la vertu, puisqu’ils voulaient le bien de leurs fils. Or les fils de ces grands hommes n’ont pas égalé leurs pères. Donc la vertu n’est pas enseignable. L’argument a ses faiblesses. Protagoras, dans le dialogue qui porte son nom, objectait que les fils pourraient manquer de dons naturels (''Protagoras'' 326e-328a). Bluck (1961 : 25-6) remarque que Platon emploie ici cet argument comme ''argumentum ad hominem'' contre Anytos : en démocrate, Anytos ne peut invoquer les inégalités naturelles, puisqu’il suppose que tout homme libre est apte à la vertu. L’argument ne vaut donc pas démonstrativement, mais rhétoriquement contre ce type d’interlocuteur. Anytos se fâche. Il accuse Socrate de médire des grands hommes d’Athènes et lui conseille de « prendre garde » (94e3-95a1). Il se retire, ou se tait. Bluck (1961 : 432-3) et Sharples (1985 : 178-88) pensent qu’il quitte la conversation ; le texte n’est pas parfaitement décisif, mais cette lecture s’impose. === 11.3. Fonction dramatique et philosophique d’Anytos === Pourquoi Platon introduit-il Anytos ? On peut proposer, sans prétendre trancher, plusieurs hypothèses complémentaires. * Scott (2006 : 172-3) suggère que l’épisode sert d’« objet-leçon » pour Ménon : Anytos présente sous une forme extrême les défauts que Ménon commence à manifester, paresse, conviction non examinée, hostilité à l’enquête. En observant Anytos, Ménon pourrait se voir lui-même. * Le choix d’Anytos n’est pas neutre. Platon charge la scène de pressentiments sur le procès à venir. L’allusion est sobre, mais présente (voir Canto-Sperber 1991 : 22-3). * Anytos représente un type de vertu athénienne conventionnelle, la ''kalokagathia'', qui sera fortement critiquée dans le ''Gorgias''. Plusieurs commentateurs (Bluck 1961 : 29 ; Klein 1965 : 230-5) soulignent que l’argument d’Anytos, même victorieux contre lui, ne démontre rien sur la vertu véritable : il montre seulement que la vertu ''conventionnelle'' d’Athènes ne s’enseigne pas. Cette précision est importante pour lire la fin du dialogue : il reste logiquement possible, au terme, qu’une vertu fondée sur la science véritable ''puisse'' s’enseigner, mais n’existe pas encore. == 12. La discussion finale avec Ménon sur l’absence d’enseignants (95a-96d) == Anytos parti, Socrate poursuit avec Ménon. Deuxième argument pour l’absence d’enseignants : les hommes de bien sont eux-mêmes partagés sur la question. Chacun est, intérieurement, en proie au doute sur l’enseignabilité de la vertu (95b-c). Socrate invoque Théognis, qui dit tantôt que les bons se forment par fréquentation des bons, tantôt que rien ne peut faire bon qui ne le soit par nature. Cette contradiction du poète illustre l’incertitude générale. De cet ensemble, Socrate tire une conclusion : # Si la vertu s’enseignait, il y aurait des enseignants de la vertu. # Il n’y a pas d’enseignants de la vertu. # Donc la vertu ne s’enseigne pas. # Donc (par la méthode hypothétique) la vertu n’est pas science. La contradiction avec la conclusion de 87-89 est explicite. Comment la résoudre ? == 13. Science et opinion droite (96d-98c) == Socrate propose un rééquilibrage. On avait supposé que seule la science pouvait guider correctement. C’est là qu’on s’est trompé. Il y a autre chose qui peut guider : l’''opinion vraie'' (''orthē doxa'', ''alēthēs doxa''). L’exemple est limpide : <blockquote>« Celui qui connaît la route de Larissa pour l’avoir parcourue la montre correctement ; mais celui qui a une opinion droite sur cette route, sans l’avoir parcourue ni la connaître, ne la montre-t-il pas aussi correctement ? » (97a9-b3)</blockquote> Tant que l’opinion est vraie, elle guide aussi bien que le savoir. La différence pratique, dans l’action immédiate, est nulle. Ménon, étonné, demande alors pourquoi on estime davantage le savoir, si leur utilité est la même ; et quelle est leur différence. Socrate répond par la métaphore des statues de Dédale (97d-98a). Selon la légende, les statues de Dédale étaient si vivantes qu’elles s’enfuyaient si on ne les attachait pas. Ainsi des opinions vraies : elles sont précieuses tant qu’elles demeurent, mais elles s’échappent facilement. Pour qu’elles demeurent, il faut les ''lier'', et ce lien consiste à en « calculer la cause » (''aitias logismos'', 98a). Socrate ajoute : « Et c’est ''anamnēsis'', comme nous en sommes convenus plus haut. » Ce rapprochement entre le « calcul de la cause » et la réminiscence est l’un des passages les plus discutés du dialogue. Il pose au moins trois difficultés. * Sur le plan textuel, la formulation est rapide et elliptique : Socrate ne développe pas le lien. * Sur le plan logique, ''aitias logismos'' désigne une démarche active de mise en ordre rationnelle des causes, là où ''anamnēsis'' désignait plutôt le jaillissement d’un contenu préalable. L’identification est donc partielle. * Sur le plan philosophique, elle anticipe la distinction du ''Phédon'' et de la ''République'' entre science et opinion. Bluck (1961 : 411-5) et Scott (2006 : 181-3) l’interprètent comme un rapprochement fort : le travail de liaison par les raisons est bien ce qui transforme l’opinion en savoir, et c’est aussi ce par quoi l’âme reprend conscience d’elle-même (''anamnēsis''). D’autres (Day 1994 : 17-8 ; Ebert 1973) sont plus réservés, et voient dans l’identification un raccourci dont il faut se méfier. Il est sans doute plus prudent de formuler ainsi : dans le ''Ménon'', la réminiscence et le calcul de la cause sont ''présentés'' comme coïncidants ; c’est l’un des moments où le texte relie ses propres développements antérieurs ; mais le rapport exact entre ces deux notions reste à déterminer, et les analyses que Platon en donnera dans le ''Phédon'' (100a-102a) ne sont pas encore présentes au ''Ménon''. Une fois liées par le calcul des causes, les opinions vraies deviennent science ; et celle-ci est plus précieuse, non par son contenu au moment ''t'' (les deux peuvent être vraies au même moment), mais par sa stabilité. La science tient bon ; l’opinion s’envole. Cette distinction prépare les développements du ''Phédon'', de la ''République'' et du ''Théétète''. Elle introduit aussi une nuance pour le débat moral : il peut y avoir des vertueux qui ne sont pas des savants, mais qui possèdent de justes opinions. Leur vertu est réelle dans ses effets, mais instable dans son fondement. Socrate précise : il ne prétend pas savoir ''exactement'' ce qui distingue savoir et opinion (98b) ; il sait seulement ''qu’''il y a une distinction. C’est l’une des rares choses qu’il revendique comme savoir, formulation qui ne manquera pas de nourrir les débats sur le rapport du ''Ménon'' au ''disavowal of knowledge'' socratique (voir Vlastos 1994 : ch. 2). == 14. La vertu par faveur divine (98c-100b) == Socrate arrive à la conclusion : la vertu, guidant correctement, est soit science soit opinion vraie. Comme elle n’est pas science (pas d’enseignants, pas d’enseignement), elle est opinion vraie. Voilà pourquoi les grands politiques athéniens ont pu conduire la cité correctement sans science : ils avaient l’opinion droite, mais sans comprendre, comme les devins et les poètes inspirés qui disent tant de vérités sans rien savoir de ce qu’ils disent. Ils agissent par inspiration divine, ''theia moira'', « faveur divine » ou « part divine » (99c-d). Socrate conclut : <blockquote>« Si cette discussion a été menée correctement, la vertu ne vient ni par nature ni par enseignement : elle vient aux hommes qui en sont pourvus par faveur divine, sans intelligence, à moins qu’il n’y ait parmi les politiques un homme capable d’en faire naître un autre comme lui. Un tel homme serait parmi les vivants ce que Tirésias, selon Homère, est chez les morts, quand le poète dit : "Seul il conserve sa raison ; les autres ne sont que des ombres volantes." Tel serait un tel homme parmi nous, face aux autres, pour ce qui regarde la vertu. » (99e4-100a7, citant ''Odyssée'' X, 494-495)</blockquote> === 14.1. Questions interprétatives === Trois niveaux doivent être distingués (Scott 2006 : 186-94). (1) Les politiques ont-ils vraiment guidé correctement la cité ? Socrate le dit. Mais le ''Gorgias'' (515c-519d) juge sévèrement Thémistocle, Périclès, Cimon : ils ont empli Athènes de murs, de ports, de tributs, sans se soucier de la vertu. Plusieurs lectures de la fin du ''Ménon'' voient donc une ironie généralisée (Klein 1965 : 238 ; Bluck 1961 : 38-9 et 368 ; Sharples 1985 : 15 ; Kraut 1984 : 302 n. 82 ; Weiss 2001 : 168). D’autres lisent la conclusion comme sincère (Gomperz 1905 ; Hackforth 1952 ; Dodds 1959 ; Calvert 1984 ; Vlastos 1991 : 125 n. 75). Scott (2006 : 188-9) propose une position intermédiaire : le succès des politiques est accepté comme plausible (''phainetai'', 93a5), non pleinement établi ; la théorie de l’opinion vraie est sérieuse, même si son application aux Athéniens demeure discutable. ’''(2) L’opinion vraie est-elle une vraie vertu ?’'' Au début de la section (96e-99c), Socrate attribue « vertu » aux politiques sur la base de l’opinion vraie. Mais la fin (99e-100a) distingue cette vertu de celle, supérieure, du politique capable d’engendrer un autre comme lui, distinction qui sépare « réalité » et « ombres ». On peut y voir l’ébauche de la distinction entre vertu philosophique et vertu populaire que développera le ''Phédon'' 82a-b. Le ''Ménon'' lui-même n’est pas plus explicite ; la lecture reste une conjecture philologiquement raisonnable. (3) La faveur divine est-elle sérieusement affirmée ? Certains éléments suggèrent l’ironie (la référence à Anytos qui s’irriterait, la brièveté de l’argument). D’autres suggèrent un sérieux : Platon prend souvent l’inspiration divine au sérieux (''Ion'' 534b ; ''Phèdre'' 244a-245c ; ''Timée'' 71e-72a). Vlastos (1991 : 125 n. 75) estime l’attribution sincère ; Scott (2006 : 192-3) refuse de trancher contre elle en l’absence de preuve textuelle forte ; Bluck (1961 : 434-5) la lit ironiquement. Cette fois, la balance textuelle ne penche clairement dans aucune direction. Il faut donc accepter, sur la fin du ''Ménon'', une irréductible indécision. Le dialogue ne dit pas ''clairement'' ce qu’il pense des politiques athéniens ; il dit que le problème se pose, que l’hypothèse de l’opinion droite est cohérente, que la question véritable reste celle de la nature de la vertu. === 14.2. La reprise finale === La dernière phrase du dialogue est méthodologiquement significative : <blockquote>« Il nous sera impossible de savoir cela avec clarté, Ménon, avant que, sans nous occuper de la manière dont la vertu vient aux hommes, nous ayons d’abord cherché ce qu’elle est en elle-même. » (100b4-6)</blockquote> Le dialogue se clôt sur la même question qui l’ouvrait, « qu’est-ce que la vertu ? », non résolue. Entre les deux, un parcours conséquent : trois définitions rejetées, un paradoxe, une doctrine de la réminiscence illustrée par une démonstration mathématique, une méthode hypothétique, un examen des prétendus enseignants de la vertu, et la distinction entre science et opinion droite. == Conclusion == Le ''Ménon'' est un dialogue qui préfère l’ouverture au dogme. Il ne définit pas la vertu. Il n’arbitre pas entre science et opinion droite, entre enseignement et faveur divine. Il laisse ouvertes presque toutes les questions qu’il soulève. Son intérêt ne tient pas à ses thèses, mais à la manière dont il fait avancer la pensée. On peut en souligner quatre traits. Premièrement, le dialogue montre ce qu’est chercher une définition. Non énumérer les cas, non répéter l’enseignement reçu, mais dégager ce par quoi toutes les instances relèvent d’un même genre, et le faire par des termes mieux connus que le défini. Deuxièmement, il met en scène ce qu’est un interlocuteur. Ménon oscille entre désir d’apprendre et paresse, entre docilité et résistance. Il admet son aporie, il suit la démonstration, il consent à chercher. Mais il préfère revenir à la question initiale plutôt que creuser la plus profonde. Scott (2006 : 209-13) a argumenté que Ménon ''s’améliore'' au cours du dialogue ; Klein (1965 : 253-7) y voit au contraire un cas d’''amathia'' qui se protège. La lecture précise de la trajectoire de Ménon reste débattue. Troisièmement, le dialogue propose une certaine idée de l’apprentissage. Quel que soit le statut métaphysique de la réminiscence, la thèse pratique est claire : apprendre ne consiste pas à recevoir un contenu ; c’est activer quelque chose qui se trouve dans l’âme. La pédagogie socratique ne fait pas déverser un savoir d’une tête dans une autre ; elle sollicite la reconnaissance. La « maïeutique », terme qui n’apparaît pas dans le ''Ménon'' mais que le dialogue inspire, est cette accoucheuse de vérités déjà là. Quatrièmement, le ''Ménon'' produit deux outils méthodologiques qui auront une postérité considérable : la distinction entre savoir et opinion vraie, et la méthode hypothétique. L’une sera reprise dans le ''Théétète'' (201d-210a) avec la difficile question de savoir ce que le ''logos'' ajoute à la vraie croyance. L’autre sera développée dans le ''Phédon'' (100a-102a) avec la doctrine des hypothèses successives, et dans la ''République'' (VI, 510b-511e) avec la théorie de la dialectique ascendante et descendante. Il faut toutefois se garder d’une lecture trop téléologique. Il est tentant, pour l’histoire de la philosophie, de voir dans le ''Ménon'' la « première formulation » d’une thèse qui conduirait jusqu’à Leibniz (qui cite explicitement le dialogue dans les ''Nouveaux Essais'' I, i, § 5 et I, iii, Remnant & Bennett 1982 : 52, 78-9) et jusqu’à Kant et son ''a priori''. Le trajet existe en effet, Leibniz se revendique héritier, la doctrine des idées innées des modernes est partiellement platonicienne, mais il est moins rectiligne qu’on ne le dit parfois (voir Brown 1991 ; Scott 1995 : ch. 8). Leibniz, par exemple, objecte à Platon que la réminiscence implique une régression à l’infini (''Nouveaux Essais'', I, i, § 5 ; voir Scott 2006 : 115-6). La dispositionalité innée des modernes n’est pas la connaissance latente du ''Ménon'' ; les stoïciens avaient déjà modifié le paradigme (Scott 1988 ; Scott 1995 : ch. 8). On peut donc dire, prudemment, que le ''Ménon'' propose une idée qui s’inscrit dans une tradition longue ; on dira moins exactement qu’il en est « la première formulation » au sens strict. Plus sobrement, on peut retenir ceci : le ''Ménon'' est un texte d’exception parce qu’il est à la fois un drame philosophique (avec ses personnages et ses tensions), une leçon méthodologique (comment définir, comment hypothétiser, comment distinguer savoir et opinion), une doctrine métaphysique (immortalité, préexistence, affinité des êtres), et une méditation politique (que valent les grands hommes d’Athènes ? la cité est-elle gouvernée par des savants ou par des aveugles inspirés ?). Le fait que ces quatre registres coexistent en une trentaine de pages explique l’intérêt qu’il continue de susciter. Qu’il les laisse largement ouverts explique qu’on continue d’en débattre. == Références == === Éditions, traductions, commentaires === * Bluck, R. S. (1961). ''Plato’s Meno''. Cambridge University Press. * Canto-Sperber, M. (1991). ''Platon : Ménon''. Paris : GF-Flammarion. * Croiset, A. et Bodin, L. (1923). ''Platon, Gorgias-Ménon''. Paris : Les Belles Lettres (CUF). * Day, J. M. (éd.) (1994). ''Plato’s Meno in Focus''. Londres et New York : Routledge. * Klein, J. (1965). ''A Commentary on Plato’s Meno''. Chicago : University of Chicago Press. * Robin, L. (1950). ''Platon, Œuvres complètes'', tome I. Paris : Gallimard (Pléiade). * Scott, D. (2006). ''Plato’s Meno''. Cambridge University Press. * Sedley, D. et Long, A. (éd.) (2010). ''Plato : Meno and Phaedo''. Cambridge Texts in the History of Philosophy. * Sharples, R. W. (1985). ''Plato’s Meno''. Warminster. * Thompson, E. S. (1901). ''The Meno of Plato''. Londres. * Weiss, R. (2001). ''Virtue in the Cave : Moral Inquiry in Plato’s Meno''. Oxford University Press. === Études === * Benson, H. H. (1990). « The priority of definition and the Socratic elenchus », ''Oxford Studies in Ancient Philosophy'' 8, 19-65. * Benson, H. H. (2000). ''Socratic Wisdom''. Oxford. * Beversluis, J. (1987). « Does Socrates commit the Socratic fallacy? », ''American Philosophical Quarterly'' 24, 211-23. * Brown, L. (1991). « Connaissance et réminiscence dans le ''Ménon'' », ''Revue philosophique'' 181, 603-19. * Brown, M. S. (1967). « Plato disapproves of the slave-boy’s answer », ''Review of Metaphysics'' 20, 57-93. * Brunschwig, J. (1991). « Pouvoir enseigner la vertu ? », ''Revue philosophique'' 181, 591-602. * Burnyeat, M. F. (1977). « Examples in epistemology: Socrates, Theaetetus and G. E. Moore », ''Philosophy'' 52, 381-98. * Calvert, B. (1974). « Meno’s paradox reconsidered », ''Journal of the History of Philosophy'' 12, 143-52. * Calvert, B. (1984). « The politicians of Athens in the Gorgias and Meno », ''History of Political Thought'' 5, 1-16. * Cherniss, H. (1947). « Some war-time publications concerning Plato », ''American Journal of Philology'' 68, 113-46. * Cook Wilson, J. (1903). « On the geometrical problem in Plato’s Meno 86e ff. », ''Journal of Philology'' 28, 222-40. * Dodds, E. R. (1959). ''Plato : Gorgias''. Oxford. * Ebert, T. (1973). « Plato’s theory of recollection reconsidered », ''Man and World'' 6, 163-81. * Fine, G. (1992). « Inquiry in the Meno », in R. Kraut (éd.), ''The Cambridge Companion to Plato'', Cambridge University Press, 200-26. * Fine, G. (2004). « Knowledge and true belief in the Meno », ''Oxford Studies in Ancient Philosophy'' 27, 41-81. * Friedländer, P. (1964). ''Platon''. Vol. II. Berlin. * Geach, P. T. (1966). « Plato’s Euthyphro: an analysis and commentary », ''Monist'' 50, 369-82. * Gomperz, T. (1905). ''Griechische Denker''. Vol. II. Leipzig. * Gulley, N. (1962). ''Plato’s Theory of Knowledge''. Londres. * Hackforth, R. (1952). « Meno 89b-c », ''Classical Review'' 2, 149. * Heath, T. E. (1921). ''A History of Greek Mathematics''. Vol. I. Oxford. * Irwin, T. (1977). ''Plato’s Moral Theory''. Oxford. * Irwin, T. (1995). ''Plato’s Ethics''. Oxford. * Kraut, R. (1984). ''Socrates and the State''. Princeton. * Lloyd, G. E. R. (1992). « The Meno and the mysteries of mathematics », ''Phronesis'' 37, 166-83. * Mill, J. S. (1979). « Grote’s Plato », dans ''Collected Works'', vol. XI. Toronto. * Moravcsik, J. (1978). « Learning as recollection », in Vlastos (éd.), ''Plato I'', 53-69 ; repris dans Day (éd.) 1994 : 112-28. * Nakhnikian, G. (1973). « The first Socratic paradox », ''Journal of the History of Philosophy'' 11, 1-17. * Nehamas, A. (1985). « Meno’s paradox and Socrates as a teacher », ''Oxford Studies in Ancient Philosophy'' 3, 1-30. * Nehamas, A. (1987). « Socratic intellectualism », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'' 2, 275-316. * Prior, W. J. (1998). « Plato and the Socratic fallacy », ''Phronesis'' 43, 97-113. * Remnant, P. et Bennett, J. (1982). ''G. W. Leibniz : New Essays on Human Understanding''. Cambridge. * Robinson, R. (1953). ''Plato’s Earlier Dialectic''. 2{{e}} éd., Oxford. * Santas, G. (1972). « The Socratic fallacy », ''Journal of the History of Philosophy'' 10, 127-41. * Sedley, D. (1999). « The ideal of godlikeness », in G. Fine (éd.), ''Plato 2 : Ethics, Politics, Religion and the Soul'', Oxford, vol. II, 309-28. * Scott, D. (1988). « Innatism and the Stoa », ''Proceedings of the Cambridge Philological Society'' 33, 123-53. * Scott, D. (1991). « Socrate prend-il au sérieux le paradoxe de Ménon ? », ''Revue philosophique'' 181, 627-41. * Scott, D. (1995). ''Recollection and Experience''. Cambridge University Press. * Sternfeld, R. et Zyskind, H. (1976). « Plato’s Meno 89c : "Virtue is knowledge" – a hypothesis? », ''Phronesis'' 21, 130-4. * Vlastos, G. (1965). « Anamnesis in the Meno », ''Dialogue'' 4, 143-67. * Vlastos, G. (1969). « Socrates on acrasia », ''Phoenix'' 23, 71-88. * Vlastos, G. (1991). ''Socrates : Ironist and Moral Philosopher''. Cambridge University Press. * Vlastos, G. (1994). ''Socratic Studies''. Cambridge University Press. * White, N. P. (1974). « Inquiry », ''Review of Metaphysics'' 28, 289-310 ; repris dans Day (éd.) 1994 : 152-71. [[Catégorie:Commentaire philosophique]] 0kqppm3kvwy9j046tj4d0yldi17iwwm Pour lire Platon/Guide des dialogues/Charmide 0 31166 765002 764630 2026-04-25T08:06:59Z PandaMystique 119061 765002 wikitext text/x-wiki {{sous-pages}} == Introduction générale == === Nature et place du dialogue === {{wikisource|Charmide|Charmide}} Le ''Charmide'' appartient à ce groupe de dialogues dits « socratiques » que Platon composa, selon l'hypothèse la plus communément reçue, entre la mort de Socrate (399) et son premier voyage en Sicile (388-387). On ne saurait en serrer davantage la datation sans hypothèses arbitraires : Hazebroucq le situe entre 399 et 390, Kahn entre 386 et 380, Solère-Queval vers 388, Dušanić en 382. En l'absence d'arguments décisifs, la prudence invite à s'en tenir à la fourchette large. Le dialogue appartient, dans la classification de Thrasylle (Diogène Laërce III, 57-61) reprise jusqu'au dix-neuvième siècle, à la cinquième tétralogie, avec le ''Lachès'', le ''Lysis'' et le ''Théagès''. Il pose une question de forme simple, « qu'est-ce que la σωφροσύνη ? », et s'achève dans une aporie avouée : ni Socrate, ni Critias, ni Charmide ne sont parvenus à définir cette vertu. Cette structure aporétique est commune à plusieurs dialogues de jeunesse, tels l{{'}}''Euthyphron'', l{{'}}''Hippias majeur'' ou le ''Lysis''. Comment interpréter cet échec ? Plusieurs lectures s'offrent, dont aucune ne s'impose absolument. Une lecture classique, notamment développée par V. Goldschmidt (''Les Dialogues de Platon'') et C. Chrétien (''Platon, Charmide de la sagesse''), y reconnaît la trace d'un « parcours initiatique » : l'aporie évoquerait la régression rituelle qui conditionne la renaissance de l'initié, l'errance argumentative rappellerait l'épreuve imposée aux adolescents dans certaines sociétés archaïques. Cette lecture trouve son appui textuel dans le ''Banquet'' (221d-222a), où Alcibiade compare les discours de Socrate à des objets grotesques en surface mais remplis d'« images de vertu » à l'intérieur. Une autre lecture, plus sobre, voit dans l'aporie le signe d'une limite propre de la méthode socratique, que Platon s'emploiera plus tard à dépasser dans la ''République'' par l'élévation de l'âme au monde des Idées. Nous reviendrons plus loin sur cette alternative ; il suffit, pour commencer, de ne pas confondre la structure apparente du dialogue avec sa signification philosophique ultime. === Le sujet : la σωφροσύνη === Le mot grec est intraduisible en un seul terme français : il voisine tantôt avec « tempérance », tantôt avec « modération », « maîtrise de soi » ou « sagesse ». ''Sōphrosunē'' se décompose en ''sōs'' (sain) et ''phrēn'' (pensée) ; elle désigne littéralement la « santé de l'esprit ». Dans l'usage classique, le terme recouvre un faisceau de significations : modération dans l'action et dans les passions, pudeur sexuelle, retenue civique, respect des hiérarchies, conscience des limites humaines. Aristophane l'emploie tour à tour pour désigner le comportement ordonné (''Nuées'', 423), la stabilité civique (''Oiseaux'', 414), la réserve féminine (''Lysistrata'', 411) et le respect des lois (''Ploutos'', 388). Cette polysémie même fait la difficulté, et par là même l'intérêt, du dialogue. Dans le corpus platonicien, la σωφροσύνη reçoit des traitements variés. Dans le ''Protagoras'' (332a), Socrate la glose comme le fait d'« agir correctement et utilement » et tente de la rapprocher de la sagesse (σοφία). Dans le ''Gorgias'' (506e-507d), elle nomme l'ordre de l'âme dans lequel consiste la vertu humaine. Dans la ''République'' (430d-432b), elle est « accord » (''homonoia'') entre ceux qui commandent et ceux qui obéissent, harmonie des cités comme des âmes. Les ''Lois'' (696b-697c) la poseront comme condition préalable de la justice. Le ''Charmide'' précède et prépare ces analyses en s'attachant d'abord à la question d'essence : qu'est-ce donc que cette vertu ? Le sujet est politiquement chargé. Dans l'Athènes du cinquième siècle finissant, « gouverner avec σωφροσύνη » est presque un mot d'ordre oligarchique. Thucydide rapporte qu'à la fin de la guerre, Pisandre demandait devant l'Assemblée que l'on « gouverne avec plus de σωφροσύνη » et qu'on « confie les magistratures à un plus petit nombre » (8.53.3). Les milieux aristocratiques spartophiles s'en réclament contre la ''polypragmosynē'' démocratique. Le choix de Critias (futur chef des Trente) et de Charmide (futur membre des Dix du Pirée) comme interlocuteurs principaux confère ainsi à l'enquête une coloration politique que le lecteur moderne ne doit pas sous-estimer. === Les personnages === Socrate, qui narre tout le dialogue à un auditeur anonyme, rentre du front de Potidée. Le contexte historique précis est cependant controversé. La critique récente hésite entre deux identifications de la bataille mentionnée en 153b. L'hypothèse classique renvoie à la bataille de 432 devant Potidée, à laquelle Socrate participa et au cours de laquelle il sauva la vie d'Alcibiade (''Banquet'' 220d-e) ; mais, comme le note L.-A. Dorion dans son introduction à la traduction GF Flammarion, cette hypothèse est problématique, notamment parce que l'armée athénienne ne fut pas démantelée après la bataille de 432. Selon plusieurs commentateurs récents (Luckhurst 1934, McAvoy 1996, Planeaux 1999), il s'agirait plutôt de la bataille de mai 429 aux environs de Spartôlos, où les Athéniens essuyèrent une lourde défaite (Thucydide II, 79) ; cette hypothèse est compatible avec le retour à Athènes que le ''Charmide'' présuppose. La date dramatique du dialogue se situerait donc vers 429, soit quelque vingt-six ans avant la tyrannie des Trente (404-403). Ce que le lecteur, en tout état de cause, sait par avance, c'est la catastrophe que l'histoire réserve à deux des trois interlocuteurs. Charmide, fils de Glaucon, est un adolescent à la beauté proverbiale, cousin et pupille de Critias, oncle maternel de Platon. Le ''Banquet'' (222b), situé en 415, le range parmi les anciens jeunes amis de Socrate qui s'en sont éloignés. Il périra en 403 à la bataille de Munychie, dans les rangs des oligarques. Critias, fils de Callaischros (vers 460-403), est au moment de la scène un homme mûr. Poète et polymathe, familier d'Alcibiade, il entretient des sympathies spartiates. Les fragments conservés de son œuvre (DK 88 B6-7) attestent qu'il a théorisé la σωφροσύνη : une élégie loue la modération spartiate dans la boisson, y associe la « Santé, voisine de la Sainteté » et personnifie la Σωφροσύνη comme une déesse. Il retient par ailleurs la maxime attribuée au Spartiate Chilon, « rien de trop », et la rapproche d'une autre inscription delphique. Le choix de Critias comme interlocuteur principal dans le ''Charmide'' n'est donc pas ironique au sens où il serait aberrant : il est légitime qu'un homme qui a érigé la σωφροσύνη en idéal personnel et civique vienne débattre de sa définition. L'ironie, réelle, tient plutôt au contraste entre l'ambition théorique du personnage et la catastrophe politique que l'histoire lui réservera. Critias fut en 404 l'un des chefs du régime oligarchique imposé par Sparte après la défaite athénienne : la tyrannie dite « des Trente », qui fit exécuter sans jugement près de mille cinq cents citoyens et chassa vers le Pirée plus de cinq mille autres (Isocrate 7, 67 ; pseudo-Aristote, ''Constitution d'Athènes'' 35, 4). Il mourut lui-même à la bataille de Munychie, aux côtés de son jeune pupille. La tradition postérieure, relayée par Xénophon (''Mémorables'' 1, 2, 12 ; ''Helléniques'' 2, 4, 19), en a fait le plus féroce des Trente. Il convient toutefois de ne pas réduire le personnage à une caricature noire, comme l'ont souligné Tuozzo et Tsouna : c'est dans les tensions du portrait, dans ses clairs-obscurs, que se joue l'interprétation platonicienne. Dans le ''Timée'' (20a) et dans le ''Critias'', Platon lui prêtera d'ailleurs un rôle positif et savant. Chéréphon, enfin, est le familier enthousiaste de Socrate, présenté comme un ''manikos'' (153b), terme que l'on peut rendre par « exalté ». On sait par l{{'}}''Apologie'' (21a) que c'est Chéréphon qui interrogea la Pythie et reçut l'oracle déclarant qu'aucun homme n'était plus sage que Socrate : sa présence dès l'ouverture inscrit donc discrètement Delphes à l'horizon du texte. === Méthode et enjeux === Toute définition proposée sera réfutée. Mais l'échec des définitions successives n'exclut pas que le dialogue progresse, dans la mesure où chaque réfutation met en évidence un aspect de la vertu que la formule antérieure avait laissé échapper. Selon la ''Lettre VII'' (342a-b, 343e), la recherche de l'essence d'une réalité procède à la fois par l'analyse du nom, par la formulation de définitions et par l'examen des « images », c'est-à-dire des incarnations partielles. Le ''Charmide'' met en œuvre ces trois procédés : Charmide et Socrate, par leurs conduites respectives, offrent deux images vivantes de la σωφροσύνη, que les définitions successives viennent éprouver. L'un des fils interprétatifs les plus probants a été dégagé par l'édition Dorion : l'incantation (''epōidē'') que Socrate apprend aux Thraces et qu'il propose d'administrer à Charmide désigne métaphoriquement l'élenchos, c'est-à-dire la réfutation dialectique. Elenchos et incantation sont rapprochés non par leur forme mais par leurs effets : l'un et l'autre ont pour propriété d'engourdir l'interlocuteur et de le rendre disponible à l'action de celui qui parle, de sorte que Socrate est parfois décrit, chez Platon lui-même, comme un « sorcier » (''Ménon'' 80a-b) ou comme une « raie torpille » (''Ménon'' 80a). Si cette hypothèse herméneutique est recevable, le prologue du ''Charmide'' ne vaut pas simple décor : il énonce déjà métaphoriquement la thèse selon laquelle la sagesse ne peut être produite dans l'âme que par l'exercice de la réfutation dialectique. La fin du dialogue, en consacrant Socrate comme dispensateur de ce « charme », confirmerait cette lecture. == I. Le prologue (153a à 159a) == === 1. Le retour de Potidée (153a-c) === « J'étais arrivé la veille au soir de l'armée de Potidée, et je m'empressai, après une si longue absence, de revoir les lieux que j'avais coutume de fréquenter. » Ainsi s'ouvre le récit. Socrate parle à la première personne à un auditeur muet, procédé qu'on retrouve dans le ''Lysis'', le ''Parménide'', la ''République'' et le ''Théétète''. Chéréphon, à peine Socrate est-il entré dans la palestre de Tauréas, s'enquiert des pertes : « l'engagement a été très rude et il y a péri beaucoup d'hommes de notre connaissance ». Socrate répond laconiquement : « le rapport est assez juste ». Il accepte ensuite de s'asseoir auprès de Critias. Cette ouverture apparemment anecdotique mérite attention. Socrate, Athénien par excellence, n'a quitté sa cité que contraint par ses obligations militaires ; il rentre du front, où il vient d'assister à un combat sanglant, et se montre prêt à philosopher sans dramatisation. Cette placidité est déjà l'un des indices dramatiques de la σωφροσύνη que le dialogue s'apprête à interroger : Tsouna a bien noté que Socrate, à la différence du « manique » Chéréphon, paraît maître de lui-même, sans pour autant afficher d'héroïsme. La mention de la bataille inscrit cependant la scène sous un horizon plus grave que ne le laisserait penser son ton poli : le siège de Potidée fut, dans l'un ou l'autre de ses deux épisodes, un épisode meurtrier de la guerre du Péloponnèse. Deux détails topographiques méritent mention. La palestre de Tauréas se trouve « en face du temple de Basilè ». L'identification de cette divinité n'est pas assurée. Plusieurs hypothèses ont été proposées : pour Witte (1970, p. 40-42), Basilè serait Perséphone, reine des Enfers, identifiée sur la base d'une inscription attique de 418 et du caractère chthonien supposé du sanctuaire ; pour Shapiro (1986), thèse que suit l'édition Dorion, Basilè serait la personnification de l'ancienne royauté (''basileia'') athénienne ; pour Rotondaro (2000), le temple de Basilè serait lié au soin de l'âme, par opposition à la palestre tournée vers le soin du corps. Tsouna, prudente, note que « l'identité de Basilè ne peut être inférée avec certitude », tout en penchant pour Perséphone. Il s'ensuit que les lectures qui font du temple de Basilè le signe d'une tonalité chthonienne et eschatologique de l'ensemble du dialogue reposent sur une identification discutée : elles relèvent de la conjecture herméneutique plus que du fait textuel. L'autre détail significatif est moins incertain. Dans les premières lignes, le terme ''psukhē'' (âme) apparaît avec une fréquence que L.-A. Dorion a relevée : sept occurrences sur onze dans l'ensemble du dialogue se concentrent dans le prologue. Cette insistance est structurelle : le prologue établit un lien entre la sagesse et l'âme, lien que Critias, plus tard, oubliera en substituant à ''psukhē'' le terme plus intellectualiste de ''dianoia'' (pensée). L'ouverture dessine ainsi, sans le thématiser, le clivage qui départagera Socrate et Critias. === 2. L'entrée de Charmide et l'épreuve érotique (153d-155e) === Socrate s'enquiert auprès de Critias de l'état de la philosophie à Athènes et des jeunes gens qui s'y distinguent par la beauté ou par l'esprit. La double question n'est pas fortuite : elle signale que la qualité intellectuelle de la jeunesse mesure la santé spirituelle de la cité. Critias annonce l'arrivée imminente de son cousin Charmide : « celui qui paraîtra tout à l'heure sera bientôt réputé le plus beau » (''kallistos'', 154a). Charmide entre, escorté d'une bande d'admirateurs, et toute la palestre se tait. Socrate se décrit d'abord comme une « mesure sans valeur » (''leukē stathmē''), une « règle blanche » en matière de beauté : presque tous les jeunes gens de cet âge lui paraissent beaux. La vue de Charmide modifie ce régime. Même les enfants, note-t-il, sont saisis. Et quand Critias fait approcher son cousin sous prétexte de le présenter au médecin, Socrate confesse son trouble : apercevant « ce qu'il y avait sous le manteau » (155d-e), il n'est plus « maître de lui-même », il « brûle », il se sent « comme une bête sauvage ». La tempête érotique est à son comble. Il résiste pourtant. Là où les autres hommes se bousculent sur les bancs pour se rapprocher de l'adolescent, où l'un d'eux tombe même à la renverse, Socrate se ressaisit. On peut y lire, sans prétendre que Platon ait voulu ici dessiner un tableau continu, une préfiguration du mythe du ''Phèdre'' (253c-254e) : le cocher de l'âme conduit ses deux chevaux, l'un noble, l'autre sans frein, et c'est son redressement qui lui permet, apercevant « le visage du bien-aimé », d'être « porté par la réminiscence vers la nature même de la beauté » et de la voir « assise à côté de la Sagesse sur son trône vénérable ». Qu'il y ait analogie de structure ne signifie pas qu'il faille projeter ici la doctrine développée dans le ''Phèdre'' ; l'analogie, prudente, sert seulement à faire voir que la maîtrise érotique socratique est un fait dramatique signifiant. Plus fondamentalement, le passage illustre ceci : avant que la σωφροσύνη ne soit thématisée comme objet de définition, elle est exemplifiée dans le héros. Socrate tient bon à la guerre et tient bon devant le bien-aimé. Cette exemplification n'est pas sans ambivalence. La maîtrise socratique peut se confondre avec de la froideur, voire avec du mépris pour ce qui émeut ordinairement les hommes. Alcibiade en fera le reproche dans le ''Banquet'' (215-222). Et dans l'ouverture même du ''Charmide'', une inquiétude discrète affleure : Socrate accepte de se prêter à une ruse, à un mensonge thérapeutique sur le mal de tête. Est-ce la conduite d'un sage ? La question orientera la suite du dialogue. === 3. Le stratagème du mal de tête (155b-156d) === Critias, complice, présente Socrate comme un guérisseur capable de soigner le mal de tête dont souffre Charmide le matin. Socrate accepte le rôle. Il prétend détenir un remède composé d'une certaine feuille et d'une incantation (''epōidē''), mais précise aussitôt que la feuille seule, sans l'incantation, ne guérit rien. Pourquoi Socrate consent-il à ce mensonge thérapeutique ? La ''République'' (389c) fournit un principe : le mensonge est utile aux hommes sous forme de remède, à condition d'être réservé au médecin. Pour conduire autrui vers le bien, la ruse est parfois nécessaire, car le but lointain, la sagesse, a moins d'attrait immédiat que la séduction d'un soulagement physique. Nul ne peut désirer ce qu'il ne connaît pas. Le mensonge de Socrate est donc pédagogique : il parle à Charmide le seul langage que celui-ci puisse entendre, pour le conduire insensiblement au soin de l'âme. On pourra préférer, avec d'autres commentateurs, ne pas forcer la clef du « pieux mensonge » et voir plutôt dans le stratagème une ruse sociale : la consultation médicale est le cadre discret qui permet à Socrate d'aborder philosophiquement un jeune homme entouré d'admirateurs. Les deux lectures ne sont pas exclusives. De quoi souffre Charmide ? D'un mal de tête matinal et chronique. Drew Hyland a suggéré qu'il pourrait s'agir d'une « gueule de bois » due à des excès nocturnes. L'hypothèse est possible mais spéculative, et peu compatible avec la réputation de réserve attachée au personnage. Plus sobrement, on peut observer que la métaphore du mal de tête et de son remède joue avec l'une des acceptions courantes du mot σωφροσύνη : « avoir bon sens », « être sain d'esprit ». Charmide souffre de la tête, et son remède sera la sagesse. La mise en scène dramatique est ainsi étroitement liée au jeu de mots sur la vertu. === 4. L'incantation thrace et la doctrine de Zalmoxis (156d-157c) === Voici le cœur du prologue. L'incantation, précise Socrate, il l'a apprise d'un médecin thrace, disciple de Zalmoxis, dieu honoré chez les Gètes. Le médecin thrace enseignait que les médecins grecs ont raison de dire qu'il ne faut pas soigner les yeux sans soigner la tête, ni la tête sans soigner le corps entier. Mais, ajoutait-il, Zalmoxis va plus loin : on ne peut soigner le corps sans soigner l'âme. « Et c'est pourquoi la plupart des maladies échappent aux médecins grecs : ils ignorent le tout dont il faut s'occuper, et le tout allant mal, il est impossible que la partie se porte bien ». L'âme est la source du bien et du mal pour le corps et pour l'homme. C'est elle qu'il faut soigner d'abord. Or, dit le Thrace, « on soigne l'âme par des incantations, et ces incantations sont les beaux discours (''hoi logoi hoi kaloi''). Ils font germer dans les âmes la sagesse (σωφροσύνη) ; et une fois qu'elle y est établie, il est facile de procurer la santé à la tête et au reste du corps ». Ce développement, qu'on prendrait à tort pour une digression pittoresque, énonce plusieurs des thèses directrices du dialogue. En premier lieu, la σωφροσύνη est identifiée à la santé de l'âme. Cette équivalence traverse la pensée grecque depuis Héraclite, chez qui on lit que « tous les hommes ont en partage de se connaître eux-mêmes et d'être ''sōphrones'' » (DK 22 B116 = D30 LM). Elle constitue, avec l'éloge traditionnel de l{{'}}''aidōs'', la toile de fond que les définitions ultérieures ne cesseront de solliciter. En deuxième lieu, la philosophie est présentée comme une médecine. Les « beaux discours » sont le remède. L.-A. Dorion défend l'idée que l'incantation (''epōidē'') du ''Charmide'' fonctionne comme une désignation métaphorique de l'élenchos, c'est-à-dire de la réfutation dialectique. L'argument n'est pas arbitraire : il repose sur plusieurs convergences textuelles. D'une part, l'incantation socratique agit sur l'âme par la parole, comme la réfutation dialectique ; d'autre part, Socrate est comparé ailleurs par Platon lui-même à un sorcier et à une raie torpille qui engourdit son interlocuteur (''Ménon'' 80a-b), termes qui relèvent du même champ lexical que l'incantation thrace ; enfin, dans la scène finale (175e-176b), Charmide accepte de se soumettre quotidiennement à ce « charme » socratique, ce qui n'a guère de sens s'il s'agit d'une simple formule magique mais prend tout son sens si l'incantation désigne l'épreuve dialectique continue. Si l'on admet cette équivalence, le prologue énonce déjà métaphoriquement la thèse qui gouverne le dialogue entier : la sagesse ne se produit dans l'âme que par le travail de la réfutation. La scène finale ne fait alors que confirmer le prologue. On peut rapprocher cette lecture de ce que le ''Gorgias'' (464b-466a) dira bientôt : la médecine de l'âme est la véritable politique, par opposition à la rhétorique sophistique qui se contente de flatter. En troisième lieu, le principe holistique du médecin thrace (le tout commande la partie) ouvre la polémique qui traversera tout le dialogue : celle de la subordination entre les savoirs spécialisés et un savoir englobant. Lorsque Critias définira plus loin la σωφροσύνη comme « science des sciences », il développera à sa manière cette intuition. On remarquera cependant que l'allégorie thrace n'est pas sans équivoque : si le corps est « la partie » et l'âme « le tout », dans quel sens l'âme est-elle le tout ? N'est-ce pas plutôt l'homme entier, âme et corps, qui constitue le tout ? L'indétermination, voulue ou non, pointe une difficulté qui ne sera jamais complètement résolue. En quatrième lieu, la référence à Zalmoxis inscrit le soin de l'âme dans un horizon religieux. Hérodote (IV, 94-96) rapporte que les Gètes pratiquaient un culte de Zalmoxis associé à la croyance en l'immortalité de l'âme, et que les initiés étaient dits ''athanatizontes'', « ceux qui se rendent immortels ». On peut en déduire, avec certains commentateurs, que Platon suggère par là une portée eschatologique du soin de l'âme : soigner l'âme ne serait pas seulement viser le bien-être de cette vie, mais préparer l'âme à sa condition au-delà. Cette lecture n'est cependant pas explicitement soutenue par le texte. Elle se greffe sur l'analogie thrace sans que Socrate en thématise ici la dimension eschatologique. Il faut donc l'entendre comme une hypothèse herméneutique, laquelle trouve ses appuis davantage dans le ''Phédon'' (78a, où Socrate mentionne les « médecins-magiciens thraces » et les incantations comme remèdes à la peur de la mort) que dans le ''Charmide'' lui-même. En cinquième lieu, Socrate insiste sur le serment qu'il a prêté au Thrace : ne jamais administrer le remède pour la tête sans avoir d'abord traité l'âme par l'incantation. Ce serment a une fonction dialectique précise. Il garantit à Socrate la maîtrise du dispositif : il ne « guérira » Charmide qu'à condition que celui-ci accepte d'abord de « soumettre son âme » à la philosophie. La consultation médicale est ainsi convertie en entretien dialectique. En dernier lieu, la localisation thrace n'est sans doute pas arbitraire. La Thrace fonctionne chez Platon comme lieu emblématique d'une sagesse venue des confins, tournée vers les mystères (cf. encore ''Phédon'' 78a). Que Socrate rentre de Potidée, c'est-à-dire de Thrace, porteur d'une telle incantation, suggère que la campagne militaire a été en même temps, pour lui, un apprentissage philosophique, au moins métaphorique. === 5. Éloge de Charmide et première mise à l'épreuve (157d-159a) === Critias répond que Charmide n'a pas besoin qu'on lui inculque la σωφροσύνη, puisqu'il la possède déjà au plus haut point. Il passe, à Athènes, pour le plus ''sōphrōn'' des jeunes gens, tout en étant le plus beau. Socrate abonde : la noblesse de lignage de Charmide (par son père, famille de Dropidès, l'ami de Solon ; par sa mère, famille de Pyrilampe, liée à Périclès) laisse attendre, au jugement du discours aristocratique traditionnel, une qualité d'âme correspondante. Il attire cependant subtilement l'attention (154d-e, 158a) sur le fait que la beauté extérieure et la noblesse ne garantissent pas, à elles seules, que l'âme soit telle qu'elle doit être. La proposition de Socrate d'examiner ensemble le cas de Charmide est d'abord accueillie avec un sourire imperceptible mais révélateur : Charmide rougit (158c). Ce rougissement est un signe de pudeur (''aidōs''), c'est-à-dire précisément de l'un des traits traditionnellement associés à la σωφροσύνη. La vertu est, avant d'être dite, visible dans le corps même de l'adolescent. Socrate le note : « il m'a paru plus beau que jamais ». Il y a là une beauté morale (''kallion'') superposée à la beauté physique. Socrate demande alors à Charmide s'il possède la σωφροσύνη. Le jeune homme est pris dans une difficulté plus sociale encore que philosophique : s'il répond oui, il se fera taxer de présomption ; s'il répond non, il contredira ses admirateurs, et en particulier Critias, ce qui serait insolent. Il ne peut donc répondre. L'incapacité même est éloquente : Charmide ignore ce qu'il est, et il mesure d'abord les implications sociales de sa réponse avant d'en mesurer la portée intellectuelle. La σωφροσύνη qu'on lui prête se dérobe dès qu'on tente de la lui faire dire. Socrate fournit alors la procédure qui va orienter toute la discussion : « tu dois savoir, mieux que personne, si cette vertu habite en toi ; tu peux donc, en tournant ton regard vers toi-même, nous dire ce qu'elle t'apparaît être » (158e-159a). Cette procédure (''eis seauton apoblepsas'', « tourner le regard vers soi-même ») préfigure l'injonction delphique que Critias reprendra dans la cinquième définition. == II. Les trois définitions de Charmide (159b à 162b) == Charmide propose successivement trois définitions : tranquillité, pudeur, faire ses propres affaires. Chacune révèle un aspect distinct de la σωφροσύνη traditionnelle. La première porte sur la manière extérieure d'agir ; la deuxième, sur le ressort intérieur de cette manière ; la troisième, sur le contenu moral et civique de l'action. Ensemble, elles décrivent la phénoménologie de la σωφροσύνη telle que la culture grecque classique la peint. Ensemble aussi, elles se révèlent incapables de saisir ce qui, dans cette vertu, est proprement normatif. === 1. Première définition : une sorte de tranquillité (159b à 160d) === Pressé par Socrate, Charmide répond, avec quelque hésitation, que la σωφροσύνη consiste « à faire toutes choses avec ordre et tranquillité : marcher dans les rues, discuter, et ainsi de tout le reste » ; en un mot, « une sorte d'état de tranquillité » (''hēsuchiotēs tis'', 159b3). Le terme ''hēsuchia'' désigne le calme posé, la lenteur mesurée, le comportement sans précipitation. Xénophon décrit en ces termes la σωφροσύνη spartiate : « marcher dans la rue en gardant les mains près du corps, aller en silence, ne pas regarder partout » (''Constitution des Lacédémoniens'' 3, 4). Aristophane, dans les ''Nuées'' (962-984), loue les jeunes gens qui prennent soin de ne pas attirer l'attention sur leur beauté. La ''hēsuchia'' est aussi, chez Thucydide (3, 82, 4), l'opposé politique de la témérité ; elle caractérise l'aristocrate qui ne se mêle pas des affaires ni ne brigue le pouvoir. C'est la posture corporelle et sociale de l'homme bien né : silencieux, posé, retenu. Pindare la personnifie (''Pythique'' 8) comme la « bienveillante Hésychia », opposée à la violence de l'hubris. Charmide lui-même, par sa manière d'entrer dans la palestre (retenu, distingué, à l'opposé de ses compagnons bruyants), incarne cette définition. Il décrit donc, sans en prendre conscience, sa propre manière d'être, ou plutôt l'image qu'on lui a donnée de lui-même et qu'il n'a pas examinée. La rapidité avec laquelle il formule et accepte la définition est déjà symptomatique. On notera toutefois la prudence du ''tis'' : la σωφροσύνη serait « une sorte » de tranquillité, ce qui pourrait laisser place à d'autres tranquillités moins dignes de ce nom. La réfutation socratique est virtuose, presque sophistique. Elle se déroule en deux temps. S'agissant des activités du corps, Socrate interroge : la σωφροσύνη est-elle une belle chose (''kalon'') ? Oui. Or, dans l'écriture, la lecture, le jeu de la cithare, la lutte, les sauts et toutes les activités corporelles, la vitesse et la vivacité sont plus belles que la lenteur. Il s'ensuit que, pour ces activités, la tranquillité n'est pas la σωφροσύνη. S'agissant des activités de l'âme, même transposition : apprendre avec facilité est plus beau qu'apprendre péniblement ; apprendre avec facilité, c'est apprendre vite ; donc la vitesse est belle. Le même raisonnement vaut pour le rappel des souvenirs, la compréhension d'un discours, la recherche, la délibération. Conclusion : la σωφροσύνη ne saurait être la tranquillité, puisque le contraire de la tranquillité est souvent plus beau. La réfutation est brillante, mais elle est logiquement insuffisante à plusieurs titres. D'abord, l'antonyme propre de ''hēsuchia'' n'est pas la vitesse, mais la précipitation (''hybris''). Charmide n'a pas été invité à défendre la lenteur contre la vitesse, mais le calme mesuré contre la précipitation désordonnée. Ensuite, Socrate joue sur plusieurs glissements sémantiques : « facile » n'est pas « rapide », « irrésolution » n'est pas « lenteur ». Enfin, le raisonnement par accumulation d'exemples particuliers ne démontre pas qu'en ''toutes'' circonstances la vivacité soit préférable au calme. Une difficulté supplémentaire tient au ''tis'' : si la σωφροσύνη est ''une sorte'' de tranquillité, c'est-à-dire une espèce particulière, pour la réfuter, Socrate devrait montrer que certains cas de σωφροσύνη ne sont pas des cas de tranquillité ; or il procède en sens inverse. La faiblesse même de la réfutation porte un enseignement. Charmide, s'il avait possédé la σωφροσύνη qu'il vient de décrire, aurait dû résister au rythme socratique, demander des précisions, discerner les glissements. Il acquiesce au contraire à chaque pas. Il démontre donc, par son comportement dans la discussion, qu'il ne possède pas la tranquillité réfléchie qu'il vient de revendiquer comme définition. La réfutation n'est pas d'abord une critique conceptuelle : elle est un examen éthique de l'interlocuteur. Plus profondément, l'échec de la première définition tient à ce que Charmide a décrit une propriété phénoménale de certaines actions (le rythme lent), en oubliant la dimension normative qui ferait de cette propriété une vertu. La tranquillité n'est vertueuse que lorsqu'elle est orientée vers une fin bonne. Socrate, dans son résumé même (160b), réintroduit subtilement cette dimension normative en rappelant l'agir « avec ordre » (''kosmiōs'') que Charmide avait mentionné mais aussitôt oublié. === 2. Deuxième définition : la pudeur (160d à 161b) === Invité par Socrate à porter de nouveau son regard sur lui-même, Charmide propose : « la σωφροσύνη est ce qui fait qu'un homme a le sentiment de la honte et de la retenue ; elle est la même chose que la pudeur (''aidōs'') » (160e3-5). La définition est plus profonde que la précédente. Là où la tranquillité décrivait un comportement extérieur, la pudeur en désigne le ressort intérieur. Charmide a cette fois réellement regardé en lui-même : il vient d'être l'objet d'une interrogation socialement délicate, il a rougi, et il sait que c'est précisément cette rougeur qui a paru, aux yeux de Socrate, manifester la σωφροσύνη. L'interlocuteur s'est donc rapproché de la procédure que Socrate lui avait prescrite. La notion d{{'}}''aidōs'' occupe une place centrale dans l'éthique grecque traditionnelle. Elle recouvre à la fois la honte par anticipation (peur de faire ce qui disqualifierait aux yeux d'autrui) et le respect qu'on porte aux autres et à soi-même. E. R. Dodds a montré qu'elle constituait, dans la culture homérique, le principal ressort de la conscience morale. Bernard Williams a affiné l'analyse : l{{'}}''aidōs'' se distingue de la honte moderne par son ancrage dans un « regard imaginé » que l'agent a intériorisé. Dans le discours d'Archidamos chez Thucydide (1, 84), « nous sommes guerriers parce que la σωφροσύνη contient la pudeur comme son principal constituant, et la pudeur contient la bravoure ». Le mythe de Protagoras (322b-323a) présente Zeus distribuant ''aidōs'' et ''dikē'' à tous les hommes comme conditions de la vie en cité, et glisse de ''aidōs'' à σωφροσύνη avec si peu de transition qu'Aristote (''Éthique à Eudème'' III, 7, 1234a32-33) pourra noter que certains les identifient. Une inscription funéraire attique, à peu près contemporaine de la mort de Socrate, présente même la déesse Σωφροσύνη comme la fille de la « magnanime » Αἰδώς (IG II² 6859). En définissant la σωφροσύνη comme pudeur, Charmide touche le cœur psychologique de la vertu telle que sa culture la pense. Il s'inscrit dans la lignée de l'éthique aristocratique dont il est le produit : sa modération n'est pas crainte des conséquences extérieures, mais attention au regard d'autrui. C'est l'éthique de l'élite athénienne traditionnelle, que Critias représente politiquement. La réfutation socratique est brève mais subtile (160e-161b). Elle procède en trois pas. D'abord, la σωφροσύνη est belle (''kalon''), Charmide l'a admis. Elle rend ''bons'' ceux qu'elle habite, et rien ne peut rendre bon ceux qu'elle rendrait mauvais ; donc la σωφροσύνη est à la fois belle et ''bonne'' (''agathon''). Ensuite, Homère (''Odyssée'' XVII, 347) ne dit-il pas que « la pudeur n'est pas bonne pour l'homme dans le besoin » ? Charmide acquiesce : il croit Homère. L{{'}}''aidōs'' n'est donc pas toujours bonne ; elle est tantôt bonne, tantôt mauvaise. Or la σωφροσύνη est simplement bonne. Donc la σωφροσύνη n'est pas la pudeur. La démarche de Socrate introduit une distinction essentielle : la σωφροσύνη n'est pas seulement belle (au sens du ''kalon'' : noble, admirable, convenable), elle est bonne, normativement bonne, partout et toujours. Cette exigence gouvernera toute la suite de la discussion. On remarquera le principe implicite, qui réapparaîtra plus loin : « le semblable produit le semblable », une bonne chose ne peut produire du mauvais. Socrate réfute par ailleurs Charmide par son propre ressort. C'est par respect pour Homère, autorité poétique incontestable, que Charmide cède. Résister serait contraire à la pudeur. Charmide capitule donc par ''aidōs'' devant la réfutation de l{{'}}''aidōs'' : l'exemplification de sa définition se confond avec sa réfutation. Car un Charmide pleinement ''sōphrōn'', au sens où Socrate l'entend, aurait résisté à Homère pour peu qu'il eût eu de bonnes raisons de le faire. Il aurait remarqué que la phrase est prononcée par Eumée et reprise par Télémaque, qu'elle vise le besoin extrême du mendiant, que son sens contextuel est autre. Socrate, dans d'autres dialogues (''République'' III), manifestera lui-même des réserves à l'égard de l'autorité homérique en matière morale. L'argument est donc intentionnellement faible, et son acceptation par Charmide est une deuxième illustration du déficit de σωφροσύνη. La citation d'Homère délivre par ailleurs un enseignement proprement socratique. Dans le contexte de l{{'}}''Odyssée'', Eumée recommande à Ulysse déguisé de ne pas se laisser retenir par la honte d'aller mendier chez les prétendants : il faut manger d'abord. Mais lu dans l'horizon du dialogue, le vers homérique prend un autre sens. Charmide, dans le besoin (d'apprendre, de s'examiner, d'accepter son ignorance), ne doit pas se laisser retenir par la honte. La vraie pudeur devrait porter non sur le fait de paraître ignorant, mais sur le fait de l'être sans le savoir. Ce qui est honteux, c'est de refuser d'apprendre (''Hippias mineur'' 372c : « j'ai une qualité qui me sauve : je n'ai pas honte d'apprendre »). Le renversement, implicite, est typique de l'ironie platonicienne. === 3. Troisième définition : faire ses propres affaires (161b à 162b) === Deux fois réfuté, Charmide se souvient avoir entendu quelqu'un dire que la σωφροσύνη est « faire ses propres affaires » (''to ta heautou prattein'', 161b6). Il tait l'attribution, mais Socrate, avec une malice transparente, soupçonne Critias. Socrate approuve toutefois la posture méthodologique : « il ne faut pas se demander qui a dit une chose, mais si elle est bien dite » (161c). Il reconnaît cependant que la formule tient d'un véritable « énigme » (''ainigma'', 161c9) qui demande exégèse. La formule est chargée politiquement. Au cinquième siècle, « faire ses propres affaires » appartient au vocabulaire du camp oligarchique, aristocratique, spartophile. Chez Thucydide (1, 68, 1), les Spartiates sont ceux qui « ne s'occupent pas des affaires extérieures » et « font leurs propres affaires ». Dans l{{'}}''Électre'' de Sophocle (678), Clytemnestre ordonne à Électre de « faire ses propres affaires » et de cesser de pleurer son frère. Dans la ''Constitution des Lacédémoniens'' de Xénophon (7, 2), Lycurgue interdit aux citoyens les activités mercantiles, leur assignant comme « seule affaire propre » le service de la liberté civique. Le concept prend sens contre le terme adverse, ''polypragmosynē'', qui désigne, dans la polémique antidémocratique, la tendance athénienne à se mêler de tout. Entre la ''polypragmosynē'' et l{{'}}''apragmosynē'' (l'abstention pure), la formule « faire ses propres affaires » désigne une voie médiane : faire quelque chose, mais non les affaires des autres. Cette troisième définition marque donc une rupture avec les précédentes : elle sort de la description phénoménologique pour entrer dans une détermination normative et sociale. Être ''sōphrōn'', c'est tenir sa place, remplir son rôle, ne pas empiéter sur celui des autres. Elle énonce, à un niveau préphilosophique, ce qui sera dans la ''République'' (433a-b) la définition de la ''justice'' : « faire chacun ses propres affaires ». On peut y voir, avec D. Hyland, l'indication que σωφροσύνη et δικαιοσύνη sont les deux faces d'une même vertu. La lecture reste toutefois hypothétique : la formule pourrait aussi bien n'être qu'une maxime traditionnelle reprise par Charmide sans en tirer de conséquence doctrinale. La réfutation socratique (161d-162a) est un ''reductio ad absurdum''. Suivant la formule, le grammatiste, qui enseigne à écrire des noms (les siens comme ceux des autres), ne ferait pas « ses propres affaires » et ne serait donc pas ''sōphrōn''. Il en va de même pour tout artisan : le tisserand qui fait des vêtements pour autrui, le cordonnier qui fait des chaussures pour autrui, le médecin qui soigne les autres. Si l'on prend la formule au pied de la lettre, nulle division du travail ne peut subsister. Charmide ne sait plus quoi répondre. Socrate l'en tire : peut-être Charmide ne comprend-il pas lui-même ce que veut dire la formule qu'il avance. Critias, qui ne peut supporter de voir sa propre formule maltraitée, entre alors en scène. La mise en scène pédagogique est efficace. La « récitation » de Charmide, d'une pensée qu'il n'a pas faite sienne, est à l'image de « l'acteur qui récite mal les vers d'autrui » (162c-d). Charmide est resté étranger à la formule qu'il a prononcée. Il ne la possède pas, parce qu'il ne l'a pas examinée. Toute la transition, avec la comparaison de l'acteur et du poète, prépare la suite du dialogue, où Critias devra, lui, défendre ses propres thèses. == III. La reprise par Critias : quatrième définition (162b à 164d) == Critias, piqué au vif, prend la relève. Il refuse la lecture littérale donnée par Socrate. La formule, soutient-il, ne dit pas que faire une chose pour soi ou pour autrui est décisif, mais qu'il faut faire les choses ''propres'' à soi, c'est-à-dire convenables, bienfaisantes. Sa défense s'appuie sur une distinction linguistique entre ''prattein'' (agir, faire au sens moral) et ''poiein'' (fabriquer, produire au sens technique). === 1. La distinction ''prattein''/''poiein'' === Critias invoque Hésiode (''Travaux et Jours'' 311 : « le travail n'est point honteux ; la honte est dans l'inaction ») pour soutenir qu'il existe des activités honteuses (simples ''poiēseis'') et d'autres qui sont nobles (véritables ''praxeis''). Le cordonnier qui vend du poisson salé (exemple que Critias choisit dans un mouvement de dédain aristocratique) « fabrique » mais ne « travaille » pas au sens noble. Seules les activités belles et utiles (''kalon kai ōphelimon'') méritent le nom de ''prattein''. Les œuvres propres à soi (''oikeia'') sont les bonnes œuvres ; les œuvres étrangères (''allotria''), les mauvaises. La manœuvre est caractéristique de Critias : il s'adosse à une autorité poétique, décrète une distinction terminologique et attire le sens du mot vers la position qu'il veut défendre. Socrate ne manque pas de relever le procédé. Il rappelle que Prodicos, sophiste célèbre pour ses distinctions verbales, faisait « mille distinctions de ce genre » (''Charmide'' 163d ; cf. ''Protagoras'' 337a, 340a). Il propose alors une mise au point méthodologique décisive : « peu importe le sens fixé par convention, l'important est de voir ce que les mots désignent, quelle pensée ils traduisent, quelle réalité ils donnent à saisir » (163d). Le philosophe, à la différence du sophiste, cherche sous le mot l'idée et sous l'idée le réel. On peut lire, avec Tuckey, dans la technique argumentative de Critias un « goût sophistique pour les antithèses », qui trahit sa formation. === 2. Quatrième définition : faire le bien === Critias tire de ses distinctions la reformulation suivante : la σωφροσύνη est « faire ses propres affaires », entendu au sens où l'on fait les bonnes affaires, les affaires convenables et bienfaisantes. Autrement dit, la σωφροσύνη est « faire le bien » (''ta agatha prattein'', 163e). Socrate formule le même contenu en langage socratique : « faire des choses bonnes et profitables » équivaut à « agir bien » (''eu prattein''), formule qui, en grec, peut signifier aussi bien « bien agir » que « réussir sa vie ». Socrate accepte provisoirement cette reformulation, tout en y décelant d'emblée une difficulté. Si la σωφροσύνη est « faire le bien », celui qui fait le bien par hasard, sans le savoir, sera ''sōphrōn'' sans le savoir. Le médecin qui soigne son patient peut ignorer si le traitement réussira. Cette objection met en lumière un point décisif : la σωφροσύνη, si elle est vertu authentique, doit inclure la ''connaissance'' du bien qu'elle fait. Si la vertu consistait à faire le bien sans qu'il faille le savoir, la σωφροσύνη serait indépendante de la conscience qu'on en a, ce qui contredit l'intuition selon laquelle la vertu engage la responsabilité du sujet. Critias concède, et reformule une dernière fois : il faut connaître ce que l'on fait. L'enjeu devient épistémique. C'est précisément à partir de cette concession que Socrate peut conduire Critias vers la formule qui dominera la seconde partie du dialogue : la σωφροσύνη est une forme de savoir, et plus précisément un savoir portant sur soi-même. == IV. Cinquième définition : se connaître soi-même (164d à 165b) == === 1. Le discours de Critias sur l'inscription delphique === La discussion ayant montré que la vertu doit inclure la connaissance de ce que l'on fait, Critias reformule sa position. Il propose : la σωφροσύνη est « se connaître soi-même » (''to gignōskein heauton''). Il adosse sa définition à la célèbre inscription du temple d'Apollon à Delphes, Γνῶθι σεαυτόν, et prononce alors le discours le plus ambitieux et le plus étrange de tout le dialogue (164d-165a). Cette formule, dit Critias, n'est pas une maxime morale parmi d'autres (comparable aux autres inscriptions delphiques : « rien de trop », ou « donne un gage, la ruine suit »). Ces deux-là ne sont que des conseils utiles (''symboulas chrēsimas'', 165a6-7), posés par ceux qui avaient mal compris la première inscription. « Connais-toi toi-même », au contraire, n'est pas un conseil : c'est une ''salutation'' (''prosrhēsis'') du dieu aux pèlerins qui entrent dans son temple. Cette salutation est la bonne, à la différence de la salutation humaine ordinaire « réjouis-toi » (''chaire''). Le dieu ne souhaite pas aux hommes qu'ils « se réjouissent » (vœu superficiel), mais qu'ils « soient sages » (''sōphronein'') : car c'est cela, être sage, que de se connaître soi-même. L'inscription signifie donc, en code, « sois ''sōphrōn'' » dit en guise de bonjour. La σωφροσύνη coïncide avec la connaissance de soi. Le discours est remarquable. Il installe d'abord un rapport original entre l'homme et le dieu. La salutation est en principe un acte entre égaux, à la différence du conseil, qui suppose une asymétrie. En faisant de « connais-toi toi-même » une salutation, Critias suggère, plus ou moins consciemment, une relative parité entre le dieu et ceux qui entrent dans le temple. Cette audace a conduit certains commentateurs (L. Lampert notamment) à y lire l'ombre de l'athéisme que la tradition doxographique attribue à Critias, rangé avec Prodicos et Diagoras parmi les impies (le fameux fragment de ''Sisyphe'', DK 88 B25, présente les dieux comme une invention d'un homme habile pour contrôler les foules). D'autres lectures, plus nuancées (Tsouna, Tuozzo), observent que rien dans le discours lui-même ne nie l'existence des dieux : Critias suppose au contraire le dieu bienveillant. Ce qui demeure incontestable, c'est l'arrogance intellectuelle du propos : Critias se distingue de la foule des « ordinaires » qui n'ont rien compris, prétend déchiffrer le « langage énigmatique » du dieu, se pose en interprète autorisé. Cette prétention est ironiquement tout le contraire de la σωφροσύνη qu'il veut définir : elle est l'équivalent exact de la présomption que Socrate, dans l{{'}}''Apologie'' (21a-23b), récuse en revendiquant son ignorance. La formule « connais-toi toi-même » est cependant authentiquement socratique. Dans l{{'}}''Apologie'' (21d), c'est par la reconnaissance de son ignorance que Socrate illustre la maxime delphique. Dans le ''Phèdre'' (230a), Socrate dit qu'il n'a pas le temps d'étudier les mythes, car il est occupé à s'examiner lui-même selon l'injonction delphique. Le ''Premier Alcibiade'' (127-134) développe par ailleurs longuement la thèse selon laquelle se connaître soi-même, c'est connaître son âme comme principe de l'homme. On notera toutefois que l'authenticité du ''Premier Alcibiade'' est disputée : contestée par Schleiermacher au début du dix-neuvième siècle, la critique moderne est partagée, certains (Pradeau dans sa traduction GF) le tenant pour authentique et caractéristique de la période moyenne, d'autres le classant parmi les dialogues d'école. Par prudence, on se contentera donc ici de renvoyer à l{{'}}''Apologie'' et au ''Phèdre'', dont l'authenticité n'est pas contestée, quitte à mentionner le ''Premier Alcibiade'' comme attestation indirecte. La formule se laisse entendre en deux sens qui ouvrent une alternative. En un sens positif, se connaître soi-même, c'est connaître ce qu'est l'homme, sa nature propre, ce qui lui convient, et donc la vertu. Cette lecture rapproche la σωφροσύνη d'une ''sophia'' totalisante. En un sens négatif et critique, se connaître soi-même, c'est avoir conscience de sa propre ignorance. Telle est l'interprétation socratique la plus constante. Tuckey a défendu avec force cette seconde interprétation, en soulignant que la formule ''gnōthi seauton'' est, dans la tradition socratique, indissociable de l'aveu d'ignorance. === 2. Un moment de pause === Le passage est marqué par une certaine détente dramatique. Critias, jusque-là agressif et sûr de lui, paraît momentanément purgé de son arrogance (ou feint de l'être). Il accepte de reprendre l'enquête sur des bases nouvelles. Socrate y reconnaît l'énoncé d'une vérité essentielle, dont l'inspiration émane d'une source transcendante, en l'occurrence le dieu de Delphes. Il faut cependant éviter ici d'interpréter trop vite cette scène comme le « moment crucial » d'un rituel d'initiation, sur le modèle proposé par Goldschmidt. L'hypothèse est séduisante, mais elle projette sur le texte une structure qui n'y est pas explicite. Plus sobrement, on se contentera de dire que l'énonciation de la formule delphique marque un tournant argumentatif, sans préjuger de sa signification symbolique plus large. Car Critias va aussitôt reformuler « se connaître soi-même » en termes de science réflexive, et non en termes de conscience critique. L'ambiguïté de la formule permet ce glissement, et c'est de là que naît la difficulté qui occupera toute la fin du dialogue. == V. Sixième définition : la science d'elle-même et des autres sciences (165b à 166c) == === 1. Du « connais-toi toi-même » à la « science de la science » === Socrate reprend la discussion. Si la σωφροσύνη est une forme de connaissance (''gignōskein ti''), elle est aussi une science (''epistēmē tis''), et toute science a un objet (165c4-6). La σωφροσύνη est-elle donc une science ? De quoi est-elle la science ? Quelle est son « œuvre » (''ergon'') ? Les comparaisons que pose Socrate sont parlantes. La médecine est science de la santé, et son œuvre est la santé. L'architecture est science des constructions, et son œuvre est l'habitation. Il en va de même pour toutes les ''technai'' : chacune a un objet propre et produit une œuvre distincte du savoir lui-même. Si la σωφροσύνη est une science, elle devrait à son tour avoir un objet et produire une œuvre. Critias répond d'abord que toutes les sciences ne se ressemblent pas : les mathématiques (le calcul, la géométrie) ne produisent aucune œuvre distincte d'elles-mêmes, et ce sont pourtant des sciences. Socrate concède la remarque, mais insiste : quel est alors l'objet de la σωφροσύνη ? Le calcul porte sur le pair et l'impair ; la géométrie, sur les grandeurs ; si la σωφροσύνη est une science, elle doit pareillement porter sur un objet déterminé. C'est ici que Critias formule la sixième définition, la plus audacieuse du dialogue : la σωφροσύνη est ''la science d'elle-même et des autres sciences'' (ἐπιστήμη ἑαυτῆς καὶ τῶν ἄλλων ἐπιστημῶν, 166e). Elle est la seule, parmi toutes les sciences, à porter non sur un objet extérieur, mais sur le savoir lui-même. Socrate ajoute : « elle serait donc aussi science de l'ignorance » (''anepistēmosunē''), puisqu'il faut, pour connaître ce qui est su, savoir aussi ce qui ne l'est pas. Critias acquiesce. Socrate tire alors la conséquence : le sage, et lui seul, se connaîtra lui-même ; il saura ce qu'il sait et ce qu'il ne sait pas ; il pourra de même discerner chez autrui le savoir réel du savoir prétendu. Le glissement par rapport à la définition précédente est subtil et profondément problématique. Au premier moment (« connais-toi toi-même »), l'objet semblait être la personne elle-même ; au second (« science d'elle-même et des autres sciences »), l'objet devient le savoir. La dimension personnelle et existentielle de la connaissance de soi s'efface au profit d'une métaconnaissance formelle. Le « soi » cède la place aux « sciences ». T. M. Tuozzo souligne que Socrate ne laissera pas Critias revenir en arrière : la réduction du « soi » au « savoir » est une pente, non un malentendu ponctuel. Sur la manière dont il faut comprendre ce glissement, les commentateurs divergent notablement. Pohlenz y voit une erreur flagrante que Platon signalerait pour la critiquer, tandis que Susemihl estime au contraire que « science d'elle-même » est simplement la reformulation technique de « connaissance de soi ». Selon Schirlitz, les deux notions s'impliquent. Selon von Arnim, elles marquent la confusion de Critias. Il n'est pas nécessaire ici de trancher. Ce qui importe, c'est que cette reformulation ouvre un examen conceptuel serré auquel Socrate va procéder. === 2. Trois lectures possibles de la « science des sciences » === La définition de Critias est d'une hauteur conceptuelle considérable. On y a vu, chez les commentateurs modernes, l'anticipation de la « subjectivité autonome » moderne (Oehler), de l'épistémologie critique kantienne, de l'ontologie aristotélicienne de l'être en tant qu'être, ou d'une encyclopédie du savoir. Sans préjuger de la portée que Platon lui donne, on peut proposer, pour la science des sciences, au moins trois lectures. Dans une première lecture, elle serait science d'un objet englobant : elle porterait sur un être suprême qui inclurait ou fonderait tous les objets des autres sciences. On aurait affaire à une métaphysique ou à une théologie. Dans une deuxième lecture, elle serait la science synthétique qui organise et totalise les autres savoirs : projet positiviste d'une science des sciences, ou encyclopédie hégélienne. Dans une troisième lecture, enfin, elle serait une science formelle, dépourvue de contenu positif : une science critique des principes, des méthodes et des limites de tout savoir. Critias ne précise pas laquelle de ces lectures il retient, et cette ambiguïté est peut-être la faille fondamentale de sa définition. Socrate avait attiré son attention sur la mention « science de l'ignorance », qui aurait pu orienter la discussion vers une lecture critique. Mais Critias, emporté par la grandeur de sa formule, l'entend plutôt comme une science totalisante. Tuckey a rapproché cette pente du « goût sophistique pour les antithèses » que le Critias historique partageait avec ses contemporains. L'attitude philosophique juste, celle qu'incarne Socrate, serait tout au contraire de reconnaître que la sagesse humaine est d'abord reconnaissance des limites du savoir, et non prétention à le totaliser. == VI. Examen critique : la science de la science est-elle possible ? (166c à 169c) == Cette partie du dialogue, souvent tenue pour la plus aride, constitue en réalité l'un des exercices d'analyse conceptuelle les plus rigoureux de l'œuvre platonicienne. Socrate y soumet la définition de Critias à deux examens successifs : l'un ontologique (est-elle possible ?), l'autre pragmatique (serait-elle utile ?). === 1. Le problème de la réflexivité (167a à 168e) === Socrate propose : supposons que la σωφροσύνη soit la science qui a pour objet la science elle-même ; est-il seulement possible qu'une science se prenne elle-même pour objet ? Y a-t-il, dans les autres cas, des exemples de relations qui se portent sur elles-mêmes ? L'examen est méthodique. Les entités que Socrate passe en revue sont toutes des « relatifs » (πρός τι), c'est-à-dire des réalités qui ne se définissent que par leur rapport à autre chose. S'agissant des sensations : existe-t-il une vue qui verrait elle-même et les autres vues, mais qui ne verrait aucune couleur ? Or la vue est définie par son rapport à la couleur (objet propre), et si une « vue » ne voyait pas la couleur, elle ne serait pas une vue. De même, une audition qui n'entendrait aucun son ne serait pas une audition. Une capacité réflexive totale, qui ne porterait ''que'' sur elle-même, est absurde, car elle vide le relatif de son contenu propre. S'agissant des désirs et des affects : un désir qui désirerait non aucun plaisir mais uniquement des désirs, une volonté qui ne voudrait aucun bien mais seulement d'autres volontés, un amour qui aimerait non le beau mais uniquement d'autres amours, une crainte qui ne craindrait aucun danger mais seulement des craintes ? L'absurdité est manifeste : chaque affect se définit par son objet caractéristique. S'agissant des grandeurs relatives : existe-t-il un « plus grand » qui ne serait pas plus grand qu'un plus petit, mais plus grand que lui-même ? Pour être plus grand, il faut être plus grand qu'un plus petit ; or si ce « plus grand » est plus grand que lui-même, il est en même temps plus grand et plus petit que lui-même. Le relatif qui se prendrait lui-même pour objet hériterait simultanément des deux termes et tomberait dans la contradiction. Dans les cas examinés, la réflexivité stricte (où un relatif ne porterait que sur soi) est soit absurde, soit contradictoire. Il faut distinguer deux types de réflexivité : la réflexivité totale (la science ne porterait que sur elle-même) et la réflexivité partielle (la science porterait sur soi ''et'' sur autre chose). La première semble inconcevable ; la seconde est plus prometteuse, mais exige une analyse serrée. Claude Chrétien a noté, à juste titre, que la conscience humaine présente précisément cette propriété étrange de pouvoir se retourner vers elle-même en même temps qu'elle se tourne vers autre chose. Le ''Charmide'' ne thématise pas cette distinction, mais il en ouvre le questionnement. Socrate laisse la question ouverte pour l{{'}}''epistēmē''. Peut-être la connaissance, contrairement aux sensations et aux grandeurs, admet-elle la réflexivité ? Il reconnaît qu'une telle analyse exige un « grand homme » (169a) et « dépasse les limites du dialogue ». Il renvoie la résolution à un travail ultérieur : ce sera la « longue voie » de la ''République'' (435d). On peut voir dans cet ajournement l'aveu que la catégorialité rigoureuse déborde le dialogue vivant. Pour relancer la discussion, Socrate propose une concession provisoire : supposons que la science de la science soit possible. Peut-elle procurer au sage ce qu'on attend de la σωφροσύνη, c'est-à-dire savoir ce qu'il sait et ne sait pas ? === 2. La contagion de l'aporie (169a à c) === À ce moment, Critias à son tour cède à l'embarras. Socrate l'observe avec humour : « voyant mes hésitations, Critias fit comme ceux qui voient des gens leur bâiller sous le nez et en font autant ; il me parut céder à la contagion, en proie au même embarras que moi » (169c). Le détail n'est pas cosmétique. Il renvoie au texte même qui, trois lignes plus haut, décrit Critias comme « honteux devant les assistants » et « refusant de concéder son incapacité à trancher ce qu'on demandait » (169c-d). Il parle alors « sans rien dire de clair », pour masquer sa gêne. Il y a ici, à un moment précis et localisable, une coïncidence remarquable entre l'argument et le drame. Critias, que la tradition aristocratique définit comme ''sōphrōn'', manifeste un défaut typique d{{'}}''aidōs'' mal orientée : la honte d'être pris en défaut l'empêche d'avouer son ignorance. C'est exactement le symptôme que la σωφροσύνη authentique devrait corriger : l'attachement à l'honneur immédiat au détriment de la recherche de la vérité. La dialectique socratique, en somme, produit et donne à voir, dans la conduite même de l'interlocuteur, le défaut de la vertu qu'il prétend théoriser. Ce passage confirme ainsi ''en acte'' la thèse que le prologue avait énoncée ''par métaphore'' : la σωφροσύνη se révèle et se produit par l'épreuve dialectique. Critias, qui reconnaît ne pas savoir mais refuse de l'admettre, est à cet instant précis l'image en creux de ce qui lui manque. == VII. La question de l'utilité : le rêve socratique (169c à 175a) == === 1. L'hypothèse et le problème de l'impuissance formelle === Socrate propose, pour faire avancer la discussion : admettons que la science de la science soit possible et qu'elle permette au sage de savoir ce qu'il sait et ne sait pas. Serait-elle pour autant ''utile'' ? Telle est la seconde question. Si la première était ontologique, celle-ci est pratique. L'enjeu est grave : Socrate lui-même, dans l{{'}}''Apologie'' (38a), déclare qu'une vie non réfléchie ne vaut pas la peine d'être vécue. La démonstration socratique commence par une difficulté (170a-171c). La science de la science, si elle existe, ne peut que distinguer ce qui est science de ce qui ne l'est pas. Elle ne peut connaître les ''contenus'' des sciences particulières. Savoir ce qu'est la santé relève de la médecine, non de la science de la science. Savoir ce qui est juste relève de la politique. Si un homme possède la science de la science, il saura qu'il a une science, mais il ne saura pas ''quoi''. Il peut donc avoir les connaissances réflexives sans avoir les connaissances de premier ordre. Il est à même de distinguer formellement « savoir » de « non-savoir », mais il ne peut distinguer ''la science juste'' de ''la fausse science'' sans posséder lui-même la science de l'objet dont il est question. Le sage, dans cette configuration, est impuissant. La sagesse ainsi définie est formelle, vide, réduite à une sorte de métacognition sans substance. Comme le note avec finesse L.-A. Dorion dans son introduction, la réfutation de 171c porte non pas sur la capacité de l'élenchos à éprouver le savoir moral et à produire la connaissance de soi, mais sur l'aptitude d'une science des sciences, dépourvue d'objet propre, à mettre à l'épreuve des connaissances particulières qui relèvent de savoirs particuliers. Ce point est important pour l'interprétation d'ensemble du dialogue : ce qui est réfuté, ce n'est pas l'ambition socratique de soumettre les autres savoirs à la question, mais la prétention d'une science purement réflexive à se substituer aux savoirs spécialisés. Socrate sort personnellement de cette impasse par son renoncement à toute prétention dogmatique. Il n'affirme posséder aucune science et se contente d'interroger les prétendus savants sur la cohérence de leur discours. L'attitude socratique du questionnement n'est possible qu'à partir d'un tel renoncement. === 2. Le rêve d'omniscience (173a à 174b) === Socrate introduit cependant une hypothèse contrefactuelle. « Écoute donc mon songe, qu'il soit venu par la porte de corne ou par la porte d'ivoire » (173a), dit-il, faisant allusion à l{{'}}''Odyssée'' XIX, 562-567, où Pénélope évoque les deux portes des songes (ceux qui passent par l'ivoire sont trompeurs, ceux qui passent par la corne sont véridiques). L'allusion est significative : le rêve qui va suivre n'est pas présenté comme vérité certaine ; il est une vision dont on ignore si elle ouvre sur le vrai ou sur le trompeur. Socrate introduit donc son tableau avec une réserve herméneutique qui, rétroactivement, colore tout le développement d'une ambiguïté constitutive. Dans ce rêve, Socrate explore ce que serait un monde où chacun ne ferait que ce qu'il sait faire, où la σωφροσύνη règnerait partout. Les imposteurs y seraient démasqués ; les médecins seraient de vrais médecins, les capitaines de vrais capitaines, les devins de vrais devins. Chacun serait à sa place, chacun agirait selon la science. On y vivrait plus sainement, préservés des dangers de la mer et de la guerre, ne traitant qu'avec de vrais professionnels. « Toutes choses seraient parfaitement réalisées du point de vue technique » (173b-c). Même la divination, cette « méta-science » prérationnelle, serait intégrée au régime scientifique. Le monde serait ordonné, transparent, maîtrisé. On rapproche volontiers cette utopie de la cité idéale de la ''République''. Le rapprochement est légitime mais doit être nuancé : dans le ''Charmide'', la cité utopique n'est présentée que comme une hypothèse dans le cadre d'une interrogation sur la σωφροσύνη, et non comme un projet politique assumé. Socrate lui-même interrompt aussitôt le rêve : « qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir » (173d). Le point est philosophiquement essentiel : ''agir selon la science ne suffit pas à bien agir''. Un monde parfaitement rationnel, maîtrisé, n'est pas nécessairement un monde heureux. Il peut être efficace et pourtant aveugle au bien. Le savoir n'est pas ''ipso facto'' valeur. B. Witte a souligné, dans une lecture forte, que cette correction socratique fonctionne comme une réfutation interne de l'utopie. Ce qui s'ouvrait comme un idéal se retourne en objection contre la définition de la σωφροσύνη comme science de la science. Car si un tel ordre n'engendrait pas le bonheur, la science qui le produit n'est pas la sagesse que nous cherchons. Plus encore, un monde totalement maîtrisé a quelque chose d'inhumain : la liberté, donc la possibilité morale, y disparaîtraient. Sur ce point, on peut entendre la fin du dialogue comme un rappel de la condition humaine : la ''sophia'' est réservée à la divinité, l'homme est fait pour vivre dans les entre-deux. La σωφροσύνη est une vertu humaine, qui doit connaître sa place entre l'ignorance et le savoir, entre l'asservissement aux passions et la perfection divine. === 3. La science du bien et du mal (174a-c) === Quelle science, demande alors Socrate, assure le bonheur ? Est-ce la tactique ? la médecine ? le calcul ? À chaque fois, Critias répond par la négative. Socrate élimine méthodiquement toutes les sciences particulières (cordonnerie, travail du bois, divination, jeu de dés). Aucune, prise isolément, ne peut rendre heureux. Sommé de nommer la science qui rend heureux, Critias concède enfin : c'est « la science du bien et du mal » (ἡ ἐπιστήμη τοῦ ἀγαθοῦ καὶ κακοῦ, 174b). Le coup de théâtre est considérable. Si c'est la science du bien et du mal qui produit l'utilité et le bonheur, et si la σωφροσύνη est la science de la science (qui n'inclut pas, par hypothèse, la science du bien particulier), alors la σωφροσύνη n'est ''pas'' la science qui nous est utile. Elle est autre chose que la science du bien et du mal. Elle est donc, conclut Socrate, inutile. La portée de ce passage mérite une lecture prudente. L.-A. Dorion (introduction, p. 69-70) propose ici une interprétation forte qui permet de comprendre l'apparent paradoxe. L'assimilation de la sagesse à la connaissance du bien et du mal, observe-t-il, n'est pas une conclusion inattendue : plusieurs passages antérieurs l'anticipent explicitement. En 156e-157a, Socrate faisait déjà de la σωφροσύνη la source de tout bien dans le corps et dans l'homme ; en 160e-161a, il exigeait que la vertu soit toujours bonne ; en 163d-164a, Critias lui-même convenait que la σωφροσύνη est « faire le bien » et suppose la connaissance de ce bien. Ce que la fin du dialogue nomme n'est donc pas un élément extérieur à l'enquête, mais ce qui en formait silencieusement l'enjeu depuis le début. Plus décisif encore, Dorion suggère de distinguer deux conceptions de la « science des sciences » : celle de Critias, qui pense la sagesse comme une science universelle additionnant les savoirs particuliers, et celle que Socrate dessine en creux, un savoir ''architectonique'' qui, sans englober les objets des autres savoirs, fixe à chacun la finalité qu'il doit poursuivre. La connaissance du bien et du mal est architectonique en ce sens précis : elle détermine les fins auxquelles les autres sciences doivent être appliquées, mais elle n'a pas besoin, pour cela, d'être elle-même médecine ou architecture. Le parallèle avec la forme du Bien de la ''République'' (VI, 505a-b) vient naturellement à l'esprit, encore que le ''Charmide'' n'engage pas ici de discussion ontologique explicite. Cette lecture donne une cohérence à l'ensemble du dialogue sans faire basculer le ''Charmide'' dans le simple rôle de propédeutique à la ''République''. Elle maintient que Socrate pointe, à la fin du dialogue, une conception substantielle de la sagesse (la connaissance du bien et du mal), tout en refusant de l'identifier formellement à la σωφροσύνη, car Critias s'obstine à définir celle-ci comme science des sciences, ce que Socrate ne peut accepter sans contradiction. Le texte maintient donc simultanément deux choses : que la connaissance du bien et du mal serait la bonne candidate, et que Critias ne parvient pas à en tirer la conséquence. B. Witte, dans sa lecture allemande influente, fait du ''Charmide'' une « propédeutique négative » désignant la science du bien comme science-limite ; la proposition est féconde, mais elle minore peut-être ce que le ''Charmide'' accomplit par lui-même. Le dialogue ne se contente pas de désigner un manque : il indique positivement que la σωφροσύνη véritable ne peut être une science-reine formelle, qu'elle doit se subordonner à une science substantielle du bien. Cela suffit à rendre compte de son échec apparent sans en faire une simple étape préparatoire. == VIII. L'aporie finale et la scène de conclusion (175a à 176d) == === 1. Le bilan de Socrate (175a à d) === Socrate dresse un bilan apparemment désastreux. Nous avons, dit-il, admis sans preuve plusieurs choses dans le raisonnement. Nous avons même concédé ce qui contredit la raison. Et malgré toutes ces complaisances, nous n'avons pas su trouver la nature de la σωφροσύνη. « Notre enquête n'a pas été davantage capable de trouver la vérité ; mais elle s'est si bien moquée de celle-ci que ce que nous avons jusqu'ici proposé comme définitions de la sagesse, à force de conventions et de combines, nous a montré celle-ci, provocation extrême, comme inutile » (175a-b). C'est l'aporie explicite. Elle n'est pourtant pas un simple échec. Socrate n'en est pas trop affligé. Le bilan contient une correction manifeste : si la σωφροσύνη ''telle que nous l'avons définie'' s'est révélée inutile, cela ne signifie pas que la sagesse véritable le soit. Cela signifie que nous n'avons pas su la définir correctement. Chaque définition rejetée a en effet indirectement révélé un aspect de la σωφροσύνη véritable. La tranquillité pose l'ordre (en dépit de l'échec de sa déclinaison physique). La pudeur pose le ressort intérieur (en dépit de son hétéronomie). « Faire ses propres affaires » pose l'adéquation à soi et la convenance. « Faire le bien » pose la normativité. La connaissance de soi pose la réflexivité. La science de la science pose la hauteur de la prétention philosophique. Au terme, la science du bien et du mal est nommée, sans être identifiée à la σωφροσύνη, mais comme sa condition éthique profonde. === 2. La scène finale : Charmide accepte l'incantation (175d à 176d) === Le dialogue ne s'achève pas sur l'aporie conceptuelle. Il revient à la scène dramatique initiale. Socrate, feignant d'être très affligé de son échec, s'adresse à Charmide. Il n'est pas trop chagriné pour lui-même, mais il l'est pour Charmide, « si, avec une telle beauté et l'esprit le plus sage, tu ne tires aucun fruit de cette sagesse ». Il s'irrite davantage d'avoir appris avec tant de soin la formule magique thrace, si elle n'a aucune valeur pratique. Non, conclut-il, « j'aime mieux penser que je suis un piètre chercheur, que la sagesse est un grand bien, et que, si tu la possèdes, tu es un heureux mortel ». Charmide répond : « par Zeus, je ne sais pas, Socrate, si je la possède ou non. Comment en effet connaîtrais-je ce dont vous-mêmes n'êtes pas capables de déterminer la nature ? ». Il ajoute, touchant dans sa modestie : « pour ma part, je ne te crois guère, et je suis sûr que j'ai besoin de ta formule magique. Je ne vois aucun inconvénient, de mon côté, à me soumettre tous les jours à ton charme, jusqu'à ce que tu dises que c'est assez ». Critias renchérit : « fais-le, Charmide. Ce sera pour moi la preuve que tu es sage, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Charmide acquiesce : « je le suivrai et ne le quitterai pas, car j'agirais mal si je ne t'obéissais pas, à toi mon tuteur ». Et, quand Socrate plaisante sur le caractère contraignant de cette volonté, Charmide conclut : « alors ne résiste pas, toi non plus ». La scène est remarquable. Dramatiquement, elle se déploie sur trois plans qu'il importe de distinguer. Sur le plan pédagogique, la soumission de Charmide à Socrate témoigne du succès relatif de l'initiation dialectique. Le jeune homme reconnaît qu'il a besoin de la philosophie et accepte de suivre Socrate. L'échec conceptuel se convertit en succès pédagogique : Charmide, qui se flattait implicitement de la sagesse au début, reconnaît à la fin qu'il en a besoin. Telle est la direction que prend, dans le texte, l'élenchos socratique. Si l'on admet, avec l'édition Dorion, que l'incantation désigne métaphoriquement la réfutation dialectique, alors la scène finale confirme la thèse du prologue : la σωφροσύνη se produit dans l'âme par le travail dialectique, et la meilleure preuve en est le consentement final de Charmide à recevoir ce travail. Sur le plan dramatique, cette lumière est indissociable d'une ombre. Le lecteur sait que cet adolescent, aujourd'hui docilement soumis à Critias, suivra son tuteur non dans l'école de Socrate, mais dans la tyrannie des Trente. Il mourra en 403 avec Critias. La promesse de « ne plus quitter Socrate d'un pas » ne sera pas tenue. La formule finale de Critias (« si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas, ce sera la preuve que tu es sage ») énonce ainsi une dernière définition implicite : être sage, c'est tenir bon dans la compagnie de la philosophie. Mais ni Critias ni Charmide n'y parviendront. L'ironie tragique reste toutefois sous la surface du texte : c'est le lecteur, informé par l'histoire, qui l'y projette. Sur le plan verbal, enfin, il faut noter l'emploi par Charmide du mot ''charisme'' (''charizesthai'') pour désigner ce à quoi il se soumet. Le terme désigne étymologiquement un don gratuit, une grâce, et fait écho à la tradition religieuse. Dans le ''Banquet'' de Xénophon (4, 14-15), Socrate se dit lui-même capable d'« ensorcellement » (''katepad-''). La clôture du ''Charmide'' confirme ainsi, dans le vocabulaire même, l'identification du discours socratique au chant incantatoire du prologue. === 3. L'ironie et la promesse === La scène finale accomplit ainsi trois choses. Elle confirme l'échec conceptuel : on n'a pas défini la σωφροσύνη. Elle révèle un succès pratique : l'élenchos opère, Charmide se tourne vers la philosophie. Elle porte, pour le lecteur averti, l'ombre historique : le succès pratique sera, dans les faits, révoqué. Cette tension entre trois plans (conceptuel, pratique, historique) constitue une des singularités du ''Charmide''. Elle suggère que la philosophie, comme pur exercice de définition, ne suffit pas : elle doit engager l'existence, sans que cet engagement garantisse la fidélité. Peut-être est-ce en ce sens qu'on peut voir dans le ''Charmide'' une inquiétude qui annonce le programme de la ''République'' : ancrer la σωφροσύνη individuelle dans une cité, une ''paideia'' et une ontologie qui lui donnent un fondement stable. == IX. Interprétation d'ensemble : la σωφροσύνη selon le ''Charmide'' == Au terme de cette lecture suivie, on peut tenter de ressaisir ce que le dialogue, malgré son aporie explicite, suggère sur la nature de la σωφροσύνη. La présentation qui suit est une synthèse interprétative, et doit être reçue comme telle. En premier lieu, la σωφροσύνη est une vertu, mais non une valeur ascétique extérieure à l'individu. Elle situe le bien dans l'accomplissement de l'être propre et associe la vertu et le bonheur, le beau et le bon, le bien et l'utile. Elle est, en ce sens, profondément eudémoniste. En deuxième lieu, cet accomplissement n'est pas abandon à soi, mais « maîtrise de soi » (''enkrateia'', ''République'' 430e). Toutefois, poussée jusqu'au bout, la maîtrise peut rendre l'humain inhumain : Socrate dans le prologue (presque trop maître de lui) et l'utopie du rêve (un monde totalement rationnel, donc invivable) en sont les deux figures. La sagesse exclut ainsi tant le schéma de la maîtrise que celui de la soumission. Platon lui-même, dans la ''République'' (430e-431a), qualifie la notion de maîtrise de soi de « ridicule » et de contradictoire : comment un même sujet peut-il être celui qui maîtrise et celui qui est maîtrisé ? La σωφροσύνη doit se penser autrement qu'en termes de domination. En troisième lieu, cette vertu est connaissance, selon l'intellectualisme socratique (il suffit de savoir pour vouloir, et de vouloir pour faire). Elle tend à la vérité en la sachant inaccessible. Elle tend à l'unité en se sachant vouée à l'éparpillement. L'échec du ''Charmide'' à définir la sagesse comme science n'est pas l'échec de l'identification vertu-connaissance, mais l'échec d'une certaine conception de la connaissance : trop formelle, trop prétentieuse, trop coupée du bien. En quatrième lieu, elle se développe surtout comme conscience critique de soi. Il ne s'agit pas d'introspection narcissique. La conscience de soi platonicienne est ouverture aux autres (comme le montre le dialogue) et ouverture au monde. Être conscient de soi, c'est se situer à sa place dans le tout. En cinquième lieu, elle est vertu de l'entre-deux. Ni la bête ni le dieu n'ont besoin de la σωφροσύνη. La σωφροσύνη est proprement la vertu humaine, celle qui convient à un être capable de vouloir autrement qu'il ne sait. On voit alors comment le ''Charmide'' articule la figure de Socrate à l'argument conceptuel. Socrate incarne l'attitude d'équilibre. Il désire et maîtrise son désir. Il sait des choses et surtout sait son ignorance. Il mène des discussions sans prétendre à aucune science propre. La sagesse se montre en lui plus qu'elle ne se dit dans les définitions. Le héros du dialogue est ainsi à la fois le locuteur principal, le narrateur et l'image exemplaire de ce qu'il cherche à définir. Cette coïncidence donne au ''Charmide'' une singularité remarquable dans le corpus. == X. Actualité et portée philosophique == ''Avertissement liminaire.'' Les remarques qui suivent sont de nature interprétative. Elles ne prétendent pas restituer le sens littéral du ''Charmide'', mais proposer des résonances entre le dialogue et certaines questions qui se posent encore aujourd'hui. Le lecteur voudra bien tenir ces prolongements pour ce qu'ils sont : des pistes offertes, non des conclusions tirées du texte. === 1. Une éthique du connaître === Le ''Charmide'' propose, en creux, une philosophie de la connaissance qui n'est pas une théorie abstraite du savoir, mais ce qu'on pourrait appeler une ''éthique du connaître''. Savoir ce que l'on sait et ne pas savoir ce que l'on ne sait pas, c'est-à-dire ne pas feindre de savoir ce qu'on ignore : cette « science de l'ignorance », dont Critias admet le principe sans en voir les conséquences, est proche du « je sais que je ne sais rien » de l{{'}}''Apologie''. Elle fait de la σωφροσύνη une disposition à la fois intellectuelle et morale. Il faut du courage pour reconnaître son ignorance ; de la pudeur pour ne pas feindre la science ; de l'humilité pour accepter que cette reconnaissance soit non un point d'arrivée, mais un point de départ. === 2. Une critique du rêve de maîtrise totale === Le rêve socratique de 173-174 peut résonner, prudemment, avec certaines critiques modernes des projets de rationalité totalisante. Mais ce rapprochement doit rester à sa place de prolongement, non être pris pour le sens du texte : Platon ne vise ni le positivisme, ni le technocratisme, ni la gouvernance algorithmique. Tout au plus peut-on observer que le dialogue met en garde, sur le mode hypothétique, contre un monde où tout serait accompli selon la science, et suggère qu'un tel monde ne serait pas nécessairement bon. L'interruption que Socrate oppose à sa propre vision (« qu'agir selon la science nous conduise à bien agir et à connaître le bonheur, cela, mon cher Critias, nous ne pouvons pas encore le savoir », 173d) est, à elle seule, le point qui autorise ces prolongements : la science sans le bien ne suffit pas. Platon paraît d'ailleurs reconnaître, dans le miroir de ce rêve, une ombre qui pèse aussi sur sa propre utopie (''République''). === 3. Une pédagogie par le dialogue === Sur le plan pédagogique, le ''Charmide'' fournit un modèle. Il montre comment Socrate conduit un jeune homme (Charmide), d'abord flatté et rassuré dans sa vertu supposée, à reconnaître qu'il ne sait pas ce qu'est cette vertu ; et comment il conduit un homme plus mûr (Critias), sûr de sa science, à éprouver lui-même la « contagion » de l'aporie. La pédagogie philosophique consiste moins à transmettre une doctrine qu'à éveiller le mouvement du questionnement. La figure de l'incantation thrace symbolise cette pédagogie, dont on retrouvera l'équivalent dans la maïeutique du ''Théétète''. === 4. L'ambivalence politique === Le choix des interlocuteurs (Critias, futur chef des Trente, et Charmide, son jeune pupille qui mourra à ses côtés) n'est certainement pas ornemental : il situe l'enquête sur la σωφροσύνη dans l'horizon de l'histoire athénienne connue du lecteur platonicien. Au-delà de ce constat, on peut proposer prudemment quelques prolongements. La formule « faire ses propres affaires », dans la bouche d'une élite qui s'arrogera le droit de « purger » la cité, change de sens. Une σωφροσύνη qui n'est pas adossée à la connaissance du bien risque, dès lors, de servir d'alibi à l'exclusion. C'est là un prolongement interprétatif, et non une affirmation explicite du texte : Platon ne tire pas cette conséquence ouvertement dans le ''Charmide''. Il reste toutefois significatif que le dialogue ne fasse réapparaître la connaissance du bien qu'au moment où l'aporie conduite par Critias se révèle sans issue. On entrevoit ainsi, en creux, la ligne de fuite que les ''Lois'' et la ''République'' développeront : la σωφροσύνη requiert d'être articulée à une ''paideia'' et à une ontologie du bien. === 5. La dimension existentielle === Enfin, on peut lire le ''Charmide'' comme une méditation sur le soin de l'âme (''epimeleia heautou''). L'appui textuel est ici plus net : le prologue thématise explicitement l'âme (sept occurrences de ''psukhē'' sur onze, selon le relevé de Dorion), et l'allégorie du médecin thrace fait du soin de l'âme la condition du soin du corps. On peut donc reconstruire un programme sans forcer le texte : on ne saurait soigner le corps sans soigner l'âme, ni soigner l'âme sans philosopher, ni philosopher sans s'examiner, ni s'examiner sans reconnaître les limites de sa prétendue sagesse. Le parcours du dialogue conduit Charmide, et le lecteur avec lui, de la satisfaction naïve de la vertu reçue à l'humilité requise pour devenir véritablement ''sōphrōn''. L'aporie, dans cette perspective, n'est pas un échec : elle est l'épreuve par laquelle la philosophie produit son effet. == Conclusion == Le ''Charmide'' est un dialogue court, mais d'une densité rare. Sous la simplicité apparente d'une discussion sur la définition d'une vertu, il articule plusieurs enjeux : philosophique (qu'est-ce que la σωφροσύνη ? qu'est-ce qu'une science réflexive ? qu'est-ce que la connaissance de soi ?), politique (quelle est la vertu du bon gouvernant ? la science totalisante est-elle désirable ?), éthique (quel est le rapport du savoir à la vertu et au bonheur ?), pédagogique (comment conduit-on une âme à la philosophie ?), et existentiel (qu'est-ce que prendre soin de soi ?). Il conduit ces différents niveaux sans les dissocier. Le lecteur qui referme le texte n'a pas reçu de définition de la σωφροσύνη. Mais il a été conduit, à travers six définitions successivement éprouvées, à comprendre pourquoi aucune ne suffit, et à entrevoir, derrière l'échec, l'esquisse d'une vertu tout humaine, proprement philosophique : équilibre entre savoir et ignorance, maîtrise qui n'est ni froideur ni crispation, adéquation à soi qui est ouverture à l'autre, humilité qui ne renonce pas à la vérité. Socrate incarne cette vertu sans la définir. Le pacte final entre Charmide et lui énonce silencieusement ce que les concepts n'ont pas réussi à dire : la σωφροσύνη se ''pratique'' avant de se ''dire''. Elle se cultive dans l'exercice dialectique et dans la fréquentation de celui qui en est l'image vivante. On comprend alors la phrase ultime de Critias, qui clôt le dialogue sur une ambiguïté que le lecteur averti ne peut ignorer : « ce sera pour moi la preuve que tu es sage, Charmide, si tu te soumets au charme de Socrate et si tu ne le quittes plus d'un pas ». Cette phrase énonce une définition finale, implicite et pratique, de la σωφροσύνη : être sage, c'est tenir bon dans la compagnie de la philosophie. L'histoire montrera que ni Critias ni Charmide n'y parvinrent. Leur défaillance future, que Platon connaît et que son lecteur devine, donne au dialogue une gravité qu'il ne faudrait ni forcer ni négliger. == Annexes == === Tableau récapitulatif des six définitions === # ''Tranquillité'' (''hēsuchiotēs tis'', 159b) : Charmide. Réfutation par énumération de cas où la vitesse ou la vivacité sont plus belles que la lenteur. Échec dû à l'oubli de la dimension normative. # ''Pudeur'' (''aidōs'', 160e) : Charmide. Réfutation par citation homérique (''Odyssée'' XVII, 347). La σωφροσύνη est toujours bonne ; la pudeur ne l'est pas ; donc la σωφροσύνη n'est pas la pudeur. # ''Faire ses propres affaires'' (''to ta heautou prattein'', 161b) : Charmide, empruntant à Critias. Réfutation par ''reductio ad absurdum'' : l'artisan qui fait pour autrui ne serait pas ''sōphrōn''. # ''Faire le bien'' (''ta agatha prattein'', 163e) : Critias. Reformulation par la distinction ''prattein''/''poiein'' et l'appel à Hésiode. Écartée pour défaut de conscience de ce que l'on fait. # ''Se connaître soi-même'' (''to gignōskein heauton'', 164d) : Critias, d'après le Γνῶθι σεαυτόν de Delphes interprété comme salutation divine. # ''Science d'elle-même et des autres sciences'' (''epistēmē heautēs kai tōn allōn epistēmōn'', 166e) : Critias. Double examen, ontologique et pragmatique. Échec au second examen : ce n'est pas elle, mais la « science du bien et du mal » (174b), qui serait véritablement utile. === Plan dramatique === * Prologue (153a-158e) : retour de Potidée, palestre de Tauréas, arrivée de Charmide, stratagème du mal de tête, médecin thrace et Zalmoxis. * Trois définitions de Charmide (158e-162b) : tranquillité, pudeur, « faire ses propres affaires ». * Reprise et quatrième définition par Critias (162b-164d) : distinction ''prattein''/''poiein'', citation d'Hésiode, « faire le bien ». * Cinquième définition (164d-166c) : se connaître soi-même, la formule delphique. * Sixième définition et examen critique (166c-175a) : la science de la science, question de sa possibilité, question de son utilité, rêve socratique, mention de la science du bien et du mal. * Conclusion (175a-176d) : aporie bilan, soumission de Charmide, ironie tragique. == Orientations bibliographiques == ''Note sur la présentation.'' Les références sont ordonnées alphabétiquement dans chaque rubrique. Chaque entrée indique successivement le nom, le prénom abrégé, l'année entre parenthèses, le titre en italiques, le lieu de publication et l'éditeur ; les collections figurent entre guillemets, les rééditions et précisions entre crochets. La présente bibliographie est sélective. Pour une recension exhaustive, on consultera les bibliographies platoniciennes de référence : Cherniss, H. (1959-1960), « Plato 1950-1957 », ''Lustrum'' 4-5 ; Brisson, L. (1977, 1983, 1988, 1992), « Platon », ''Lustrum'' 20, 25, 30, 34 ; Brisson, L. et Plin, F. (1999), ''Platon 1990-1995 : bibliographie'', Paris, Vrin. '''I. Éditions, traductions et commentaires''' * Burnet, J. (1903), ''Platonis opera'', vol. III, Oxford, Clarendon Press. * Chambry, É. (1967), ''Platon. Second Alcibiade, Hippias mineur, Premier Alcibiade, Euthyphron, Lachès, Charmide, Lysis, Hippias majeur, Ion'', traduction et notes, Paris, GF-Flammarion [première édition : 1937]. * Cooper, J. M. et Hutchinson, D. S. (éd.) (1997), ''Plato. Complete Works'', Indianapolis, Hackett Publishing Company. * Croiset, A. (1921), ''Platon. Hippias majeur, Charmide, Lachès, Lysis'', texte et traduction, Paris, Les Belles Lettres [réimpression avec introduction et notes de J.-F. Pradeau, « Classiques en poche » 40, 1999]. * Dorion, L.-A. (2004), ''Platon. Charmide, Lysis'', traduction inédite, introduction et notes, Paris, GF-Flammarion. * Hazebroucq, M.-F. (1997), ''La Folie humaine et ses remèdes. Platon : Charmide ou de la modération'', traduction et commentaire, Paris, Vrin. * Robin, L. (1950), ''Platon. Œuvres complètes'', 2 vol., traduction et notes, Paris, Gallimard, « Bibliothèque de la Pléiade ». * Sprague, R. K. (2018), ''Plato. Charmides'', Indianapolis, Hackett Publishing Company. '''II. Commentaires monographiques consacrés au dialogue''' * Chrétien, Cl. (1987), ''Platon. Charmide de la sagesse'', Paris, Hatier, « Profil philosophique » 725. * Hyland, D. A. (1981), ''The Virtue of Philosophy. An Interpretation of Plato's Charmides'', Athens (Ohio), Ohio University Press. * Schmid, W. T. (1998), ''Plato's Charmides and the Socratic Ideal of Rationality'', Albany, State University of New York Press. * Tsouna, V. (2022), ''Plato's Charmides. An Interpretation'', Cambridge, Cambridge University Press. * Tuckey, T. G. (1968), ''Plato's Charmides'', Amsterdam, Hakkert [première édition : Cambridge, Cambridge University Press, 1951]. * Tuozzo, T. M. (2011), ''Plato's Charmides. Positive Elenchus in a « Socratic » Dialogue'', Cambridge, Cambridge University Press. * Van der Ben, N. (1985), ''The Charmides of Plato. Problems and Interpretations'', Amsterdam, B. R. Grüner. * Witte, B. (1970), ''Die Wissenschaft vom Guten und Bösen. Interpretationen zu Platons Charmides'', Berlin, De Gruyter. * Woolf, R. (2023), ''Plato's Charmides'', Cambridge, Cambridge University Press. '''III. Études platoniciennes de cadre''' * Brisson, L. et Robinson, T. M. (éd.) (2000), ''Plato. Euthydemus, Lysis, Charmides'' (Proceedings of the V Symposium Platonicum), Sankt Augustin, Academia Verlag. * Goldschmidt, V. (1947), ''Les Dialogues de Platon. Structure et méthode dialectique'', Paris, Presses universitaires de France. * Lampert, L. (2010), ''How Philosophy Became Socratic. A Study of Plato's Protagoras, Charmides, and Republic'', Chicago, University of Chicago Press. * Méron, É. (1979), ''Les idées morales des interlocuteurs de Socrate dans les dialogues platoniciens de jeunesse'', Paris, Vrin. * Pradeau, J.-F. (1999), « Introduction », dans Platon, ''Alcibiade'', Paris, GF-Flammarion. * Robin, L. (1968), ''Platon'', Paris, Presses universitaires de France. '''IV. Études et articles spécialisés cités''' * Cairns, D. L. (1993), ''Aidōs. The Psychology and Ethics of Honour and Shame in Ancient Greek Literature'', Oxford, Clarendon Press. * Dodds, E. R. (1951), ''The Greeks and the Irrational'', Berkeley, University of California Press. * Iannucci, A. (2002), ''La parola e l'azione. I frammenti simposiali di Crizia'', Bologne, Nautilus. * Planeaux, C. (1999), « The Date of Bellona's Temple at Rome and the Battle of Potidaea (''Charmides'' 153a-d) », ''Classical Journal'' 94/2, p. 165-183. * Pohlenz, M. (1913), ''Aus Platons Werdezeit. Philologische Untersuchungen'', Berlin, Weidmann. * Sedley, D. (2013), « The Atheist Underground », dans V. Harte et M. Lane (éd.), ''Politeia in Greek and Roman Philosophy'', Cambridge, Cambridge University Press, p. 329-348. * Shapiro, H. A. (1986), « The Attic Deity Basile », ''Zeitschrift für Papyrologie und Epigraphik'' 63, p. 134-136. * Wellman, R. R. (1964), « The Question Posed at ''Charmides'' 165a-166c », ''Phronesis'' 9, p. 107-113. * Williams, B. (1993), ''Shame and Necessity'', Berkeley, University of California Press. [[Catégorie:Commentaire philosophique]] addi9qtfkyke8c6qulvbku86nvz0zni Pour lire Platon/Bibliographie 0 31168 765014 764616 2026-04-25T09:55:25Z PandaMystique 119061 765014 wikitext text/x-wiki <noinclude>{{sous-pages}}</noinclude> Cette bibliographie est une bibliographie commentée : les commentaires ont pour but de permettre au lecteur de se faire un avis sur les livres qu'il peut lire sur Platon en fonction de ses besoins. Si les commentaires comportent inévitablement une part de subjectivité, nous aurons toujours à l'esprit qu'il s'agit de dire ce qu'apporte un livre pour la lecture de notre auteur. On ne vise pas à fournir une bibliographie très fournie qui serait inutile et décourageante pour un lecteur débutant. * Brisson, Luc et Francesco Fronterotta, sous la direction de, ''Lire Platon'', Quadrige, Presses Universitaires de France, Paris, 2006 *:Ce livre couvre de nombreux domaines, des influences sur Platon à sa philosophie politique. Les articles sont clairs et directs. Cette diversité de sujets est très utile pour acquérir une bonne représentation générale de la pensée platonicienne. De ce point de vue, c'est une introduction idéale. *Brisson, Luc et Pradeau, Jean-François, ''Le Vocabulaire de Platon'', Ellipses, 1998 *:Un ouvrage qui permet d'apprendre la pensée de Platon de manière synthétique. Une méthode pour l'utiliser est de lire les notions relatives à un même thème (morale, cosmologie, par exemple). On peut toutefois regretter que les articles ne paraissent pas toujours très bien structurés. * Goldschmidt, V., ''Les Dialogues de Platon'', PUF, 1935, Paris * Guillermit, Louis, ''Platon par lui-même,'' choix de textes, Flammarion, 1994 ([http://www.persee.fr/doc/phlou_0035-3841_1995_num_93_4_6963_t1_0619_0000_2 compte-rendu]) *:Commencer par un ouvrage qui regroupe les textes de Platon à l'aide d'un fil conducteur peut donner à comprendre que chaque philosophe traite avant tout d'un problème dont il hérite ou qu'il met en place * Koyré, Alexandre, ''Introduction à la lecture de Platon'', Gallimard, 1962. *:Un livre simplement écrit et qui est très éclairant. * Pradeau, Jean-François (coordonné par), ''Platon : les formes intelligibles'', PUF, Paris, 2001 *:Un recueil d'articles sur la théorie des formes. Certains articles sont très spécialisés et arides, mais toujours clairs et instructifs. Incontournable pour approfondir la théorie fondamentale du platonisme. * Richard H. Kraut (ed.), ''The Cambridge Companion to Plato'', New York Cambridge (Univ. Press), 1992 * Robin, Léon, ''Platon'', PUF, 1935 (rééd. 1997) 9dk8zr9k963na0d642x1wwhspj168dt Discussion:Nietzsche : Introduction à sa philosophie/Volonté de puissance 1 33381 764971 468391 2026-04-25T07:46:23Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/Volonté de puissance]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/Volonté de puissance]] 468391 wikitext text/x-wiki == Sagesse de la vie == [[File:Dionysos.png|200px|right]] Nous partirons, pour comprendre cette notion de Volonté de puissance, de l'idée qu'elle exprime en premier lieu une sagesse de la vie, expression par laquelle nous désignerons ici la sagesse tragique de l'existence et la description de nos comportements. Pour justifier l'inclusion de la sagesse de la vie dans notre exposé sur la Volonté de puissance, citons tout d'abord la sagesse tragique du dionysisme que Nietzsche étudie dans ''La Naissance de la Tragédie''. == Nietzsche moraliste == Ensuite, par les nombreux textes qui décrivent les effets subjectifs de la Volonté de puissance, effets que Nietzsche ramene à un principe unique à l'origine, selon lui, de toutes nos motivations. Ainsi : :« ... [le] sacrifice que nous faisons à notre soif de puissance ou pour conserver au moins le sentiment que nous en avons » ''Le Gai Savoir'', §13 dévoile-t-il le caractère hédoniste de la pensée de Nietzsche, à cette nuance près que le critère est le sentiment de notre propre puissance. Cette idée de puissance devrait être rendue de préférence en Français par le sentiment de notre propre « pouvoir » (''Macht'') pour bien mettre en lumière qu'il ne s'agit pas seulement d'une aspiration à dominer, mais que tout pouvoir, même modeste, que nous acquérons, est une source de plaisir : maîtriser une technique, acquérir une capacité, pratiquer un art quelconque, sont des sources du sentiment de notre pouvoir. Mais ce sentiment de notre puissance est d'autant plus intense qu'il exige de nous des sacrifices, une domination complète de nous-même, d'où sa culmination dans le dépassement de soi-même, l'un des thèmes privilégiés de Nietzsche que l'on retrouvera dans la figure sur Surhomme. Nous avons parlé d'hédonisme à propos de la sagesse de la vie de Nietzsche, mais cette affirmation doit être nuancée. Le plaisir que nous trouvons dans le sentiment de notre propre pouvoir fait inévitablement penser aux morales optimistes du bonheur de l'Antiquité (en particulier Aristote, mais aussi, bien sûr, Épicure), mais en faisant de la puissance le critère dernier du plaisir et de la souffrance, Nietzsche s'oppose en fin de compte aux doctrines anciennes, ce qu'il exprime ainsi : :« ''il n'est pas vrai que l'homme recherche le plaisir et fuie la douleur : on comprend à quel préjugé illustre je romps ici (...). Le plaisir et la douleur sont des conséquences, des phénomènes concomitants ; ce que veut l'homme, ce que veut la moindre parcelle d'un organisme vivant, c'est un ''accroissement de puissance''. Dans l'effort qu'il fait pour le réaliser, le plaisir et la douleur se succèdent ; à cause de cette volonté, il cherche la résistance, il a besoin de quelque chose qui s'oppose à lui...'' » Le plaisir et la douleur restent néanmoins des « faits cardinaux », et c'est pourquoi nous nous sommes permis de parler d'hédonisme. Ces précisions étant faites, nous pouvons maintenant saisir les conséquences que Nietzsche tire de cette conception de la vie. L'une des plus importantes est, selon nous, que tous les comportements humains doivent être décrits selon les mêmes principes. Par exemple, un guerrier et un artiste expriment également par leurs activités une volonté de puissance. Certes, le barbare est une forme brutale et stupide de volonté de puissance (Nietzsche est loin de valoriser la violence en elle-même - l'esprit est pour lui, sous certaines conditions, l'expression la plus haute de la volonté de puissance humaine) ; mais c'est bien un sentiment de son propre pouvoir qui le motive. L'artiste n'en est de ce point de vue qu'une forme plus raffinée, plus haute, car créatrice. Dès lors, il est permis de constituer une échelle de valeurs unique qui exclut les oppositions morales du type bien/mal, pour rendre compte du fait qu'il y a en réalité une gradation entre la réalité la plus fruste de l'homme (la barbarie) et la culture, qui est donc, sous certaines conditions, le degré le plus haut de la puissance, le degré qui a le plus de valeur et qui nous procure le plus de plaisir. C'est là l'aspect proprement immoral, ou, plus exactement, amoral, de cette théorie : posant le sentiment de puissance comme un phénomène naturel, il apparaît que, dans la barbarie comme dans la culture, c'est la même tendance à la puissance qui se manifeste, bien qu'elle puisse prendre des formes différentes liées à l'éducation des instincts. Dès lors, la morale peut être décrite également de cette manière, en la situant sur l'échelle du sentiment de puissance : les valeurs morales ne sont plus des faits fondamentaux de la conscience humaine, mais des symptômes des degrés de notre puissance. Une culture qui exprimerait l'accroisssement de la puissance n'est ni culture militariste ni une culture d'uniformisation (ce qui s'exprime par exemple par un grégarisme moral), mais une culture qui cultive l'homme en tant qu'animal, sans en nier les instincts, mais en les spiritualisant (ce que Nietzsche nomme une divinisation des instincts, concept relativement proche de la sublimation chez Freud). Les plus hautes expressions d'une telle culture sont l'unité du style artistique (en architecture par exemple), le raffinement spirituel (développement chez les individus de capacités telles que la suspension du jugement, de la clarté du style, et de goûts correspondants, etc.). == La Volonté de puissance comme interprétation morale == Nous terminerons cet exposé sur la Volonté de puissance par la fameuse généalogie de la morale. Elle occupe une place considérable dans l'œuvre et la pensée de Nietzsche, et même, sans doute, la toute première. À ce titre, l'interprétation de la morale comme Volonté de puissance est plus importante pour comprendre Nietzsche que la connaissance exacte de la notion même de Volonté de puissance. == Essence de la vie == Des deux aspects que nous avons abordés ci-dessus, il est naturel de passer ensuite à une caractérisation générale de la vie en terme de Volonté de puissance. En effet, l'existence tragique s'inscrit dans ce que l'on pourrait appeler une « ontologie dionysiaque » qui est plus large que la simple existence individuelle, tandis que l'explication naturaliste de nos valeurs se fondent sur nos instincts et notre sensibilité, et renvoie donc à l'ensemble du règne animal. La ''volonté de puissance'' est la qualité d'action de la vie, son devenir plus, mais elle n'en est pas le principe au sens classique du terme : :« '' La '' vie '' (...) tend à la '' sensation d'un maximum de puissance'' ; elle est essentiellement l'effort vers plus de puissance ; sa réalité la plus profonde, la plus intime, c'est ce vouloir.'' » « La vie est, à mes yeux, instinct de croissance, de durée, d'accumulation de force, de puissance : là où la volonté de puissance fait défaut, il y a déclin. » La volonté de puissance s'interpréte à partir de la vie organique sans s'y réduire : *Ainsi parlait Zarathoustra'', II, « De la domination de soi » :« Partout où j’ai trouvé du vivant, j’ai trouvé de la volonté de puissance ; et même dans la volonté de celui qui obéit, j’ai trouvé la volonté d’être maître. [...] Et la vie elle-même m’a confié ce secret : « Vois, m’a-t-elle dit, je suis ce qui doit toujours se surmonter soi-même. [...] Et toi aussi, toi qui cherches la connaissance, tu n’es que le sentier et la piste de ma volonté : en vérité, ma volonté de puissance marche aussi sur les traces de ta volonté du vrai ! Il n’a assurément pas rencontré la vérité, celui qui parlait de la « volonté de vie », cette volonté – n’existe pas. Car : ce qui n’est pas, ne peut pas vouloir ; mais comment ce qui est dans la vie pourrait-il encore désirer la vie ! Ce n’est que là où il y a de la vie qu’il y a de la volonté : pourtant ce n’est pas la volonté de vie, mais [...] la volonté de puissance. Il y a bien des choses que le vivant apprécie plus haut que la vie elle-même ; mais c’est dans les appréciations elles-mêmes que parle – la volonté de puissance ! » » Si l'organisme, et plus précisemment notre corps, est le point de départ de Nietzsche, son fil directeur, c'est parce nous n'avons pas de conception de l'être indépendante du fait de vivre. Être, c'est respirer, se nourir, etc. L'être, en lui-même, est un concept dénué de sens, « la dernière fumée d'une réalité qui s'évapore. » C'est pourquoi, selon Nietzsche, il est légitime de chercher d'abord ce qui peut caractériser le vivant : *le pouvoir interne de créer des formes *la non identité du vivant, dont l'unité ne peut jamais être un principe *la lutte interne qui hiérarchise un organisme *l'auto-régulation du vivant. == Essence de l'être == Le §36 de '''Par-delà bien et mal'' propose d'étendre la notion de ''Volonté de puissance'' à l'ensemble de ce qui est. Il faut garder à l'esprit que Nietzsche entoure cette généralisation de nombreuses précautions, et qu'il s'agit avant tout d'une hypothèse. Nous allons maintenant examiner les arguments que Nietzsche fournit en faveur d'une telle généralisation. Nietzsche part d'un « donné » et suppose l'existence d'une seule causalité, à titre d'hypothèse (voir §36 plus haut). Cette hypothèse est d'autant plus légitime que les dualismes causaux âme - corps et vie - matière aboutissent aux contradictions de l'idéalisme métaphysique dénoncées par Nietzsche. Néanmoins, la thèse de la volonté de puissance conduit au rejet, non seulement du vitalisme, mais aussi du matérialisme de type mécaniste. En effet, puisque ce qui caractérise le vivant doit selon lui être généralisé, alors ce que l'on nomme « matière » (Nietzsche nie l'existence de cette dernière) est également sentant et percevant, mais dans un état plus synthétique que dans le cas d'un organisme. La formulation synthétique du résultat de cette généralistion est la suivante : :FP, XIV, 14 [121] : « La vie n'est qu'un cas particulier de la volonté de puissance, - il est tout à fait arbitraire d'affirmer que tout aspire à se fondre dans cette forme de la volonté de puissance. » :« ''l'essence la plus intime de l'être est la volonté de puissance''. » (FP, XIV, 14 (80)). Voyons maintenant comment cela se traduit pour notre compréhension de la réalité. La notion de ''volonté de puissance'' désigne un devenir plus ; elle est conçue par Nietzsche comme un outil de description de la réalité. C'est en ce sens un concept métaphysique, puisqu'il qualifie l'étant en sa totalité. Ce fragment résume toute la philosophie de Nietzsche et son projet de réévaluer les valeurs traditionnelles de la métaphysique à partir d'une nouvelle perspective, ce qui doit entraîner selon lui l'abolition des valeurs idéalistes, en particulier celles du christianisme. Si cette phrase a une apparence métaphysique, dans la mesure où elle paraît énoncer par une définition ce que c'est que l'être des choses, Nietzsche ne parle pourtant pas de ce qu'est l'être en lui-même, mais de ce qu'il en est de son intériorité. Ainsi la volonté de puissance n'est-elle pas un « fondement » ou une « substance » (''ousia'' en grec). La volonté de puissance est une interprétation de la réalité, interprétation qui prend de multiples dimensions, telles que l'éternel retour et le surhomme. Une telle compréhension exclut principalement toute recherche d'un inconditionné derrière le monde, et de cause derrière les êtres. La volonté de puissance n'est pas à proprement parler un devoir être : rien n'est contraint par une loi à devenir plus. Il n'y a en effet, selon Nietzsche, aucune loi dans le devenir : tout devient ce qu'il peut devenir, et cela même exprime sa volonté de puissance. On notera qu'ainsi, s'opposant au dualisme métaphysique de l'essence et de l'existence, Nietzsche interprète l'essence d'une chose (sa structure interne) comme se réalisant toute entière dans le devenir, l'existence et l'essence se confondant alors dans le même concept de volonté de puissance. Le but de Nietzsche est de saper par ce concept les fondements de toutes les philosophies passées et de renouveler la question des valeurs que nous attribuons à l'existence. En ce sens, il n'est ni un prophète, ni un visionnaire, mais se comprend lui-même comme un précurseur. == La volonté de puissance comme interprétation de la réalité == Puisque la Volonté de puissance est maintenant tenue pour une description de ce qui est, elle commande une manière de concevoir les choses, ce qui conduit à formuler des règles d'interprétation de l'être. Selon Müller-Lauter, il est possible de distinguer trois sens différents de l'expression « volonté de puissance » lorsqu'elle est employée au singulier : *« la volonté de puissance » comme tout de la réalité, comme le nom de cette réalité. En ce sens, la Volonté de puissance est bien un concept métaphysique puisqu'il caractérise l'être de l'étant ; *« volonté de puissance », sans l'article « le », comme qualité. En ce sens, comme pour le sens suivant, ce concept désigne une certaine direction d'un devenir singulier ; il désigne l'accroîssement de la puissance ; *« une volonté de puissance », présupposant une pluralité de volontés de puissance ; même sens que ci-dessus, mais la multiplicité radicale du monde est souligné. Cela signifie que le tout, l'univers, s'il peut être considéré comme une quantité de forces fixes, n'est pas lui-même Volonté de puissance, car il ne possède pas d'unité, et, puisque ce caractère lui fait défaut, il n'a pas non plus de finalité, il ne se dirige pas vers un état final (l'univers est donc aussi nécessairement circulaire : voir : Éternel Retour). Il ressort de cette analyse que l'on peut formuler les points de méthode suivants : *tout phénomène s'interpréte d'après les mêmes activités que celles du vivant : sentir, vouloir, penser, mais aussi assimiler et se reproduire ; le vivant est une spécialisation de l'inorganique. *tout phénomène étant l'expression d'une volonté de puissance, est composé d'actions et de réactions, c'est-à-dire qu'il est un ensemble de relations ; on peut donc en déterminer la structure, le devenir spécifique - ou « type ». *tout phénomène est le symptôme d'une volonté de puissance et permet d'interpréter le degré de force de cette activité relativement à la résistance qu'elle rencontre ; cette activité sera ou croissante ou décroissante. *croissance ou décroissance de la volonté de puissance sont les indices de la force et de la faiblesse, de l'accumulation de la puissance et de son épuisement, ou encore de la création et de la stérilité. == Synthèse == Essayons maintenant de dire en quelques mots ce que Nietzsche entend par cette notion de Volonté de puissance. Une volonté de puissance s'analyse alors comme une relation interne d'un conflit, comme structure intime d'un devenir, et non seulement comme le déploiement d'une puissance : ''Le nom précis pour cette réalité serait la volonté de puissance ainsi désigné d'après sa structure interne et non à partir de sa nature protéiforme, insaisissable, fluide.'' (FP XI, 40 (53)). La volonté de puissance est ainsi la relation interne qui structure une force. Elle n'est ni un être, ni un devenir, mais ce que Nietzsche nomme un ''pathos'' fondamental, qui définit la direction de la puissance, dans le sens de la croissance ou de la décroissance. Ce ''pathos'', dans le monde organique, s'exprime par une hiérarchie d'instincts, de pulsions et d'affects, qui forment une perspective interprétative d'où se déploie la puissance et qui se traduit par exemple par des pensées et des jugements de valeur correspondants. == Problèmes soulevés == Nietzsche ne donne aucune définition de la Volonté de puissance. Comme cette notion décrit l'essence de l'être, cette absence n'est pas nécessairement un défaut, car on peut estimer qu'au même titre que dans les cas de notions telles qu'être ou réalité, il n'est pas possible de fournir une telle définition. Toute définition de ces notions revient seulement à les illustrer par d'autres notions qui supposent l'existence, et donc ce qui est à définir. Or, nous avons de bonnes raisons de penser que la Volonté de puissance n'échappent pas à cette difficulté, d'autant plus que l'usage même qu'en fait Nietzsche met en lumière précisément cette problématique, mais sans jamais l'expliciter : * décrivant ou caractérisant ce qui est, elle ne paraît pas similaire à une notion aussi générale que celle de réalité, et Nietzsche prend d'ailleurs soin d'y adjoindre d'autres notions explicatives (structure, force, etc.) qui supposent toutes la notion de réalité ; dans ce cas, il est difficile de comprendre quelle genre de réalité est la Volonté de puissance : une qualité générale, une manière d'être commune à tous les êtres, l'être-même ? * comme Nietzsche utilise cette notion pour toute sorte d'êtres particuliers, nous sommes justifiés à nous demander comment il peut établir une telle notion à un statut aussi général et en même aussi particulier : est-ce une intuition généralisée, mais alors selon quelle méthode ? est-ce le fruit de l'observation, une inférence à partir d'un donné, mais alors lequel ? est-ce un concept-outil permettant d'interpréter tout ce qui est, mais alors, comment pourrait-il en même temps être l'essence de l'être ? En reprenant l'ordre de l'exposé qui précède, nous allons proposer un examen détaillé de ces questions. === En tant que sagesse de la vie === Nous avons vu que la Volonté de puissance a beaucoup à voir avec la vie telle que nous la vivons, telle que nous la ressentons subjectivement, non seulement parce que cette notion décrit ce qui est l'impulsion fondamentale de nos actes et de nos pensées (le sentiment de notre propre pouvoir), mais également parce que la conception nietzschéenne de ce qui est se fonde sur le donné de nos instincts, donné qui se ramène à la Volonté de puissance. Le caractère intuitif de cette notion est encore plus manifeste dans le dernier aphorisme de ''Par-delà bien et mal'' qui décrit l'expérience individuelle du ''Génie du cœur''. À la considérer dans le seul domaine de la pure subjectivité, que nous apprend donc la Volonté de puissance ? Elle nous apprend la manière dont l'individu Nietzsche éprouvait sa propre existence, comment il voyait la vie, quelle sagesse il pensait pouvoir en tirer et comment il pensait pouvoir comprendre le comportement des autres. En tant que sagesse de la vie, elle n'est que l'expression subjective dont Nietzsche perçoit son existence. À ce titre, elle aussi enrichissante, instructive, passionnante, que nombre d'expériences humaines et de productions poétiques. Nietzsche a d'ailleurs exprimé sa vision du monde sous la forme poétique et, dans une moindre mesure, musicale. De cette manière, il a peut-être réellement contribué à « enjoliver la vie », à accroître le sentiment esthétique que l'on peut éprouver à vivre, à condition toutefois d'être sensible à ses talents artistiques. Considérons à présent l'autre aspect de la sagesse de la vie, celui des valeurs, et, au premier chef, celui des valeurs morales. Mais elle n'est pas originale de ce point de vue (Épicure, Machiavel). Même son analyse du christianisme : Voltaire, Celse. En dehors de ce cercle, en dehors de cette appréciation subjective et esthétique, il ne semble pas que nous puissions apprendre quoique ce soit par cette notion : elle ne saurait sortir de ce cercle sans justification, et il apparaît difficile, sinon impossible, de faire d'un donné intuitif un principe d'explication des phénomènes. C'est pourtant ce que Nietzsche prétend faire. Nous verrons plus loin comment il présente cette utilisation. === En tant qu'interprétation de la morale === Nietzsche rejette explicitement les morales conséquentialistes, de type utilitarisme. Venons-en à cette distinction célèbre entre le fort et le faible, au sens que nous avons exposé ci-dessus, et commençons par examiner ce qui motive Nietzsche à construire une interprétation de la morale en ces termes. Selon Nietzsche, la morale fait appel à des réalités et à des catégories métaphysiques en ce sens qu'elles constituent un monde possédant des qualités incompatibles avec ce monde-ci, le monde du devenir<ref>Nietzsche établit une nette distinction entre le devenir et un monde métaphysique. Question : qu'est-ce qui permet de les distinguer ? Est-ce limite ? si non (et c'est la réponse de Nietzsche), et qu'il n'y a qu'un seul monde, le problème est de comprendre ce qui peut être appelé « métaphysique » dans un monde où une telle chose n'existe pas.</ref>. Il en va par exemple ainsi du moi et de la liberté, dans la mesure où ces notions sont définies dans le but de soutenir une théorie de la volonté qui en fait une forme de causalité ''autonome'', c'est-à-dire indépendante de la causalité naturelle. Toutes ces notions forment un monde à la fois moral et métaphysique, puisque le sujet moral est responsable de ces actes, et donc bon, dans la mesure où il n'est pas déterminé dans le devenir ; en effet, s'il était déterminé naturellement, le sujet ne serait plus un sujet, il ne serait plus à l'origine de ses actes et n'en serait pas non plus responsable. Il faut donc que, d'une certaine façon, il soit en retrait par rapport au devenir, d'une manière telle qu'il existe deux mondes antithétiques, celui des causes naturelles et celui des mobiles de la volonté. Dès lors, la morale a bel et bien besoin d'un autre monde pour être seulement possible. Ces remarques s'appliquent bien entendu à un certain type de morales, à ce type de morales qui supposent pour être possible une forme de dualisme : il y a d'un côté le monde naturel (objet des sciences de la nature), et de l'autre un monde morale possédant des qualités totalement différentes. Mais, pour Nietzsche, toutes les morales ont été jusqu'ici de ce type. Toutes dérivent du christianisme (c'est le cas de celle de Kant à laquelle nous avons fait allusion ci-dessus), ou sont une forme primitive de christianisme (et c'est le cas, selon Nietzsche, de la morale de Platon). On pourrait objecter que Nietzsche se trompe sur ce point, car il existe des morales qui ne supposent pas le dualisme. C'est le cas de la morale épicurienne. Toutefois, si l'on examine de près l'épicurisme, on remarque que celui-ci s'efforce d'échapper aux conséquences du déterminisme par l'introduction d'atomes spécifiques constituant l'âme. En supposant le dualisme, ce type de morales nous fait passer de la question de la nature des valeurs (le bien, le juste, etc.) à la question de la connaissance d'un certain type de réalités que l'on doit supposer pour assurer un fondement solide à la morale : la source ultime de nos valeurs morales doit être d'ordre métaphysique et nous sommes inévitablement confrontés à la question de savoir comment nous pourrions avoir accès à cette réalité. Mais, dès lors que le recourt à des entités qui dépassent notre capacité de connaître est mis en cause, il est légitime, comme le fait Nietzsche, de se demander pourquoi des personnes croient malgré cela en de telles entités, puisque justement, en récusant l'existence ou la possibilité de connaissance de telles entités, elles ne peuvent pas servir de justification réelle à ces croyances, c'est-à-dire que ces croyances : #ne sont pas vraies en vertu d'une réalité qui leur correspondrait (elles sont fausses ou impossibles à établir) ; #ne peuvent-être tenues pour vraies en vertu de cette même réalité (nous ne sommes pas justifiés à les tenir pour vraies). On ne peut donc pas, pour les expliquer, recourir à ces mêmes entités, sous peine de pétition de principe : en effet, la morale suppose ces entités, il faut donc montrer leur existence et non la poser arbitrairement. Il faut alors expliquer pourquoi de telles croyances sont tenues pour vraies. La raison, comme faculté d'intuition ou de connaissance de réalités métaphysiques a déjà été écartée. Il nous reste à nous tourner vers les autres facultés humaines, telles que l'imagination ou la sensibilité, et, dans ce cas, pour expliquer l'origine de la morale, nous devons recourir à la psychologie, et considérer l'homme en tant qu'être naturel, pourvu d'instincts et d'affects, et comprendre ses croyances comme le résultat de ces derniers. Or, le premier point que l'on peut remarquer, c'est que ces croyances ne peuvent être comprises comme des jugements de connaissance, quand bien même elles sont tenues pour telles. Il faut donc que de telles croyances soient des jugements de valeurs. De telles croyances exprimeront donc un jugement sur l'existence, et, selon Nietzsche, exprimerons la manière dont nous en sommes affectés. De ce point de vue, la croyance en un au-delà à partir duquel nous jugeons ce monde apparaît comme une croyance qui a pour fonction de nous consoler des souffrances insurmontables qui nous affligent dans ce monde-ci. Le faible est alors celui qui a besoin de ces valeurs qui condamnent l'existence, tandis que le fort trouve dans cette vie-ci tout ce dont il a besoin pour s'épanouir, et le faible éprouvera naturellement de la haine pour le fort, qui est à ses yeux l'homme méchant, haine que Nietzsche désigne par le terme de ressentiment. Par sa théorie du ressentiment et sa psychologie des profondeurs, Nietzsche donne une analyse cohérente et convaincante des origines des valeurs humaines. En revanche, l'utilisation qu'il fait de cette psychologie sur certains sujets touchant à la culture et à la politique sont moins convaincants. Il apparaît en effet que Nietzsche construit sur cette opposition fort/faible une théorie de la culture et une politique qui ne vont pas sans contredire ses propres observations morales et qui le rapprochent, paradoxalement, de la politique telle que Platon la comprenait. Nietzsche ne cesse de rappeler que c'est la faiblesse qui a poussé l'homme à créer des expédiants, à approfondir son intériorité, sa spiritualité. L'auto-empoisonnement est même hissée par lui au rang de vertu (''GS''). Prenons des exemples pour illustrer ce point, avant de montrer en quoi cela contredit ses idées sur la culture et la politique. [[Fichier:La Vérité, par Jules Joseph Lefebvre.jpg|200px|right]] Nous prendrons pour exemples les vues que Nietzsche a formulées sur le peuple juif, sur le christianisme et sur les femmes. En ce qui concerne le peuple juif, trois appréciations doivent être distinguées, sans que nous ayons besoin, pour notre propos, de rentrer dans le détail. Nietzsche admire l'Ancien Testament pour sa sublimité morale, il juge en revanche que le prêtre juif est un mélange de force et faiblesse de volonté de puissance, enfin, il admire la force de la tradition et de l'intellectualité juives à travers les âges. En ce qui concerne le christianisme, il est bien connu que Nietzsche ne cesse de le critiquer avec virulence, pourtant on remarque moins que la suprématie de l'esprit que Nietzsche réclame dans l'''Antéchrist'' est explicitement rapprochée par lui de la hiérarchie spirituelle de l'Église. Enfin, en ce qui concerne les femmes, Nietzsche les considère comme la moitié faible de l'humanité, mais, d'un autre côté, n'en admire pas moins certaines qualités qu'il considère comme féminines. Nous n'avons pas besoin d'aller très loin dans l'examen de ces exemples pour remarquer qu'aux yeux de Nietzsche la faiblesse n'est pas sans valeur, et que, même, sans cette faiblesse, l'humanité aurait perdu beaucoup en raffinement moral et intellectuel : on est même en droit de se demander si, selon Nietzsche lui-même, il y aurait eu la moindre lueur de génie en l'homme, sans cette faiblesse qui a besoin de s'inventer tout un monde spirituel et moral pour survivre. Au même titre que la force, la faiblesse est inventive, et un premier doute que nous pouvons formuler ici à propos de cette opposition entre deux volontés de puissance ''opposées'' est qu'il n'y a tout simplement pas de type humain dénué absolument d'une volonté de puissance créatrice. Bien plus, plus Nietzsche oppose faible et fort, et plus il se trouve acculé logiquement à distinguer deux types de volonté de puissance ''différentes par nature'' ; et c'est bien une telle distinction de plus en plus tranchée qu'il présente dans les derniers années de sa vie consciente (nous en donnons une illustration concrête ci-dessous). Or, s'il rejette le dualisme, et n'admet la Volonté de puissance que comme causalité unique, une telle opposition ne peut tout simplement pas exister : force et faiblesse ne peuvent qu'être relatives. Cette incohérence remet fortement en cause ses idées sur la culture et la politique, et même, si notre objection est valide, les réfute. L'''Antéchrist'' et le ''Crépuscule des Idoles'' exposent sans ambiguïté une forme de politique et culture qui doivent mener les faibles à leur perte : les faibles doivent périr, non pas qu'il s'agisse de les exterminer, mais il faut instituer des valeurs sélectives (comme l'Éternel Retour) qui devraient favoriser l'auto-supression de la faiblesse, ce qui peut par exemple se traduire par l'éloge du suicide (in ''CdI'', et ''Ant'' de manière plus radicale). On ne saurait formuler de manière plus extrême l'opposition entre fort et faible que par cette idée d'une politique de l'avenir qui se donnerait pour but d'éradiquer toute faiblesse. Mais nos exemples ont montré que la faiblesse était la source d'une grande partie de ce qui fait notre vie morale et intellectuelle aujourd'hui. Supprimer la faiblesse, c'est supprimer une source considérable de création de valeurs. Nietzsche est conduit à opposer de manière si radicale le fort et le faible, qu'il ne semble pas envisager que c'est l'équilibre des deux qui serait, selon sa propre théorie, la condition la plus fertile, la plus prometteuse, alors que dans le même temps il milite pour une opposition tranchée entre hommes et femmes. Le résultat sans doute le plus paradoxal de cette application de l'opposition entre force et faiblesse à la politique, est que Nietzsche est conduit à adopter des vues politiques qui ne sont pas moins normatives que celles de Platon. On peut cependant faire remarquer que Nietzsche voit en Platon un modèle du philosophe-législateur. Nietzsche, comme Platon, se propose de réguler les affects humains par le moyen de mythes (l'Éternel Retour en ce qui concerne Nietzsche), et ils ont tout deux en vue une certaine forme d'existence, le philosophe chez Platon, le Surhomme chez Nietzsche. Et la société n'est justifiée pour Nietzsche que par cette possibilité de donner naissance à des êtres supérieurs. Tous deux ont ainsi en vue un idéal impossible, mais, à la différence de Nietzsche, Platon a vue que cet idéal est impossible, qu'il appartient à un autre monde, et c'est pourquoi ni ''La République'', ni ''Les Lois'', malgrè leur caractère par certains aspects totalitaires, ne décrivent de cités parfaites qu'il s'agirait de réaliser. Au contraire, Nieztsche, en formulant de manière de plus en plus tranchée cette opposition de la force et de la faiblesse, est amené à vouloir expulser une forme de volonté de puissance qui fait pourtant partie intégrante de la réalité. === En tant que notion === Nous allons maintenant aborder la notion de Volonté de puissance de manière plus théorique, en la considérant en tant qu'elle est une notion. Cela pose les questions de savoir comment Nietzsche peut parler de cette notion sans la dénaturer et jette le doute sur les descriptions de qu'il en fait en tant que « structure », « direction d'un devenir », etc, car tous ces termes supposent l'être, et cet être est censé être Volonté de puissance. Difficulté de savoir de quoi Nietzsche parle exactement, à quoi s'applique cette notion et de ce qui la distingue d'autres notions. # Comment Nietzsche en arrive-t-il à cette notion ? # À quoi s'applique-t-elle et comment ? ==== Construction de la notion ==== Nous avons déjà vu plus haut comment Nietzsche étend la Volonté de puissance à tout ce qui est : chaque être est une Volonté de puissance particulière. Mais l'extension que donne Nietzsche à cette notion pose des problèmes de méthode. On peut en effet avoir des doutes sur la légitimité de généraliser une intuition à la vie toute entière et à l'être. Examinons les différentes étapes que suit Nietzsche. # Nietzsche privilégie à l'évidence un certain « donné » (PBM, § 36) pour le prendre comme point de départ de son argumentation. Mais pourquoi ce donné, et pas un autre ? Deux arguments militent ici contre Nietzsche : ##Contre l'évidence à laquelle Nietzsche semble faire appel, considérons les autres formes de vie : les plantes, par exemple. Le donné d'une plante serait-il aussi le monde des instincts ? Mais si ce donné dépend d'une réalité corporelle (sous peine de reconduire un dualisme), et que cette réalité corporelle est supposée être toute entière Volonté de puissance, il s'en suit que le raisonnement de Nietzsche est circulaire, et que poser un donné non seulement comme une réalité phénoménale subjective, comme être, et un acte philosophique dogmatique (il ne repose sur rien si ce n'est la décision de tenir cette réalité-ci comme plus essentielle que les autres). ##Ce que Nietzsche appelle donné n'est vraisemblablement qu'une partie de ce qui est. Or, Nietzsche critique la certitude cartésienne : ignorance. La méthode de Nietzsche ressemble fort à cette introspection qu'il condamne. # Ce dernier point nous conduit à examiner plus largement la validité que devrait avoir une telle généralisation à l'ensemble de la réalité. erreur logique : Hume. ==== Un statut ontologique incertain ==== En tant que notion décrivant la réalité, la Volonté de puissance a un statut ontologique, c'est-à-dire qu'elle doit nous aider à comprendre les structures du réel et, en outre, qu'elle doit faire face à toutes les difficultés que rencontrent les notions qui prétendent '''Comme structure du réel''' que peut bien signifier cette « compréhension » de l'intérieur des phénomènes mécaniques ? > faible pouvoir explicatif. En expliquant le réel, Nietzsche se situe dans une tradition de philosophie de la nature qui remonte à Thalès ; mais, dans le cas des Présocratiques, on peut admirer la puissance intuitive qui conduit à s'interroger sur les éléments ultimes du réel, même si ces théories sont fausses. Dans le cas de Nietzsche, on peut s'interroger sur la pertinence d'une notion qui prétend saisir l'essence de l'être à l'époque de la physique moderne : comment une spéculation pĥilosophique pourrait-elle nous apprendre quoi que ce soit de plus et de mieux que la physique ? '''Problèmes ontologiques''' Il y a encore plusieurs autres difficultés qui se présentent lorsque l'on s'interroge sur le type de réalité qu'est une Volonté de puissance, et, en particulier, si l'on confronte cette notion à la question des universaux. On peut en effet être intrigué à l'idée que la Volonté de puissance ne reconduirait pas l'ancienne métaphysique et qu'elle décrit en même temps ce qui est : quel peut être son statut dans ce cas ? quel genre de réalité est la Volonté de puissance ? Cela revient à demander quelle genre de description ontologique est la Volonté de puissance. Tout d'abord, à l'évidence, c'est une notion générale, puisque chaque devenir particulier est compris par Nietzsche comme une Volonté de puissance. Mais, si tel est le cas, il faut que la Volonté de puissance soit ou bien une notion désignant une qualité de type platonicienne présente dans des êtres qu'elle qualifie, ou bien qu'elle soit une qualité immanente, ou bien qu'elle ne soit qu'une notion par laquelle nous étiquetons des réalités diverses. La première possibilité est explicitement rejetée par Nietzsche, puisqu'il s'agit du dualisme qui sépare la réalité en deux régions. Mais on se rendra peut-être encore mieux compte de cette difficulté en rapprochant la Volonté de puissance de la « métaphysique » d'Aristote. En effet, quel est le but d'Aristote ? comprendre comment ce qui est est ce qu'il est. Or, ce qui est est par la combinaison d'une forme et d'une matière. Mais qu'est-ce donc que la structure d'une Volonté de puissance, ce que Nietzsche nomme un type, sinon une ''forme'' qui organise une matière ? Les questions de métaphysique posées par Aristote doivent donc valoir pour la métaphysique de la Volonté de puissance. Dès lors, des questions viennent naturellement à l'esprit : par exemple, qu'est-ce qui individualise une Volonté de puissance ? autrement dit, comment distinguer un être d'un autre, si ce qui le caractérise est sa Volonté de puissance et le type qu'il représente ? Ces questions sont tout simplement ignorées par Nieztsche. Il en résulte que nous ne pouvons pas avec certitude ce qu'est la Volonté de puissance ni la compréhension qu'elle devrait nous apporter à propos de la réalité. === En tant que principe d'interprétation === Ces difficultés à propos de la notion de Volonté de puissance considérée en elle-même nous conduisent naturellement à juger que l'interprétation et l'ontologie nietzschéennes sont en contradiction. Il y a en effet à l'évidence un problème de cohérence dans l'idée que la Volonté de puissance serait l'essence la plus intime de l'être et, en même temps, un principe d'interprétation de ce qui est. S'il s'agit d'interpréter la réalité, alors la Volonté de puissance n'est pas ce qui est, mais suppose au contraire qu'il y a de l'être ''préalablement''. Mais si la Volonté de puissance est bien l'essence de l'être, alors ce n'est plus une interprétation, mais une formulation dogmatique à propos de la nature de ce qui est. Si l'on maintient malgré tout que cette notion est aussi interprétation, alors il faut en arriver à une conclusion d'un idéalisme extrême, ''à savoir que notre interprétation est ce qui est'', que nous pensons l'être même en pensant la Volonté de puissance. Sur cette voie, l'idée d'un être indépendant de nous, existant en soi, est logiquement rejetée, et c'est un rejet que l'on peut admettre, mais il s'en suit que, pensant l'être en tant que Volonté de puissance, à partir d'un donné subjectif qui est de l'ordre des instincts, c'est la totalité de l'être qui est ramenée à notre manière d'éprouver l'existence et qui est compris par elle. Il n'y a pas d'être hors de ce cercle. Si nous renonçons à une telle énormité, il faut convenir que la Volonté de puissance n'est rien d'autre qu'''une'' certaine d'interprétation des phénomènes, nécessairement séparée de l'essence de ces mêmes phénomènes, et le donné n'est pas une voie valable pour penser et concevoir la réalité. Au final, trois interprétations de la volonté de puissance seraient envisageables : ou bien nous devons soutenir que notre pensée et l'être coïncident, ce qui est la négation de toute interprétation nietzschéenne, ou bien la volonté de puissance est une intuition de ce qui est et n'est pas un principe d'interprétation, ou bien, enfin, nous devons nous résoudre à renoncer à la vision nietzschéenne de l'être et tenir la Volonté de puissance comme une théorie de la connaissance (ou de l'interprétation) qui ne nous donne aucune intuition du devenir, mais nous apprend seulement comment nous interprétons les phénomènes. == Notes pour les points qui sont à développer ailleurs == <references /> jlmr32dsucepwqco54kq0f334zrvn9l Discussion:Nietzsche : Introduction à sa philosophie/Éternel Retour 1 33385 764989 245937 2026-04-25T07:48:51Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/Éternel Retour]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/Éternel Retour]] 245937 wikitext text/x-wiki Arguments proposés par Nietzsche : # l'être n'existe pas, ie. l'Univers n'atteint jamais un état final, il n'a pas de but (ce qui implique aussi le rejet de tout modèle mécanique) ; # en conséquence, l'Univers n'est pas devenu – il n'a jamais commencé à devenir (rejet du créationnisme) ; # l'Univers est fini (l'idée d'une force infinie est absurde et reconduirait à la religion) ; # la volonté de puissance est une quantité de force ; or, selon les points précédents, l'Univers est composé d'un nombre fini de forces et le temps est un infini ; # toutes les combinaisons possibles doivent donc pouvoir revenir un nombre infini de fois. Les deux premiers arguments servent à écarter la possibilité d'un état parfaitement stable de l'univers, puisque cette possibilité réfuterait l'Éternel Retour. Les trois suivants constituent l'essentiel de l'argumentation de Nietzsche. Examinons-les. fwgrajidsf680whcnq7wgsibaalpfux Discussion:Nietzsche : Introduction à sa philosophie 1 33386 764932 245938 2026-04-25T07:39:21Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche]] vers [[Discussion:Nietzsche : Introduction à sa philosophie]] 245938 wikitext text/x-wiki Ce livre a besoin d'une profonde révision : * Réorganiser le livre. * Réécrire entièrement le livre. grn88tp9a9zic5kpxc1jbrlo559gd9a Catégorie:Philosophie analytique (livre) 14 35101 765025 485162 2026-04-25T10:02:06Z PandaMystique 119061 765025 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] ti5ogwbk8s28zyylfgbdyharuik2yfz Programmation en Go/Premier 0 40349 765032 635819 2026-04-25T10:10:23Z Nimmzo 76083 /* lead section */ syntaxhighlight: +line +highlight +start 765032 wikitext text/x-wiki {{NavTitre|book={{BASEPAGENAME}}|prev=Installation|next=Les types de base}} == Compiler votre premier programme == Créez le fichier '''hello.go''' et insérez le texte suivant : <syntaxhighlight lang="go" line highlight=6,8> package main import "fmt" // pour Printf /* Fonction principale affiche un Hello World! */ func main() { // Le retour à la ligne est "\n" fmt.Printf("Bonjour, monde!\n") } </syntaxhighlight> Lancez ensuite les commandes suivantes dans le répertoire où se trouve ce fichier : <syntaxhighlight lang="console" line highlight=1,2> go build hello.go ./hello </syntaxhighlight> <syntaxhighlight lang="go" line start=3> Bonjour, monde! </syntaxhighlight> == Structure == <syntaxhighlight lang="go" line> package main </syntaxhighlight> Cette ligne permet de déclarer un module, en l’occurrence le module "main" qui représente notre programme. <syntaxhighlight lang="go" line start=2> import "fmt" // pour Printf </syntaxhighlight> Cette ligne déclare l'utilisation du module "fmt". Les guillemets (double quotes) sont indispensables. <syntaxhighlight lang="go" line start=6 highlight=1> func main() { </syntaxhighlight> Ceci déclare le point d'entrée du programme. L'accolade ouvrante définit le début d'un bloc, celui-ci se terminera par une accolade fermante. Les accolades doivent toujours être appariées. <syntaxhighlight lang="go" line start=8 highlight=1> fmt.Printf("Bonjour, monde!\n") </syntaxhighlight> Cette ligne, lorsqu'elle est évaluée, affiche à l'écran la chaîne de caractères "Bonjour, monde!" suivie d'un retour à la ligne. Voilà, nous avons étudié en détail notre premier programme. Passons maintenant au chapitre suivant qui traite des types de base. [[Catégorie:Programmation en Go (livre)]] 4vjh43n2n12ro52phunvoynpnhmp8q1 765033 765032 2026-04-25T10:20:11Z Nimmzo 76083 /* Structure */ +syntaxhighlight +inline 765033 wikitext text/x-wiki {{NavTitre|book={{BASEPAGENAME}}|prev=Installation|next=Les types de base}} == Compiler votre premier programme == Créez le fichier '''hello.go''' et insérez le texte suivant : <syntaxhighlight lang="go" line highlight=6,8> package main import "fmt" // pour Printf /* Fonction principale affiche un Hello World! */ func main() { // Le retour à la ligne est "\n" fmt.Printf("Bonjour, monde!\n") } </syntaxhighlight> Lancez ensuite les commandes suivantes dans le répertoire où se trouve ce fichier : <syntaxhighlight lang="console" line highlight=1,2> go build hello.go ./hello </syntaxhighlight> <syntaxhighlight lang="go" line start=3> Bonjour, monde! </syntaxhighlight> == Structure == <syntaxhighlight lang="go" line> package main </syntaxhighlight> Cette ligne permet de déclarer un module, en l’occurrence le module <syntaxhighlight lang="go" inline>main</syntaxhighlight> qui représente notre programme. <syntaxhighlight lang="go" line start=2> import "fmt" // pour Printf </syntaxhighlight> Cette ligne déclare l'utilisation du module <syntaxhighlight lang="go" inline>"fmt"</syntaxhighlight>. Les guillemets ("double quotes") sont indispensables. <syntaxhighlight lang="go" line start=6 highlight=1> func main() { </syntaxhighlight> Ceci déclare le point d'entrée du programme. L'accolade ouvrante définit le début d'un bloc, celui-ci se terminera par une accolade fermante. Les accolades doivent toujours être appariées. <syntaxhighlight lang="go" line start=8 highlight=1> fmt.Printf("Bonjour, monde!\n") </syntaxhighlight> Cette ligne, lorsqu'elle est évaluée, affiche à l'écran la chaîne de caractères <syntaxhighlight lang="go" inline>"Bonjour, monde!"</syntaxhighlight> suivie d'un retour à la ligne. Voilà, nous avons étudié en détail notre premier programme. Passons maintenant au chapitre suivant qui traite des types de base. [[Catégorie:Programmation en Go (livre)]] b19ui9bq3f27bddvb4lur0ppiftgafd 765034 765033 2026-04-25T10:30:49Z Nimmzo 76083 /* Compiler votre premier programme */ Remove leading space 765034 wikitext text/x-wiki {{NavTitre|book={{BASEPAGENAME}}|prev=Installation|next=Les types de base}} == Compiler votre premier programme == Créez le fichier '''hello.go''' et insérez le texte suivant : <syntaxhighlight lang="go" line highlight=6,8> package main import "fmt" // pour Printf /* Fonction principale affiche un Hello World! */ func main() { // Le retour à la ligne est "\n" fmt.Printf("Bonjour, monde!\n") } </syntaxhighlight> Lancez ensuite les commandes suivantes dans le répertoire où se trouve ce fichier : <syntaxhighlight lang="console" line highlight=1,2> go build hello.go ./hello </syntaxhighlight> <syntaxhighlight lang="go" line start=3> Bonjour, monde! </syntaxhighlight> == Structure == <syntaxhighlight lang="go" line> package main </syntaxhighlight> Cette ligne permet de déclarer un module, en l’occurrence le module <syntaxhighlight lang="go" inline>main</syntaxhighlight> qui représente notre programme. <syntaxhighlight lang="go" line start=2> import "fmt" // pour Printf </syntaxhighlight> Cette ligne déclare l'utilisation du module <syntaxhighlight lang="go" inline>"fmt"</syntaxhighlight>. Les guillemets ("double quotes") sont indispensables. <syntaxhighlight lang="go" line start=6 highlight=1> func main() { </syntaxhighlight> Ceci déclare le point d'entrée du programme. L'accolade ouvrante définit le début d'un bloc, celui-ci se terminera par une accolade fermante. Les accolades doivent toujours être appariées. <syntaxhighlight lang="go" line start=8 highlight=1> fmt.Printf("Bonjour, monde!\n") </syntaxhighlight> Cette ligne, lorsqu'elle est évaluée, affiche à l'écran la chaîne de caractères <syntaxhighlight lang="go" inline>"Bonjour, monde!"</syntaxhighlight> suivie d'un retour à la ligne. Voilà, nous avons étudié en détail notre premier programme. Passons maintenant au chapitre suivant qui traite des types de base. [[Catégorie:Programmation en Go (livre)]] 187psf0cje39dlr66lzy6vfutyqp3dg Discussion:Nietzsche : Introduction à sa philosophie/La moralité des mœurs 1 43050 764981 319319 2026-04-25T07:47:55Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/La moralité des mœurs]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] 319319 wikitext text/x-wiki Il me semble qu'il ne faut pas confondre "Sittlichkeit der Sitte" (moralité des mœurs) et "die Moral" (la morale). Dans PBM 262 il n'est pas question de "Sittlichkeit" ni de "Sitte", mais de morale. De même que l'éducation n'est pas forcément celle de la moralité des mœurs. Il serait important de rectifier cela. Autre chose, ''La Volonté de Puissance'' (le bouquin) est non seulement a utiliser avec des pincettes, mais il faut donner l'édition puisque plusieurs existent et diffèrent (le même aphorisme n'aura pas les mêmes références d'une édition à l'autre) 4sy0fur96tah1hor72oaqklnpxyvmh3 Catégorie:Une brève introduction à la philosophie 14 50194 765028 374719 2026-04-25T10:02:28Z PandaMystique 119061 765028 wikitext text/x-wiki [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] a9l0cz89a3pg0qr5vuvnzlmznc0qirz Discussion:Nietzsche : Introduction à sa philosophie/La culture moderne 1 57486 764977 429873 2026-04-25T07:47:43Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/La culture moderne]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/La culture moderne]] 429873 wikitext text/x-wiki Nietzsche n'est pas un anti moderniste. il n,a rien contre l'essort de la technique, il en a seulement contre la moral du nouvelle idole de notre societe. 4c4q7mkp8bf8gnocgmhv6fc3fhrbdgf Fonctionnement d'un ordinateur/L'adressage des périphériques 0 65771 764838 762961 2026-04-24T12:41:30Z Mewtow 31375 /* Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales */ 764838 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses. ==Rappels : l'espace d'adressage unifié ou séparé== Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques. ===L'espace d’adressage séparé=== Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]] Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. ===Les entrées-sorties mappées en mémoire=== La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple. ==Les bus unifiés et les bus d'entrée-sortie== Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus. La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties. [[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]] La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée. [[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]] La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]] ===L'implémentation d'un bus IO dédié avec un multiplexeur d'IO=== Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA. Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point. [[File:IO MUX.png|centre|vignette|upright=2|IO MUX]] [[File:8255.svg|vignette|8255]] Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C. : Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas. Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU. Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture. Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle. Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré. [[File:MOS6526.svg|vignette|MOS 6526.]] Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés. Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure. ===Le contrôleur DMA sur un bus partagé ou avec un répartiteur=== L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''. À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA. [[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]] L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==L'implémentation matérielle de l'espace d'adressage séparé/unifié== Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux. Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur. {|class="wikitable" |- ! ! Espace d'adressage unifié (entrées-sorties mappées en mémoire) ! Espace d'adressage séparé |- ! Bus système | rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé |- ! Bus séparé avec répartiteur |- ! Bus séparé pour les IO | Non, sauf exceptions | Oui, obligatoire |} Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit. ===Les entrées-sorties mappées en mémoire avec un bus système=== Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle. Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique. La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses. [[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]] Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] ===L'espace d'adressage séparé avec un bus système=== Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire. Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur. Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés. [[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]] Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données. [[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]] ===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales=== Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité. La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives. Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes. [[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] ==Annexe : le ''mirroring'' des adresses== Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressag... {|class="wikitable" |- ! Intervalles d'adresses ! Description ! Taille |- | $0000–$07FF | Mémoire RAM | 2 kibioctets |- | $0800–$0FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $1000–$17FF | Mémoire RAM (miroir) | 2 kibioctets |- | $1800–$1FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $2000 - $3FFF | Registres d’interfaçage de la carte graphique, une copie tous les 8 octets | 8 kibioctets |- | $4000–$401F | Divers |- | $4020–$FFFF | Inoccupé, utilisé par la cartouche de jeu |} <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les méthodes de synchronisation entre processeur et périphériques | prevText=Les méthodes de synchronisation entre processeur et périphériques | next=Les périphériques et les cartes d'extension | nextText=Les périphériques et les cartes d'extension }}{{AutoCat}} </noinclude> 7pob4ukmp811pxe8siuiopxc0hcou8r 764839 764838 2026-04-24T12:41:42Z Mewtow 31375 /* Annexe : le mirroring des adresses */ 764839 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses. ==Rappels : l'espace d'adressage unifié ou séparé== Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques. ===L'espace d’adressage séparé=== Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]] Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. ===Les entrées-sorties mappées en mémoire=== La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple. ==Les bus unifiés et les bus d'entrée-sortie== Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus. La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties. [[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]] La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée. [[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]] La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]] ===L'implémentation d'un bus IO dédié avec un multiplexeur d'IO=== Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA. Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point. [[File:IO MUX.png|centre|vignette|upright=2|IO MUX]] [[File:8255.svg|vignette|8255]] Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C. : Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas. Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU. Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture. Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle. Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré. [[File:MOS6526.svg|vignette|MOS 6526.]] Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés. Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure. ===Le contrôleur DMA sur un bus partagé ou avec un répartiteur=== L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''. À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA. [[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]] L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==L'implémentation matérielle de l'espace d'adressage séparé/unifié== Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux. Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur. {|class="wikitable" |- ! ! Espace d'adressage unifié (entrées-sorties mappées en mémoire) ! Espace d'adressage séparé |- ! Bus système | rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé |- ! Bus séparé avec répartiteur |- ! Bus séparé pour les IO | Non, sauf exceptions | Oui, obligatoire |} Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit. ===Les entrées-sorties mappées en mémoire avec un bus système=== Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle. Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique. La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses. [[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]] Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] ===L'espace d'adressage séparé avec un bus système=== Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire. Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur. Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés. [[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]] Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données. [[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]] ===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales=== Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité. La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives. Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes. [[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] ==Annexe : le ''mirroring'' des adresses== Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... {|class="wikitable" |- ! Intervalles d'adresses ! Description ! Taille |- | $0000–$07FF | Mémoire RAM | 2 kibioctets |- | $0800–$0FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $1000–$17FF | Mémoire RAM (miroir) | 2 kibioctets |- | $1800–$1FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $2000 - $3FFF | Registres d’interfaçage de la carte graphique, une copie tous les 8 octets | 8 kibioctets |- | $4000–$401F | Divers |- | $4020–$FFFF | Inoccupé, utilisé par la cartouche de jeu |} <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les méthodes de synchronisation entre processeur et périphériques | prevText=Les méthodes de synchronisation entre processeur et périphériques | next=Les périphériques et les cartes d'extension | nextText=Les périphériques et les cartes d'extension }}{{AutoCat}} </noinclude> 8tppn9c1jxa5nsxlrmj2wei75ufv8xm 764840 764839 2026-04-24T12:41:56Z Mewtow 31375 /* Annexe : le mirroring des adresses */ 764840 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses. ==Rappels : l'espace d'adressage unifié ou séparé== Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques. ===L'espace d’adressage séparé=== Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]] Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. ===Les entrées-sorties mappées en mémoire=== La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple. ==Les bus unifiés et les bus d'entrée-sortie== Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus. La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties. [[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]] La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée. [[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]] La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]] ===L'implémentation d'un bus IO dédié avec un multiplexeur d'IO=== Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA. Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point. [[File:IO MUX.png|centre|vignette|upright=2|IO MUX]] [[File:8255.svg|vignette|8255]] Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C. : Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas. Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU. Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture. Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle. Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré. [[File:MOS6526.svg|vignette|MOS 6526.]] Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés. Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure. ===Le contrôleur DMA sur un bus partagé ou avec un répartiteur=== L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''. À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA. [[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]] L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==L'implémentation matérielle de l'espace d'adressage séparé/unifié== Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux. Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur. {|class="wikitable" |- ! ! Espace d'adressage unifié (entrées-sorties mappées en mémoire) ! Espace d'adressage séparé |- ! Bus système | rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé |- ! Bus séparé avec répartiteur |- ! Bus séparé pour les IO | Non, sauf exceptions | Oui, obligatoire |} Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit. ===Les entrées-sorties mappées en mémoire avec un bus système=== Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle. Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique. La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses. [[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]] Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] ===L'espace d'adressage séparé avec un bus système=== Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire. Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur. Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés. [[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]] Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données. [[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]] ===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales=== Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité. La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives. Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes. [[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les méthodes de synchronisation entre processeur et périphériques | prevText=Les méthodes de synchronisation entre processeur et périphériques | next=Les périphériques et les cartes d'extension | nextText=Les périphériques et les cartes d'extension }}{{AutoCat}} </noinclude> 4p0kdlgalnydwvne3bme8psae6pa1e4 764841 764840 2026-04-24T12:42:04Z Mewtow 31375 /* Les entrées-sorties mappées en mémoire avec un bus système */ 764841 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses. ==Rappels : l'espace d'adressage unifié ou séparé== Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques. ===L'espace d’adressage séparé=== Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]] Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. ===Les entrées-sorties mappées en mémoire=== La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple. ==Les bus unifiés et les bus d'entrée-sortie== Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus. La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties. [[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]] La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée. [[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]] La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]] ===L'implémentation d'un bus IO dédié avec un multiplexeur d'IO=== Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA. Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point. [[File:IO MUX.png|centre|vignette|upright=2|IO MUX]] [[File:8255.svg|vignette|8255]] Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C. : Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas. Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU. Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture. Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle. Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré. [[File:MOS6526.svg|vignette|MOS 6526.]] Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés. Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure. ===Le contrôleur DMA sur un bus partagé ou avec un répartiteur=== L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''. À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA. [[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]] L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==L'implémentation matérielle de l'espace d'adressage séparé/unifié== Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux. Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur. {|class="wikitable" |- ! ! Espace d'adressage unifié (entrées-sorties mappées en mémoire) ! Espace d'adressage séparé |- ! Bus système | rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé |- ! Bus séparé avec répartiteur |- ! Bus séparé pour les IO | Non, sauf exceptions | Oui, obligatoire |} Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit. ===Les entrées-sorties mappées en mémoire avec un bus système=== Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle. Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique. La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses. [[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]] Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... {|class="wikitable" |- ! Intervalles d'adresses ! Description ! Taille |- | $0000–$07FF | Mémoire RAM | 2 kibioctets |- | $0800–$0FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $1000–$17FF | Mémoire RAM (miroir) | 2 kibioctets |- | $1800–$1FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $2000 - $3FFF | Registres d’interfaçage de la carte graphique, une copie tous les 8 octets | 8 kibioctets |- | $4000–$401F | Divers |- | $4020–$FFFF | Inoccupé, utilisé par la cartouche de jeu |} ===L'espace d'adressage séparé avec un bus système=== Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire. Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur. Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés. [[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]] Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données. [[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]] ===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales=== Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité. La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives. Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes. [[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les méthodes de synchronisation entre processeur et périphériques | prevText=Les méthodes de synchronisation entre processeur et périphériques | next=Les périphériques et les cartes d'extension | nextText=Les périphériques et les cartes d'extension }}{{AutoCat}} </noinclude> kv55t9bofqazqrqyw5llgvgz6b782zv 764842 764841 2026-04-24T12:45:22Z Mewtow 31375 /* Les entrées-sorties mappées en mémoire avec un bus système */ 764842 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu que les périphériques, leurs registres d’interface et leurs contrôleurs, ont chacun une adresse bien précise. Nous avions vu comment le contrôleur de périphérique adresse les périphériques et comment les contrôleurs de périphériques eux-mêmes ont des adresses. Mais nous n'avons pas vu comment le processeur utilise ces adresses. ==Rappels : l'espace d'adressage unifié ou séparé== Comment s'opère le mélange entre adresses mémoires et adresses de périphérique ? Comment le processeur évite les confusions entre adresses de périphériques et adresses mémoire. Pour cela, il y a plusieurs manières. La plus simple revient à séparer les adresses mémoire et les adresses périphériques, qui ne sont pas transmises sur les mêmes bus. L'autre méthode revient à utiliser un seul ensemble d'adresse, certaines étant allouées à la mémoire, d'autres aux périphériques. Les deux techniques portent des noms assez clairs : l''''espace d'adressage séparé''' pour la première, l''''espace d'adressage unifié''' pour la seconde. Voyons dans le détail ces deux techniques. ===L'espace d’adressage séparé=== Avec la première technique, mémoire et entrées-sorties sont adressées séparément, comme illustré dans le schéma ci-dessous. La mémoire et les entrées-sorties ont chacune un ensemble d'adresse, qui commence à 0 et va jusqu’à une adresse maximale. On dit que la mémoire et les entrées-sorties ont chacune leur propre espace d'adressage. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2|Espaces d'adressages séparés entre mémoire et périphérique.]] Avec cette technique, le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. L'existence de ces instructions séparées permet de faire la différence entre mémoire et périphérique. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. ===Les entrées-sorties mappées en mémoire=== La seconde technique s'appelle l'espace d'adressage unifie, ou encore les '''entrées-sorties mappées en mémoire'''. Avec cette technique, certaines adresses mémoires sont redirigées automatiquement vers les périphériques. Le périphérique se retrouve inclus dans l'ensemble des adresses utilisées pour manipuler la mémoire : on dit qu'il est mappé en mémoire. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] L'avantage de cette méthode est la simplicité pour les programmeurs. Il n'y a pas besoin d'instructions différentes pour accéder aux périphériques et à la mémoire. Tout peut être fait par une seule instruction, qui n'a pas besoin de positionner un quelconque bit IO qui n'existe plus. Le processeur possède donc un nombre plus limité d'instructions machines, et est donc plus simple à fabriquer. Mais surtout, les programmeurs peuvent accéder aux périphériques beaucoup plus simplement, en lisant ou écrivant directement dans certaines adresses associées aux périphériques. Les transferts entre mémoire et périphériques sont fortement simplifiés, par exemple. ==Les bus unifiés et les bus d'entrée-sortie== Maintenant que nous venons de rappeler ce que sont les espaces d'adressage unifiés et séparés, il est temps de voir comment ils sont implémentés en matériel. Et pour cela, nous allons encore une fois faire un rappel sur les bus. Nous avons vu dans les chapitres précédents qu'il existe en gros trois configurations de base pour les bus. La première est celle du '''bus système''', un bus unique qui relie la mémoire RAM, la mémoire ROM, le processeur, et les entrées-sorties. [[File:Bus unique avec entrées mappées en mémoire.png|centre|vignette|upright=2.0|Bus unique avec entrées mappées en mémoire.]] La seconde est celle d'un bus séparé pour les entrées-sorties, appelé le '''bus d'entrée-sortie'''. Il est en théorie possible d'avoir un bus séparé par controleur de périphérique ou entrée-sortie, mais le nombre de broches utilisé devient rapidement important, ce qui fait que cette technique n'est jamais implémentée. [[File:Bus d'entrées-sorties multiplexé.png|centre|vignette|upright=2|Bus entre processeur et contrôleur de périphérique.]] La troisième intercale un '''circuit répartiteur''' entre le processeur et les deux bus. Il s'occupe alors de la gestion des adresses. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus, usage d'un répartiteur]] ===L'implémentation d'un bus IO dédié avec un multiplexeur d'IO=== Les anciens ordinateurs des années 80-90 utilisaient un mélange des techniques 2 et 3 présentées juste au-dessus. Les processeurs avaient un bus d'entrée-sortie séparé des autres, et notamment séparé du bus mémoire. Mais ce bus était connecté à un répartiteur spécialisé dans les IO, qui s'occupait uniquement des entrées-sorties. Les répartiteurs étaient nombreux à l'époque et étaient appelés des circuits de '''''parallel IO''''', bien que ce terme signifie autre chose de nos jours. Les plus connus sont le 8255 d'Intel, le Motorola 6820 PIA (Peripheral Interface Adapter), le WDC 65C21, le MOS Technology 6522 et le MOS Technology CIA. Pour simplifier les explications, le circuit répartiteur sera appelé un '''multiplexeur d'entrées-sorties''' ou encore un IO MUX. En effet, c'est fondamentalement un multiplexeur/démultiplexeur amélioré. Pour simplifier, un IO MUX dispose de plusieurs ports d'entrée-sortie, un pour le processeur et les autres pour les contrôleurs de périphérique. La liaison point à point entre le CPU et l'IOMUX se faisait sur des broches dédiées, regroupées dans le '''port CPU''', ou port ''processeur''. L'IO MUX avait plusieurs '''ports IO''', ou ports d'entrées-sorties, sur lesquels on connectait un contrôleur de périphérique via une liaison point à point. [[File:IO MUX.png|centre|vignette|upright=2|IO MUX]] [[File:8255.svg|vignette|8255]] Un exemple est celui du 8255, qui disposait de trois ports IO et d'un port CPU. Le port CPU est un port de 8 bits, qui correspond aux broches D0 à D7. Les ports IO sont des ports de 8 bits et sont appelés les ports A, B et C. Leurs broches sont respectivement les broches PA0 à PA7 pour le port A, les broches PB0 à PB7 pour le port B, les broches PC0 à PC7 pour le port C. : Le 8255 était plus complexe que ce qui est décrit. Le port C servait soit de port IO proprement dit, soit regroupait les bits de contrôle des ports A et B, à savoir les bits de contrôle pour les interruptions et le ''handshaking''. Le 8255 avait aussi plusieurs modes de fonctionnement où les ports IO étaient configurés différemment, le choix du mode étant fait en configurant un registre de contrôle interne au 8255. Le registre de contrôle était adressé via les lignes 10 et A1 qu'on verra plus bas. Les ports CPU et IO pouvaient fonctionner comme entrée ou sortie et changeaient de rôle suivant la situation, suivant que le CPU pouvait émettre des données en direction d'un périphérique, ou en recevoir. L'IO MUX fonctionnait soit comme un multiplexeur, soit comme un démultiplexeur. Lorsque le processeur envoyait une donnée vers un périphérique, il fonctionnait en démultiplexeur, pour envoyer la donnée vers le bon périphérique, le bon port. En réception, il fonctionnait en multiplexeur et choisissait quel port était connecté au port CPU, quel port envoyait ses données vers le CPU. Le choix entre multiplexage et démultiplexage se faisait selon que le processeur voulait faire une lecture ou une écriture. Le choix entre les deux était donc le fait d'une entrée de l'IO MUX, l'entrée R/W, qui indiquait s'il fallait faire une lecture ou une écriture. Qui dit multiplexage/démultiplexage dit : choisir le port IO à connecter au port CPU. Pour cela, les ports étaient numérotés et le CPU pouvait préciser le numéro du port voulu. Et le numéro du port voulu était présenté sur une entrée dédiée, comme sur un MUX ou DEMUX normal. En soit, ce numéro est équivalent à une adresse de périphérique/port, ce qui fait que cette entrée était en réalité un bus d'adresse, appartenant au port CPU. Sur le 8255, l'envoi de l'adresse se faisait sur les deux broches A0 et A1, qui codaient un numéro de 2 bits. Les valeurs étaient les suivantes : 00 = port A, 01 = port B, 10 = port C, 11 = registre de contrôle. Mais l'IO MUX n'est pas qu'un simple MUX/DEMUX configurable. Il pouvait ''générer des signaux d'interruption''. Quand un périphérique envoyait une donnée à l'IO MUX, il générait un signal d'interruption pour prévenir le processeur qu'une IO a envoyé une donnée. De plus, le répartiteur pouvait ''mettre en attente les données dans des registres'', qui servaient de registres d’interfaçage. Par exemple, une donnée lue sur un port IO était mémorisée dans le répartiteur en attendant que le processeur la récupère. Et inversement, le processeur pouvait envoyer une donnée à un périphérique par l'intermédiaire d'un registre dans le répartiteur. Il écrivait dans ce registre, la donnée était mise en attente dedans en attendant que le périphérique soit libre, et le répartiteur envoyait la donnée quand ce dernier était libéré. [[File:MOS6526.svg|vignette|MOS 6526.]] Il faut noter que les ports IO peuvent être aussi bien série que parallèle. Le 8255 avait trois ports IO de 8 bits, qui sont donc tous les trois des ports parallèles. Mais il a existé des IO MUX disposant de deux ports parallèles et un port série. Tel est le cas du MOS Technology 6522 et de son successeur, le MOS Technology CIA. C'était des IO MUX utilisés dans les ordinateurs Commodore, l'Apple III, et quelques autres ordinateurs anciens renommés. Ils disposaient de deux ports parallèles de 8 bits (PA0-7, PB0-7), chacun ayant 4 lignes de contrôles à leur disposition pour les interruptions, et d'un port série (CB1 et CB2). Le port série était connecté à un registre à décalage de 8 bits, ce qui lui permettait d'envoyer/recevoir un octet à la fois. Ils intégraient aussi des ''timers'' de 16 bits, ainsi qu'une ''Real Time Clock'' pour gérer l'heure. ===Le contrôleur DMA sur un bus partagé ou avec un répartiteur=== L'usage d'un bus dédié a des avantages et des désavantages. L'un des désavantages est lié à l'implémentation du ''Direct Memory Access''. Un bus dédié aux IO marche assez mal avec le DMA. Les échanges entre mémoire RAM et IO doivent passer par le processeur, vu que le bus mémoire est séparé du bus des IO et que le seul point de contact entre les deux est le CPU. En clair : impossible d'utiliser le ''Direct Memory Access''. À l'opposé, un contrôleur DMA est très adapté à un système avec un bus système, un bus partagé entre CPU, RAM et IO. Le controleur DMA est alors connecté au bus et il se réserve l'accès au bus quand il effectue un transfert DMA. [[File:Controleur DMA.png|centre|vignette|upright=2.5|Controleur DMA]] L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==L'implémentation matérielle de l'espace d'adressage séparé/unifié== Intuitivement, on se dit que le bus système va de concert avec un espace d'adressage unifié, avec des entrées-sorties mappées en mémoire. De même, utiliser un bus séparé pour les entrées-sorties va de pair avec des espaces d'adressage séparés. Et dans les grandes lignes, c'est autant vrai que faux. Un bus système peut implémenter les deux solutions d'adressage, tout dépend de comment on gère le décodage d'adresse (voir plus bas). Il en est de même que la solution avec un répartiteur, tout dépend de comment le répartiteur gère l'espace d'adressage. Par contre, deux bus séparés implique forcément un espace d'adressage séparé. Dans le sens inverse, un espace d'adressage séparé peut être réalisé par toutes les configurations, alors que les entrées-sorties mappées en mémoire impliquent forcément un bus système et/ou un répartiteur. {|class="wikitable" |- ! ! Espace d'adressage unifié (entrées-sorties mappées en mémoire) ! Espace d'adressage séparé |- ! Bus système | rowspan="2" colspan="2" | Possible, dépend du décodage d'adresse utilisé |- ! Bus séparé avec répartiteur |- ! Bus séparé pour les IO | Non, sauf exceptions | Oui, obligatoire |} Il est possible d'utiliser des configurations intermédiaires, qui permettent d'implémenter des espaces d'adressages séparés ou unifiés. Mais nous verrons cela dans ce qui suit. ===Les entrées-sorties mappées en mémoire avec un bus système=== Dans son implémentation la plus simple, les entrées-sorties mappées en mémoire utilisent un bus système, un bus unique pour les mémoires et les contrôleurs de périphériques. L'avantage est que cela économise beaucoup de fils, sans compter que le bit IO disparait. Par contre, impossible d'accéder à la fois à la mémoire et à un contrôleur d'entrées-sorties en parallèle. Le principe des entrées-sorties mappées en mémoire est qu'une partie des adresses pointe vers un périphérique, d'autres vers la RAM ou la ROM. L'important est que le bon composant réponde lors d'un accès mémoire/périphérique. Si on accède à une adresse attribuée à la RAM, la RAM doit répondre, les périphériques doivent ignorer l'accès. Et inversement pour un accès périphérique. La redirection vers le bon destinataire est faite par décodage partiel d'adresse. Pour rappel, chaque périphérique/mémoire possède une entrée CS, qui connecte ou déconnecte le composant du bus. Le circuit de décodage d'adresse prend en entrée l'adresse et commande les bits CS pour désactiver les composants non-concernés et activer la destination. Le circuit de décodage partiel d'adresse va ainsi placer le bit CS de la mémoire à 1 pour les adresses invalidées, l’empêchant de répondre à ces adresses. [[File:Décodage d'adresse avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2.0|Décodage d'adresse avec entrées-sorties mappées en mémoire.]] Le principe est de connecter la mémoire et les entrées-sorties sur le bus système. Le bus d'adresse est connecté à la fois sur la mémoire RAM, sur la mémoire ROM, et sur les entrées-sorties (si elles ont une entrée d'adresse). Le bus de données est lui aussi connecté aux mémoires et aux entrée-sorties. Le décodeur d'adresse est lui relié aux entrées CS de tous ces composants. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] Sur quelques consoles/ordinateurs, il est arrivé que le décodage d'adresse soit partiel, à savoir que quelques bits d'adresse étaient ignorés. Le circuit de décodage d'adresse était alors plus simple, moins cher. Le résultat était que des mémoires ou des entrée-sorties étaient dupliquées dans l'espace d'adressage. Un exemple parlant est celui de la console NES. Elle avait 2 kibioctet de RAM, qui apparaissait quatre fois dans l'espace d'adressage, dans les 8 premiers kibioctets (adresses basses). Idem avec les registres d’interfaçage de la carte graphique : il y en avait 1024 copies ! Les registres prenaient 8 octets en tout, mais il y en avait assez de copies pour remplir 8 kibioctets de l'espace d'adressage... C'était totalement inutile, c'était une conséquence d'économie de circuits. {|class="wikitable" |- ! Intervalles d'adresses ! Description ! Taille |- | $0000–$07FF | Mémoire RAM | 2 kibioctets |- | $0800–$0FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $1000–$17FF | Mémoire RAM (miroir) | 2 kibioctets |- | $1800–$1FFF | Mémoire RAM (miroir) | 2 kibioctets |- | $2000 - $3FFF | Registres d’interfaçage de la carte graphique, une copie tous les 8 octets | 8 kibioctets |- | $4000–$401F | Divers |- | $4020–$FFFF | Inoccupé, utilisé par la cartouche de jeu |} ===L'espace d'adressage séparé avec un bus système=== Il est possible d'implémenter l'espace d'adressage séparé sans recourir à des bus séparés. Toutes les configurations de bus possibles sont compatibles avec un espace d'adressage séparé pour les IO, même un bus système unique. Mais comment faire pour l'implémenter avec un bus système ? Là encore, on utilise un système de décodage partiel d'adresse, mais qui est simplifié par rapport à celui des entrée-sorties mappées en mémoire. Le décodage d'adresse part du principe que le bit de poids fort de l'adresse indique si l'adresse est celle d'un périphérique ou d'une mémoire. Le bit de poids fort de l'adresse, appelé le '''bit I/O''', est mis à 0 pour une adresse mémoire, 1 pour un registre d’interfaçage. Tout cela est réalisé par l'instruction adéquate : une instruction d'accès mémoire positionnera ce bit à 0, alors qu'une instruction d'accès IO le positionnera à 1. L'adresse envoyée sur le bus est formée en récupérant l'adresse à lire/écrire et en positionnant le bit I/O à sa bonne valeur. Un défaut de cette solution est qu'elle impose d'avoir deux espaces d'adressage de même taille, un pour la/les mémoires, un autre pour les périphériques. Pas question d'avoir un espace d'adressage plus petit pour les périphériques, alors que ce serait possible avec deux bus séparés. [[File:Bit IO.png|centre|vignette|upright=2|Bit IO.]] Un avantage de cette méthode est qu'elle marche avec des configurations de bus un peu spéciales, qui sont intermédiaire entre des bus séparés et un bus système. Par exemple, il est possible d'avoir un bus d'adresse partagé, mais pas les autres. Ou encore, il est possible de mutualiser le bus d'adresse et de données, en conservant deux bus de commandes, un pour le périphérique et un pour la mémoire. Le bit IO fonctionne avec toutes ces configurations, la seule contrainte est que le bus d'adresse soit partagé. Mais le processeur doit gérer correctement le bus de données et envoyer les données sur le bon bus de données. [[File:Espace d'adressage séparé.png|centre|vignette|upright=2|Espace d'adressage séparé.]] ===Les entrées-sorties mappées en mémoire avec des configurations de bus spéciales=== Il est possible d'implémenter les entrées-sorties mappées en mémoire sans utiliser un bus unique, avec des configurations de bus assez spéciales, dans lesquelles on a bien deux bus séparés, mais qui communiquent entre eux. Elles sont très rares, et nous en parlons ici par pur but d'exhaustivité. La première, de loin la plus simple, consiste à accéder à la RAM d'abord, puis aux périphériques si elle ne répond pas. Une tentative d'accès en RAM fonctionnera du premier coup si l'adresse en question est attribuée à la RAM. Mais si l'adresse est associée à un périphérique, la RAM ne répondra pas et on doit retenter l'accès sur le bus pour les périphériques. L'implémentation est cependant compliquée, sans compter que les performances sont alors réduites, du fait des deux tentatives consécutives. Les autres solutions font communiquer les deux bus pour que la RAM ou les périphériques détectent précocement les accès qui leur sont dédiés. La première solution de ce type consiste à ajouter un dispositif qui transmet les accès du bus mémoire vers le bus des périphériques. Mais le bus pour les périphériques est souvent moins rapide que le bus mémoire et l'adaptation des vitesses pose des problèmes. [[File:Espace d'adressage séparé, implémentation avec deux bus séparés.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les méthodes de synchronisation entre processeur et périphériques | prevText=Les méthodes de synchronisation entre processeur et périphériques | next=Les périphériques et les cartes d'extension | nextText=Les périphériques et les cartes d'extension }}{{AutoCat}} </noinclude> b8tspfzpnumlq43k4d60g8x8n1z22a6 Fonctionnement d'un ordinateur/L'architecture de base d'un ordinateur 0 65780 764837 763642 2026-04-24T12:28:06Z Mewtow 31375 /* Les bus systèmes */ 764837 wikitext text/x-wiki Dans les chapitres précédents, nous avons vu comment représenter de l'information, la traiter et la mémoriser avec des circuits. Mais un ordinateur n'est pas qu'un amoncellement de circuits et est organisé d'une manière bien précise. Il est structuré autour de trois circuits principaux : * un '''processeur''', qui manipule l'information et donne un résultat ; * une '''mémoire''' qui mémorise les données à manipuler ; * les '''entrées/sorties''', qui permettent à l'ordinateur de communiquer avec l'extérieur. [[File:Architecture Von Neumann.png|centre|vignette|upright=2|Architecture d'un système à mémoire.]] Pour faire simple, le processeur est un circuit qui s'occupe de faire des calculs. Rien d'étonnant à cela. Je rappelle que tout est codé par des nombres dans un ordinateur, ce qui fait que manipuler des nombres revient simplement à faire des calculs. Un ordinateur n'est donc qu'une grosse calculatrice améliorée, et le processeur est le composant qui fait les calculs. La mémoire s'occupe purement de la mémorisation des données, des nombres sur lesquelles faire des calculs. Pour être plus précis, il y a deux mémoires : une pour les données proprement dites, une autre pour le programme à exécuter. La première est la '''mémoire RAM''', la seconde est la '''mémoire ROM'''. Nous détaillerons ce que sont ces deux mémoires dans la suite du chapitre, mais sachez que nous avions déjà rencontré ces deux types de mémoires dans les chapitres sur les registres et les mémoires adressables. Les entrées-sorties permettent au processeur et à la mémoire de communiquer avec l'extérieur et d'échanger des informations avec des périphériques. Les '''périphériques''' regroupent, pour rappel, tout ce est branché sur un ordinateur, mais n'est pas à l'intérieur de celui-ci. Le processeur, les mémoires et les entrées-sorties communiquent ensemble via un '''réseau d'interconnexions'''. Le terme est assez barbare, mais rien de compliqué sur le principe. C'est juste un ensemble de fils électriques qui relie les différents éléments d'un ordinateur. Les interconnexions sont souvent appelées le bus de communication, mais le terme est un abus de langage, comme on le verra plus bas. Afin de simplifier les explications, on va supposer que le réseau d'interconnexion est le suivant. Tout est connecté au processeur. Il y a des interconnexions entre le processeur et la mémoire RAM, d'autres interconnexions entre processeur et mémoire ROM, et d'autres entre le processeur et les entrées-sorties. Nous verrons que d'autres réseaux d'interconnexions fusionnent certaines interconnexions, pour les partager entre la ROM et la RAM, par exemple. Mais pour le moment, gardez le schéma ci-dessous en tête. [[File:Réseau d'interconnexion avec un processeur au centre.png|centre|vignette|upright=2|Réseau d'interconnexion avec un processeur au centre]] ==Les mémoires RAM et ROM== La mémoire est le composant qui mémorise des informations, des données. Dans la majorité des cas, la mémoire est composée de plusieurs '''cases mémoire''', chacune mémorisant plusieurs bits, le nombre de bits étant identique pour toutes les cases mémoire. Dans le cas le plus simple, une case mémoire mémorise un '''octet''', un groupe de 8 bits. Mais les mémoires modernes mémorisent plusieurs octets par case mémoire : elles ont des cases mémoires de 16, 32 ou 64 bits, soit respectivement 2/4/8 octets. De rares mémoires assez anciennes utilisaient des cases mémoires contenant 1, 2, 3, 4, 5, 6 7, 13, 17, 23, 36 ou 48 bits. Mais ce n'était pas des mémoires électroniques, aussi nous allons les passer sous silence. Tout ce qu'il faut savoir est que la quasi-totalité des mémoires électronique a un ou plusieurs octets par case mémoire. Pour simplifier, vous pouvez imaginer qu'une mémoire RAM est un regroupement de registre, chacun étant une case mémoire. C'est une description pas trop mauvaise pour décrire les mémoires RAM, qu'on abordera dans ce qui suit. {|class="wikitable" |+ Contenu d'une mémoire, case mémoire de 16 bits (deux octets) |- ! Case mémoire N°1 | 0001 0110 1111 1110 |- ! Case mémoire N°2 | 1111 1110 0110 1111 |- ! Case mémoire N°3 | 0001 0000 0110 0001 |- ! Case mémoire N°4 | 1000 0110 0001 0000 |- ! Case mémoire N°5 | 1100 1010 0110 0001 |- ! ... | ... |- ! Case mémoire N°1023 | 0001 0110 0001 0110 |- ! Case mémoire N°1024 | 0001 0110 0001 0110 |} Dans ce cours, il nous arrivera de partir du principe qu'il y a un octet par case mémoire, par souci de simplification. Mais ce ne sera pas systématique. De plus, il nous arrivera d'utiliser le terme adresse pour parler en réalité de la case mémoire associée, par métonymie. ===La capacité mémoire=== Bien évidemment, une mémoire ne peut stocker qu'une quantité finie de données. Et à ce petit jeu, certaines mémoires s'en sortent mieux que d'autres et peuvent stocker beaucoup plus de données que les autres. La '''capacité''' d'une mémoire correspond à la quantité d'informations que celle-ci peut mémoriser. Plus précisément, il s'agit du nombre maximal de bits qu'une mémoire peut contenir. Elle est le produit entre le nombre de cases mémoire, et la taille en bit d'une case mémoire. Toutes les mémoires actuelles utilisant des cases mémoire d'un ou plusieurs octets, ce qui nous arrange pour compter la capacité d'une mémoire. Au lieu de compter cette capacité en bits, on préfère mesurer la capacité d'une mémoire avec le nombre d'octets qu'elle contient. Mais les mémoires des PC font plusieurs millions ou milliards d'octets. Pour se faciliter la tâche, on utilise des préfixes pour désigner les différentes capacités mémoires. Vous connaissez sûrement ces préfixes : kibioctets, mébioctets et gibioctets, notés respectivement Kio, Mio et Gio. {|class="wikitable" |- !Préfixe!!Capacité mémoire en octets!!Puissance de deux |- ||Kio||1024||2<sup>10</sup> octets |- ||Mio||1 048 576||2<sup>20</sup> octets |- ||Gio||1 073 741 824||2<sup>30</sup> octets |} On peut se demander pourquoi utiliser des puissances de 1024, et ne pas utiliser des puissances un peu plus communes ? Dans la majorité des situations, les électroniciens préfèrent manipuler des puissances de deux pour se faciliter la vie. Par convention, on utilise souvent des puissances de 1024, qui est la puissance de deux la plus proche de 1000. Or, dans le langage courant, kilo, méga et giga sont des multiples de 1000. Quand vous vous pesez sur votre balance et que celle-ci vous indique 58 kilogrammes, cela veut dire que vous pesez 58 000 grammes. De même, un kilomètre est égal à 1000 mètres, et non 1024 mètres. Autrefois, on utilisait les termes kilo, méga et giga à la place de nos kibi, mebi et gibi, par abus de langage. Mais peu de personnes sont au courant de l'existence de ces nouvelles unités, et celles-ci sont rarement utilisées. Et cette confusion permet aux fabricants de disques durs de nous « arnaquer » : Ceux-ci donnent la capacité des disques durs qu'ils vendent en kilo, méga ou giga octets : l’acheteur croit implicitement avoir une capacité exprimée en kibi, mébi ou gibi octets, et se retrouve avec un disque dur qui contient moins de mémoire que prévu. ===Lecture et écriture : mémoires ROM et RWM=== Pour simplifier grandement, on peut grossièrement classer les mémoires en deux types : les ''Read Only Memory'' et les ''Read Write Memory'', aussi appelées mémoires ROM et mémoires RWM. Pour les '''mémoires ROM''', on ne peut pas modifier leur contenu. On peut y récupérer une donnée ou une instruction : on dit qu'on y accède en lecture. Mais on ne peut pas modifier les données qu'elles contiennent. Quant aux '''mémoires RWM''', on peut y accéder en lecture (récupérer une donnée stockée en mémoire), mais aussi en écriture : on peut stocker une donnée dans la mémoire, ou modifier une donnée existante. Tout ordinateur contient au minimum une ROM et une RWM (souvent une mémoire RAM), les deux n'ont pas exactement le même rôle. Pour simplifier, la mémoire ROM mémorise le programme à exécuter, la mémoire RWM stocke des données. Il a existé des ordinateurs où la mémoire RWM était une mémoire magnétique, voire acoustique, mais ce n'est plus le cas de nos jours. Pour les ordinateurs modernes, la mémoire RWM est une mémoire électronique. Pour faire la différence avec ces anciennes mémoires RWM, elle est appelée la '''mémoire RAM'''. Il s'agit d'une mémoire qui stocke temporairement des données que le processeur doit manipuler (on dit qu'elle est volatile). Elle s'efface complètement quand on coupe l'alimentation de l'ordinateur. Outre le programme à exécuter, la mémoire ROM peut mémoriser des constantes, des données qui ne changent pas. Elles ne sont jamais modifiées et gardent la même valeur quoi qu'il se passe lors de l'exécution du programme. En conséquence, elles ne sont jamais accédées en écriture durant l'exécution du programme, ce qui fait que leur place est dans une mémoire ROM. La mémoire RWM est alors destinée aux données temporaires, qui changent ou sont modifiées lors de l'exécution du programme, et qui sont donc manipulées aussi bien en lecture et en écriture. La mémoire RWM mémorise alors les variables du programme à exécuter, qui sont des données que le programme va manipuler. Pour les systèmes les plus simples, la mémoire RWM ne sert à rien de plus. [[File:Espaces d'adressage sur une archi harvard modifiée.png|centre|vignette|upright=2.5|Espaces d'adressage sur une archi harvard modifiée]] Pour donner un exemple de données stockées en ROM, on peut prendre l'exemple des anciennes consoles de jeu 8 et 16 bits. Les jeux vidéos sur ces consoles étaient placés dans des cartouches de jeu, précisément dans une mémoire ROM à l'intérieur de la cartouche de jeu. La ROM mémorisait non seulement le code du jeu, le programme du jeu vidéo, mais aussi les niveaux et les ''sprites'' et autres données graphiques. Une conséquence est que les consoles 8/16 bits n'avaient pas besoin de beaucoup de RAM, comparé aux ordinateurs de l'époque, vu qu'une grande partie des données utiles étaient dans une ROM directement accessible par le processeur. À l'opposé, les micro-ordinateurs devaient copier les données d'un jeu depuis une disquette dans la mémoire RAM, ce qui demandait d'avoir plus de RAM. Le passage au support CD sur les consoles 32 bits a eu la même conséquence. Le processeur ne pouvant pas lire directement le CD à sa guise, il fallait copier les données du CD en RAM. D'où l'apparition de temps de chargement assez longs, inexistants sur support cartouche. ===L'adressage mémoire=== Sur une mémoire RAM ou ROM, on ne peut lire ou écrire qu'une case mémoire, qu'un registre à la fois : une lecture ou écriture ne peut lire ou modifier qu'une seule case mémoire. Techniquement, le processeur doit préciser à quel case mémoire il veut accéder à chaque lecture/écriture. Pour cela, chaque case mémoire se voit attribuer un nombre binaire unique, l''''adresse''', qui va permettre de le sélectionner et de l'identifier celle-ci parmi toutes les autres. En fait, on peut comparer une adresse à un numéro de téléphone (ou à une adresse d'appartement) : chacun de vos correspondants a un numéro de téléphone et vous savez que pour appeler telle personne, vous devez composer tel numéro. Les adresses mémoires en sont l'équivalent pour les cases mémoire. [[File:Adressage mémoire.png|centre|vignette|upright=2|Exemple : on demande à la mémoire de sélectionner la case mémoire d'adresse 1002 et on récupère son contenu (ici, 17).]] L'adresse mémoire est générée par le processeur. Le processeur peut parfaitement calculer des adresses, en extraire du programme qu'il exécute, et bien d'autres choses. Nous détaillerons d'ailleurs les mécanismes pour dans les chapitres portant sur les modes d'adressage du processeur. Mais pour le moment, nous avons juste besoin de savoir que c'est le processeur qui envoie des adresses aux mémoires RAM et ROM. Les adresses générées par le processeur sont alors envoyées à la RAM ou la ROM via une connexion dédiée, un ensemble de fils qui connecte le processeur à la mémoire : le '''bus d'adresse mémoire'''. L'adresse sélectionne une case mémoire, le processeur peut alors récupérer la donnée dedans pour une lecture, écrire une donnée pour l'écriture. Pour cela, un second ensemble de fil connecte le processeur à la RAM/ROM, mais cette fois-ci pour échanger des données. Il s'agit du '''bus de données mémoire'''. Les deux sont souvent regroupés sous le terme de '''bus mémoire'''. Un ordinateur contient toujours une RAM et une ROM, ce qui demande aux bus mémoire de s'adapter à la présence de deux mémoires. Il y a alors deux solutions, illustrées dans les deux schémas ci-dessous. Avec la première, il y a un seul bus mémoire partagé entre la RAM et la ROM, comme illustré ci-dessous. Une autre solution utilise deux bus séparés : un pour la RAM et un autre pour la ROM. Nous verrons les différences pratiques entre les deux à la fin du chapitre. Pour le moment, nous allons partir du principe qu'il y a un bus pour la mémoire ROM, et un autre bus pour la RAM. [[File:CPT-System-Architecture-gapfill1-ANS.svg|centre|vignette|upright=2|Architecture avec une ROM et une RAM.]] [[File:Réseau d'interconnexion avec un processeur au centre.png|centre|vignette|upright=2|Réseau d'interconnexion avec un processeur au centre]] ===L'alignement mémoire : introduction=== Plus haut, nous avions dit qu'il y a une adresse par case mémoire, chaque case mémoire contenant un ou plusieurs octets. Mais les processeurs modernes partent du principe que la mémoire a un octet par adresse, pas plus. Et ce même si la mémoire reliée au processeur utilise des cases mémoires de 2, 3, 4 octets ou plus. D'ailleurs, la majorité des mémoires RAM actuelle a des cases mémoires de 64 bits, soit 8 octets par case mémoire. Les raisons à cela sont multiple, mais nous les verrons en détail dans le chapitre sur l'alignement mémoire. Toujours est-il qu'il faut distinguer les '''adresses mémoire''' et les '''adresses d'octet''' gérées par le processeur. Le processeur génère des adresses d'octet, qui permettent de sélectionner un octet bien précis. L'adresse d'octet permet de sélectionner un octet parmi tous les autres. Mais la mémoire ne comprend pas directement cette adresse d'octet. Heureusement, l'octet en question est dans une case mémoire bien précise, qui a elle-même une adresse mémoire bien précise. L'adresse d'octet est alors convertie en une adresse mémoire, qui sélectionne la case mémoire adéquate, celle qui contient l'octet voulu. La case mémoire entière est lue, puis le processeur ne récupère que les données adéquates. Pour cela, des circuits d'alignement mémoire se chargent de faire la conversion entre adresses du processeur et adresse mémoire. Nous verrons cela dans le détail dans le chapitre sur l'alignement mémoire. Il existe des mémoires qui n'utilisent pas d'adresses mémoire, mais passons : ce sera pour la suite du cours. ==Le processeur== Dans les ordinateurs, l'unité de traitement porte le nom de '''processeur''', ou encore de '''''Central Processing Unit''''', abrévié en CPU. Le rôle principal du processeur est de faire des calculs. La plupart des processeurs actuels supportent au minimum l'addition, la soustraction et la multiplication. Quelques processeurs ne gèrent pas la division, qui est une opération très gourmande en circuit, peu utilisée, très lente. Il arrive que des processeurs très peu performants ne gèrent pas la multiplication, mais c'est assez rare. Un processeur ne fait pas que des calculs. Tout processeur est conçu pour effectuer un nombre limité d'opérations bien précises, comme des calculs, des échanges de données avec la mémoire, etc. Ces opérations sont appelées des '''instructions'''. Les plus intuitives sont les '''instructions arithmétiques''', qui font des calculs, comme l'addition, la soustraction, la multiplication, la division. Mais il y a aussi des '''instructions d'accès mémoire''', qui échangent des données entre la mémoire RAM et le processeur. Les autres instructions ne sont pas très intuitives, aussi passons-les sous silence pour le moment, tout deviendra plus clair dans les chapitres sur le processeur. ===Le processeur exécute un programme, une suite d'instructions=== Tout processeur est conçu pour exécuter une suite d'instructions dans l'ordre demandé, cette suite s'appelant un '''programme'''. Ce que fait le processeur est défini par la suite d'instructions qu'il exécute, par le programme qu'on lui demande de faire. Les instructions sont exécutées dans un ordre bien précis, les unes après les autres. L'ordre en question est décidé par le programmeur. La totalité des logiciels présents sur un ordinateur sont des programmes comme les autres. Le programme à exécuter est stockée dans la mémoire de l'ordinateur. C'est ainsi que l'ordinateur est rendu programmable : modifier le contenu de la mémoire permet de changer le programme exécuté. Mine de rien, cette idée de stocker le programme en mémoire est ce qui a fait que l’informatique est ce qu'elle est aujourd’hui. C'est la définition même d'ordinateur : appareil programmable qui stocke son programme dans une mémoire modifiable. Une instruction est codée comme les données : sous la forme de suites de bits. Telle suite de bit indique qu'il faut faire une addition, telle autre demande de faire une soustraction, etc. Pour simplifier, nous allons supposer qu'il y a une instruction par adresse mémoire. Sur la grosse majorité des ordinateurs, les instructions sont placées les unes à la suite des autres dans l'ordre où elles doivent être exécutées. Un programme informatique n'est donc qu'une vulgaire suite d'instructions stockée quelque part dans la mémoire de l'ordinateur. {|class="wikitable" |+ Exemple de programme informatique |- ! Adresse ! Instruction |- ! 0 | Copier le contenu de l'adresse 0F05 dans le registre numéro 5 |- ! 1 | Charger le contenu de l'adresse 0555 dans le registre numéro 4 |- ! 2 | Additionner ces deux nombres |- ! 3 | Charger le contenu de l'adresse 0555 |- ! 4 | Faire en XOR avec le résultat antérieur |- ! ... | ... |- ! 5464 | Instruction d'arrêt |} Pour exécuter une suite d'instructions dans le bon ordre, le processeur détermine à chaque cycle quelle est la prochaine instruction à exécuter. Pour cela, le processeur mémorise l'adresse de l'instruction en cours dans un registre : le '''Program Counter'''. Je rappelle que des instructions consécutives sont dans des adresses consécutives. Pour passer à la prochaine instruction, il suffit donc d'incrémenter le ''program counter''. : Si une instruction prend plusieurs octets, plusieurs adresses, il suffit de l'incrémenter du nombre d'octets/adresses. D'autres processeurs font autrement : chaque instruction précise l'adresse de la suivante, directement dans la suite de bit représentant l'instruction en mémoire. Ces processeurs n'ont pas besoin de calculer une adresse qui leur est fournie sur un plateau d'argent. Sur des processeurs aussi bizarres, pas besoin de stocker les instructions en mémoire dans l'ordre dans lesquelles elles sont censées être exécutées. Mais ces processeurs sont très très rares et peuvent être considérés comme des exceptions à la règle. Nous venons de voir qu'un processeur contient un registre appelé le ''program counter''. Mais il n'est pas le seul. Pour pouvoir fonctionner, tout processeur doit mémoriser un certain nombre d’informations nécessaires à son fonctionnement, qui sont mémorisées dans des '''registres de contrôle'''. La plupart ont des noms assez barbares (registre d'état, ''program counter'') et nous ne pouvons pas en parler à ce moment du cours. Nous les verrons en temps voulu, mais il est important de préciser qu'ils existent. ===L'intérieur d'un processeur=== Fort de ce que nous savons, nous pouvons expliquer ce qu'il y a à l'intérieur d'un processeur. Le premier point est qu'un processeur fait des calculs, ce qui implique qu'il contient des circuits de calcul. Ils sont regroupés dans une ou plusieurs '''unités de calcul'''. Nous avons déjà vu comment fabriquer une unité de calcul simple, dans un chapitre dédié, et c'est la même qui est présente dans un processeur. Du moins dans les grandes lignes, les circuits des processeurs modernes étant particulièrement optimisés. Il en est de même pour les autres circuits de calcul comme ceux pour les multiplications/division/autres. Si le processeur fait des calculs, qu'en est-il des opérandes ? Et où sont mémorisés les résultats des opérations ? Pour cela, le processeur incorpore des '''registres généraux'''. Les registres généraux servent à mémoriser les opérandes et résultats des instructions. Ils mémorisent des données, contrairement aux registres de contrôle mentionnés plus haut. Le nombre de registres généraux dépend grandement du processeur. Les tout premiers processeurs se débrouillaient avec un seul registre, mais les processeurs actuels utilisent plusieurs registres, pour mémoriser plusieurs opérandes/résultats. Mais la présence de registres est source de pas mal de petites complications. Par exemple, il faut échanger les données entre la RAM et les registres, il faut gérer l'adressage des registres, etc. Il s'agit là de détails que nous expliquerons dans les chapitres sur le processeur. Le processeur contient enfin un circuit pour interpréter les instructions, appelé l''''unité de contrôle'''. Elle lit les instructions depuis la mémoire, interprète la suite de bit associée, et commande le reste du processeur pour qu'il exécute l'instruction. Ses fonctions sont assez variées, mais nous allons simplifier en disant qu'elle configure l'unité de calcul et les registres pour faire le bon calcul. Son rôle est d'analyser la suite de bit qui constitue l'instruction, et d'en déduire quelle opération effectuer. Elle gère aussi l'accès à la mémoire RAM, et notamment ce qui est envoyé sur son bus d'adresse. : Dans ce qui suit, on suppose que le ''program counter'' fait partie de l'unité de contrôle. Pour résumer, un processeur contient une unité de calcul, des registres et une interface avec la mémoire RAM. Le tout est interconnecté, afin de pouvoir échanger des données. L’ensemble forme le '''chemin de données''', nom qui trahit le fait que c'est là que les données se déplacent et sont traitées. Il faut aussi ajouter l'unité de contrôle pour commander le tout. Elle lit les instructions en mémoire, puis commande le chemin de données pour que l'instruction soit exécutée correctement. [[File:Microarchitecture d'un processeur.png|centre|vignette|upright=2|Microarchitecture d'un processeur]] Un processeur parait donc assez simple expliqué comme ça, mais il y a de nombreuses subtilités. L'une d'entre elle est liée aux registres, et notamment à la manière dont on les utilise. Pour expliquer ces subtilités, nous allons voir comment les premiers processeurs fonctionnaient, avant de passer aux processeurs un peu plus modernes. Les tout premiers processeurs n'utilisaient qu'un seul registre, ce qui fait que l'utilisation des registres était très simple. Le passage à plusieurs registres a complexifié le tout. ===D'où viennent les adresses ?=== Il est maintenant temps de répondre à une question qui s'était posée dans la section sur l'adressage : d'où viennent les adresses envoyées à la mémoire ? Pour ce qui est des adresses des instructions, on connait déjà la réponse : c'est le ''program counter'' qui gère tout. Mais pour les données, il y a deux possibilités, qui correspondent à deux types de données : les données statiques et les données dynamiques. Les '''données statiques''' sont les plus simples : elles existent durant toute la durée de vie du programme. Tant que celui-ci s'exécute, il aura besoin de ces données. En conséquence, il leur réserve une place en mémoire, qui est toujours la même. La donnée se situe donc à une adresse bien précise, qui ne change jamais. Attention cependant : les données peuvent être modifiées, changer de valeur. Le programme écrit dans les donnée statiques, c'est même assez fréquent. Ce sont ne sont pas forcément des données constantes ! Pour les données statiques, elles sont toujours placées à la même adresse mémoire. Pour le dire autrement, l'adresse mémoire est une constante, qui ne change pas. L'adresse est connue avant d’exécuter le programme, le programme a été codé pour utiliser cette adresse pour telle donnée, on a réservé une adresse pour la donnée voulue. Et même si vous quittez le programme et vous le relancez plusieurs jours après, l'adresse mémoire sera la même avant et après. Et cela permet d'utiliser l''''adressage direct'''. L'idée est que les instructions précisent donc l'adresse à lire ou écrire. Pour cela, l'adresse est intégrée dans l’instruction elle-même. Pour rappel, l'instruction est codée par une suite de bit en mémoire RAM/ROM, dont certains précisent l'opération à faire, les autres servant à autre chose. L'idée est que certains bits précisent l'adresse mémoire de la donnée à lire. Les instructions sont donc du genre : * ''LOAD 56'' - lit l'adresse numéro 56 et copie son contenu dans un registre; * ''STORE R5 , adress 99'', copie le registre R5 dans l'adresse 99 ; * ''ADD R5 , adress 209'' : additionne le registre R5 avec le contenu de l'adresse 209. S'il existe des données statiques, c'est signe qu'il existe des '''données dynamiques'''. Ces dernières sont des données qui sont créées ou détruites selon les besoins. Pour comprendre d'où viennent ces données dynamiques, prenons le cas d'une personne qui écrit du texte sur un ordinateur. Le texte qu'il écrit est mémorisé dans la RAM de l’ordinateur, puis est sauvegardé sur le disque dur quand il sauvegarde son document. Au fur et à mesure qu'il écrit du texte, la RAM utilisée par ce texte augmente. Donc, ce texte est une donnée dynamique, dont la taille varie dans le temps. Pour gérer des données dynamiques, la plupart des systèmes d'exploitation incorporent des fonctionnalités d''''allocation mémoire'''. Derrière ce nom barbare, se cache quelque chose de simple : les programmes peuvent réclamer de la mémoire au système d'exploitation, pour y placer les données qu'ils souhaitent. Les langages de programmation bas niveau supportent des fonctions comme malloc(), qui permettent de demander un bloc de mémoire de N octets à l'OS, qui doit alors accommoder la demande. De même, un programme peut libérer de la mémoire qu'il n'utilise plus avec des fonctions comme free(). Avec l'allocation mémoire, les données n'ont pas de place fixe en mémoire. Leur adresse mémoire peut varier d'une exécution du programme à l'autre. Pire que ça : les données peuvent être déplacées dans la mémoire RAM, si besoin. En clair : l'adresse est déterminée lors de l'exécution du programme. L'adresse est alors soit calculée, soit lue depuis la mémoire RAM, soit déterminée autrement. Toujours est-il qu'elle se retrouve dans un registre général. Pour gérer ces adresse variables, les processeurs utilisent l''''adressage indirect'''. L'adressage indirect permet d'utiliser une adresse qui est dans un registre de données. L'adresse en question peut être envoyée à la mémoire RAM sans problème, le processeur peut automatiquement connecter le registre adéquat sur le bus d'adresse. Au tout début de l'informatique, les processeurs ne supportaient que l'adressage direct, pas plus. L'adressage indirect n'était tout simplement pas possible. Avec l'adressage direct, l'adresse à lire est extraite directement des instructions, par l'unité de contrôle. Le bus d'adresse de la RAM est alors relié directement à l'unité de contrôle, le bus de données est relié aux registres. [[File:Architecture Harvard avec adressage direct uniquement.png|centre|vignette|upright=2|Architecture Harvard avec adressage direct uniquement]] Mais dès les années 70, l'adressage indirect est apparu, rendant la programmation bien plus simple. Mais cela a demandé quelques adaptation au niveau du processeur. Avec l'adressage indirect, le bus d'adresse est connecté aux registres. Il a donc fallu rajouter un multiplexeur pour que le processeur décide de relier le bus d'adresse soit aux registres, soit à l'unité de contrôle. ===Un ordinateur peut avoir plusieurs processeurs=== La plupart des ordinateurs n'ont qu'un seul processeur, ce qui fait qu'on désigne avec le terme d''''ordinateurs mono-processeur'''. Mais il a existé (et existe encore) des '''ordinateurs multi-processeurs''', avec plusieurs processeurs sur la même carte mère. L'idée était de gagner en performance : deux processeurs permettent de faire deux fois plus de calcul qu'un seul, quatre permettent d'en faire quatre fois plus, etc. C'est très courant sur les supercalculateurs, des ordinateurs très puissants conçus pour du calcul industriel ou scientifique, mais aussi sur les serveurs ! Dans le cas le plus courant, ils utilisent plusieurs processeurs identiques : on utilise deux processeurs Core i3 de même modèle, ou quatre Pentium 3, etc. Pour utiliser plusieurs processeurs, les programmes doivent être adaptés. Pour cela, il y a plusieurs possibilités : * Une première possibilité, assez intuitive, est d’exécuter des programmes différents sur des processeurs différents. Par exemple, on exécute le navigateur web sur un processeur, le lecteur vidéo sur un autre, etc. * La seconde option est de créer des programmes spéciaux, qui utilisent plusieurs processeurs. Ils répartissent les calculs à faire sur les différents processeurs. Un exemple est la lecture d'une vidéo sur le web : un processeur peut télécharger la vidéo pendant le visionnage et bufferiser celle-ci, un autre processeur peut décoder la vidéo, un autre décoder l'audio. De tels programmes restent des suites d'instructions, mais ils sont plus complexes que les programmes normaux, aussi nous les passons sous silence. * La troisième option est d’exécuter le même programme sur les différents processeurs, mais chaque processeur traite son propre ensemble de données. Par exemple, pour un programme de rendu 3D, quatre processeurs peuvent s'occuper chacun d'une portion de l'image. [[File:Architecture de Von Neumann Princeton multi processeurs.svg|centre|vignette|upright=2|Architecture de Von Neumann Princeton multi processeurs]] De nos jours, les ordinateurs grand public les plus utilisés sont dans un cas intermédiaire, ils ne sont ni mono-, ni multi-processeur. Ils n'ont qu'un seul processeur, dans le sens où si on ouvre l'ordinateur et qu'on regarde la carte mère, il n'y a qu'un seul processeur. Mais ce processeur est en réalité assez similaire à un regroupement de plusieurs processeurs dans le même boitier. Il s'agit de '''processeurs multicœurs''', qui contiennent plusieurs cœurs, chaque cœur pouvant exécuter un programme tout seul. La différence entre cœur et processeur est assez difficile à saisir, mais pour simplifier : un cœur est l'ensemble des circuits nécessaires pour exécuter un programme. Chaque cœur dispose de toute la machinerie électronique pour exécuter un programme, à savoir des circuits aux noms barbares comme : un séquenceur d'instruction, des registres, une unité de calcul. Par contre, certains circuits d'un processeur ne sont présents qu'en un seul exemplaire dans un processeur multicœur, comme les circuits de communication avec la mémoire ou les circuits d’interfaçage avec la carte mère. Suivant le nombre de cœurs présents dans notre processeur, celui-ci sera appelé un processeur double-cœur (deux cœurs), quadruple-cœur (4 cœurs), octuple-cœur (8 cœurs), etc. Un processeur double-cœur est équivalent à avoir deux processeurs dans l'ordinateur, un processeur quadruple-cœur est équivalent à avoir quatre processeurs dans l'ordinateur, etc. Ces processeurs sont devenus la norme dans les ordinateurs grand public et les logiciels et systèmes d'exploitation se sont adaptés. ===Les coprocesseurs=== Quelques ordinateurs assez anciens disposaient de '''coprocesseurs''', des processeurs qui complémentaient un processeur principal. Les ordinateurs de ce type avaient un processeur principal, le '''CPU''', qui était secondé par un ou plusieurs coprocesseurs. Sauf exception, le CPU et le coprocesseur exécutent des programmes différents, ils travaillent en parallèle. Les coprocesseurs les plus connus sont les '''coprocesseurs pour le rendu 2D/3D'''. Ils ont eu leur heure de gloire sur les anciennes consoles de jeux vidéo, comme Super Nintendo, la Playstation et autres consoles de cette génération ou antérieure. Ils s'occupaient respectivement de calculer les graphismes des jeux vidéos. De nos jours, ils ont été remplacés par des cartes graphiques, ou des ''Graphic Processing Units'', qui ne sont pas considérées comme des coprocesseurs. Les '''coprocesseurs sonores''' sont une sorte d'ancêtre des cartes son, utilisés sur les anciennes consoles de jeux vidéo, comme La Nintendo 64, la Playstation et autres consoles antérieures. Ils s'occupaient respectivement de calculer tout ce qui a trait au son. Pour donner un exemple, on peut citer la console Neo-géo, qui disposait de deux processeurs travaillant en parallèle : un processeur principal, et un coprocesseur sonore. Le processeur principal était un Motorola 68000, alors que le coprocesseur sonore était un processeur Z80. L'accès aux périphériques est quelque chose sur lequel nous passerons plusieurs chapitres dans ce cours. Mais sachez que l'accès aux périphériques peut demander pas mal de puissance de calculs. Le CPU principal peut faire ce genre de calculs par lui-même, mais il n'est pas rare qu'un '''coprocesseur d'IO''' soit dédié à l'accès aux périphériques. Un exemple assez récent est celui de la console de jeu Nintendo 3DS. Elle disposait d'un processeur principal de type ARM9, d'un coprocesseur pour les divisions qu'on abordera plus bas, et d'un second processeur ARM7. L'ARM 7 était utilisé comme coprocesseur d'I/O, ainsi que pour l'émulation de la console GBA. [[File:Asmp 2.gif|centre|vignette|upright=2|Co-processeur pour l'accès aux entrées-sorties.]] Les '''coprocesseurs arithmétiques''' sont un peu à part des autres. Ils sont spécialisés dans les calculs en virgule flottante. Ils étaient utilisés à une époque où les CPU ne géraient que des calculs entiers (en binaire ou en BCD). Un exemple est le coprocesseur flottant x87, complémentaire des premiers processeurs Intel x86. Il y a eu la même chose sur les processeurs Motorola 68000, avec deux coprocesseurs flottants appelés les Motorola 68881 et les Motorola 68882. Un exemple récent de coprocesseur est celui utilisé sur la console de jeu Nintendo DS. La console utilisait deux processeurs, un ARM9 et un ARM7, qui ne pouvaient pas faire de division entière. Il s'agit pourtant d'opérations importantes dans le cas du rendu 3D, ce qui fait que les concepteurs de la console ont rajouté un coprocesseur spécialisé dans les divisions entières et les racines carrées. Le coprocesseur était adressable directement par le processeur, comme peuvent l'être la RAM ou les périphériques. ==Les entrées-sorties== Tous les circuits vus précédemment traitent des données codées en binaire. Ceci dit, les données ne sortent pas de n'importe où : l'ordinateur contient des composants électroniques qui traduisent des informations venant de l’extérieur en nombres. Ces composants sont ce qu'on appelle des '''entrées'''. Par exemple, le clavier est une entrée : l'électronique du clavier attribue un nombre entier (''scancode'') à une touche, nombre qui sera communiqué à l’ordinateur lors de l'appui d'une touche. Pareil pour la souris : quand vous bougez la souris, celle-ci envoie des informations sur la position ou le mouvement du curseur, informations qui sont codées sous la forme de nombres. La carte son évoquée il y a quelques chapitres est bien sûr une entrée : elle est capable d'enregistrer un son, et de le restituer sous la forme de nombres. S’il y a des entrées, on trouve aussi des '''sorties''', des composants électroniques qui transforment des nombres présents dans l'ordinateur en quelque chose d'utile. Ces sorties effectuent la traduction inverse de celle faite par les entrées : si les entrées convertissent une information en nombre, les sorties font l'inverse : là où les entrées encodent, les sorties décodent. Par exemple, un écran LCD est un circuit de sortie : il reçoit des informations, et les transforme en image affichée à l'écran. Même chose pour une imprimante : elle reçoit des documents texte encodés sous forme de nombres, et permet de les imprimer sur du papier. Et la carte son est aussi une sortie, vu qu'elle transforme les sons d'un fichier audio en tensions destinées à un haut-parleur : c'est à la fois une entrée, et une sortie. Les '''entrées-sorties''' incluent toutes les entrées et sorties, et même certains composants qui sont les deux à la fois. Il s'agit d'un terme générique, qui regroupe des composants forts différents. Dans ce qui va suivre, nous allons parfois parler de périphériques au lieu d'entrées-sorties, mais les deux termes ne sont pas équivalents. Dans le détail, les entrées-sorties regroupent : * Les '''périphériques''' sont les composants connectés sur l'unité centrale. Exemple : les claviers, souris, webcam, imprimantes, écrans, clés USB, disques durs externes, la Box internet, etc. * Les '''cartes d'extension''', qui se connectent sur la carte mère via un connecteur, comme les cartes son ou les cartes graphiques. * D'autres composants sont soudés à la carte mère mais sont techniquement des entrées-sorties : les cartes sons soudées sur les cartes mères actuelles, par exemple. ===L'interface avec le reste de l'ordinateur=== Les entrées-sorties sont très diverses, fonctionnent très différemment les unes des autres. Mais du point de vue du reste de l'ordinateur, les choses sont relativement standardisées. Du point de vue du processeur, les entrées-sorties sont juste des paquets de registres ! Tous les périphériques, toutes les entrées-sorties contiennent des '''registres d’interfaçage''', qui permettent de faire l'intermédiaire entre l'entrée/sortie et le reste de l'ordinateur. L'entrée/sortie est conçu pour réagir automatiquement quand on écrit dans ces registres. [[File:Registres d'interfaçage.png|centre|vignette|upright=2|Registres d'interfaçage.]] Les registres d’interfaçage sont assez variés. Les plus évidents sont les '''registres de données''', qui permettent l'échange de données entre le processeur et les périphériques. Pour échanger des données avec l'entrée/sortie, le processeur a juste à lire ou écrire dans ces registres de données. On trouve généralement un registre de lecture et un registre d'écriture, mais il se peut que les deux soient fusionnés en un seul registre d’interfaçage de données. Si le processeur veut envoyer une donnée à une entrée/sortie, il a juste à écrire dans ces registres. Inversement, s'il veut lire une donnée, il a juste à lire le registre adéquat. Mais le processeur ne fait pas que transmettre des données à l'entrée/sortie. Le processeur lui envoie aussi des « commandes », des valeurs numériques auxquelles l'entrée/sortie répond en effectuant un ensemble d'actions préprogrammées. En clair, ce sont l'équivalent des instructions du processeur, mais pour l'entrée/sortie. Par exemple, les commandes envoyées à une carte graphique peuvent être : affiche l'image présente à cette adresse mémoire, calcule le rendu 3D à partir des données présentes dans ta mémoire, etc. Pour recevoir les commandes, l'entrée/sortie contient des ''registres de commande'' qui mémorisent les commandes envoyées par le processeur. Quand le processeur veut envoyer une commande à l'entrée/sortie, il écrit la commande en question dans ce ou ces registres. Enfin, beaucoup d'entrée/sortie ont un ''registre d'état'', lisible par le processeur, qui contient des informations sur l'état de l'entrée/sortie. Ils servent notamment à indiquer au processeur que l'entrée/sortie est disponible, qu'il est en train d’exécuter une commande, qu'il est occupé, qu'il y a un problème, qu'il y a une erreur de configuration, etc. ===Les adresses des registres d’interfaçage=== Les registres des périphériques sont identifiés par des adresses mémoires. Et les adresses sont conçues de façon à ce que les adresses des différentes entrées/sorties ne se marchent pas sur les pieds. Chaque entrée/sortie, chaque registre, chaque contrôleur a sa propre adresse. D'ordinaire, certains bits de l'adresse indiquent quel est le destinataire. Certains indiquent quel est l'entrée/sortie voulue, les restants indiquant le registre de destination. Il existe deux organisations possibles pour les adresses des registres d’interfaçages. La première possibilité est de séparer les adresses pour les registres d’interfaçage et les adresses pour la mémoire. Le processeur doit avoir des instructions séparées pour gérer les périphériques et adresser la mémoire. Il a des instructions de lecture/écriture pour lire/écrire en mémoire, et d'autres pour lire/écrire les registres d’interfaçage. Sans cela, le processeur ne saurait pas si une adresse est destinée à un périphérique ou à la mémoire. [[File:Espaces d'adressages séparés entre mémoire et périphérique.png|centre|vignette|upright=2.5|Espaces d'adressages séparés entre mémoire et périphérique]] L'autre méthode mélange les adresses mémoire et des entrées-sorties. Si on prend par exemple un processeur de 16 bits, où les adresses font 16 bits, alors les 65536 adresses possibles seront découpées en deux portions : une partie ira adresser la RAM/ROM, l'autre les périphériques. On parle alors d''''entrées-sorties mappées en mémoire'''. L'avantage est que le processeur n'a pas besoin d'avoir des instructions séparées pour les deux. [[File:IO mappées en mémoire.png|centre|vignette|upright=2.0|IO mappées en mémoire]] Pour résumer, communiquer avec une entrée/sortie est similaire à ce qu'on a avec les mémoires. Il suffit de lire ou écrire dans des registres d’interfaçage, qui ont chacun une adresse mémoire. Le problème est que le système d'exploitation ne connaît pas toujours le fonctionnement d'une entrée/sortie : il faut installer un programme qui va s'exécuter quand on souhaite communiquer avec l'entrée/sortie, et qui s'occupera de tout ce qui est nécessaire pour le transfert des données, l'adressage du périphérique, etc. Ce petit programme est appelé un driver ou '''pilote de périphérique'''. La « programmation » périphérique est très simple : il suffit de savoir quoi mettre dans les registres, et c'est le pilote qui s'en charge. ==Les architectures Harvard et Von Neumann== Après avoir vu le processeur, les mémoires et les entrées-sorties, voyons voir comment le tout est interconnecté. Tous les ordinateurs ne sont pas organisés de la même manière, pour ce qui est de leurs bus. Mais pour comprendre pourquoi, nous devons regarder qui communique avec qui, dans un ordinateur. Pour rappel, les données sont placées en mémoire RAM, alors que les instructions sont placées en mémoire ROM. Le processeur lit des instructions dans la mémoire ROM, il lit et écrit dans la mémoire RAM, et accède aux registres d’interfaçage des entrées-sorties. Il y a donc besoins de trois interconnexions : CPU-ROM, CPU-RAM et CPU-IO. [[File:Réseau d'interconnexion avec un processeur au centre.png|centre|vignette|upright=2|Réseau d'interconnexion avec un processeur au centre]] Il parait intéressant d'utiliser trois interconnexions, au minimum CPU-ROM, CPU-RAM et CPU-IO. Néanmoins, faire ainsi a de nombreux désavantages. Déjà, il faut pouvoir brancher tout ça sur le processeur. Et celui-ci n'a pas forcément assez de broches pour. Aussi, il est parfois préférable de mutualiser des bus, à savoir de connecter plusieurs composants sur un même bus. Par exemple, on peut mutualiser le bus pour la mémoire RAM et pour la mémoire ROM. Il faut dire que les deux bus sont des bus mémoire, avec un bus d'adresse, un bus de données, et surtout : des bus de commande similaires. Les mutualiser est alors très simple, et permet d'économiser pas mal de broches. [[File:Réseau d'interconnexion avec un processeur au centre et une architecture Harvard.png|centre|vignette|upright=2|Réseau d'interconnexion avec un processeur au centre et une architecture Harvard]] Cette mutualisation nous amène naturellement à parler de la distinction entre les architectures Harvard d'un côté et les architectures Von Neumann de l'autre. Elle est très liée au fait d'utiliser soit un bus mémoire unique, soit des bus séparés pour la ROM et la RAM. Voyons cela en détail. ===Les architectures Harvard et Von Neumann : des bus séparés ou unifiés=== Avec l''''architecture Harvard''', la mémoire ROM et la mémoire RAM sont reliées au processeur par deux bus séparés. Il y a un bus RAM pour la mémoire RAM, un bus ROM pour la mémoire ROM. L'avantage de cette architecture est qu'elle permet de charger une instruction et une donnée simultanément : une instruction chargée sur le bus relié à la mémoire programme, et une donnée chargée sur le bus relié à la mémoire de données. Et cela simplifie fortement la conception du processeur. [[File:Harvard Architecture.png|centre|vignette|upright=2|Architecture Harvard, avec une ROM et une RAM séparées.]] Avec l''''architecture Von Neumann''', mémoire ROM et mémoire RAM sont reliées au processeur par un bus unique. Le bus unique qui relie processeur, RAM et ROM, s'appelle le '''bus mémoire'''. Un défaut de ces architecture est qu'elles ne peuvent pas charger une instruction et une donnée en même temps. Et cela pose quelques problèmes pour la conception du processeur. Par contre, nous verrons dans ce qui suit qu'utiliser un bus mémoire partagé est bien plus flexible et permet des choses que les architectures Harvard ne peuvent pas faire. [[File:Architecture Von Neumann, avec deux bus séparés.png|centre|vignette|upright=2|Architecture Von Neumann, avec deux bus séparés.]] ===Les architectures Harvard et Von Neumann : des espaces d'adressage séparés ou unifiés=== La distinction précédente se base sur les connexions entre RAM, ROM et processeur. Mais il existe une autre distinction, très liée, qui est souvent utilisée comme seconde définition des architectures Harvard/Von Neumann. Elle est liée aux adresses mémoire que le processeur peut gérer. Prenons un processeur 16 bits, par exemple, qui gère naturellement des adresses de 16 bits. Il peut gérer 2^16 adresses, soit 64 kibioctets de mémoire. L'ensemble de ces adresses est appelé un '''espace d'adressage'''. Mais comment cet espace d'adressage est utilisé pour adresser une RAM et une ROM ? Sur les architectures Harvard, le processeur voit deux mémoires séparées avec leur lot d'adresses distinctes. Une même adresse peut donc correspondre soit à la mémoire ROM, soit à la mémoire RAM, suivant le bus utilisé. L'espace d'adressage est donc doublé, dupliqué, avec un pour la ROM, un autre pour la RAM. Rien d'étonnant à cela : il y a deux bus d'adresses, chacun correspondant à un espace d'adressage. [[File:Vision de la mémoire par un processeur sur une architecture Harvard.png|centre|vignette|upright=2|Vision de la mémoire par un processeur sur une architecture Harvard.]] Avec l'architecture Von Neumann, la RAM et la ROM doivent se partager les adresses mémoires disponibles. Il n'y a qu'un seul espace d'adressage qui est coupé en deux, avec une partie pour la ROM et une autre pour la RAM. Une adresse correspond soit à la mémoire RAM, soit à la mémoire ROM, mais pas aux deux. Typiquement, la mémoire ROM occupe une partie des adresses, la mémoire RAM utilise le reste. La répartition des adresses est réalisée par les circuits de décodage d'adresse mentionnés plus haut. [[File:Vision de la mémoire par un processeur sur une architecture Von Neumann.png|centre|vignette|upright=2|Vision de la mémoire par un processeur sur une architecture Von Neumann.]] Les '''architectures Harvard modifiées''' sont des intermédiaires entre architectures Harvard et architectures Von Neumann, bien qu'elles penchent bien plus du côté des architectures Harvard. Précisons que la terminologie n'est pas claire, beaucoup d'auteurs mettent des définitions différentes derrière ces deux termes. Mais dans ce cours, nous utiliserons une définition très stricte de ce qu'est une architecture Harvard modifiée. Une architecture Harvard modifiée est une architecture Harvard, où le processeur peut lire des données constantes depuis la mémoire ROM. Nous avions vu plus haut que les mémoires ROM peuvent mémoriser, en plus d'un programme exécutable, des données constantes, qui ne varient pas. Les architectures Harvard pures ne permettent pas de lire des données de ce genre depuis la mémoire ROM, alors que les architectures Harvard modifiées le permettent. Une architecture Harvard modifiée dispose d'une instruction pour lire les données en mémoire RWM, et d'une instruction pour lire des données en mémoire ROM. Il y a donc deux versions de l'instruction LOAD, qui copient la donnée dans un registre général, mais dont la source de la donnée est différente. Une autre possibilité, plus rare, est que une instruction de copie, qui copie une constante depuis la mémoire ROM vers la mémoire RAM. Le cas le plus commun est l'utilisation de deux instructions LOAD séparées. [[File:Espaces d'adressage sur une archi harvard modifiée.png|centre|vignette|upright=2.5|Espaces d'adressage sur une archi harvard modifiée]] Ceci étant dit, revenons à la distinction entre architecture Harvard et Von Neumann. Il faut noter que la RAM et la ROM n'ont pas forcément la même taille. Et ce que ce soit sur une architecture Harvard que sur une architecture Von Neumann, mais c'est plus facile à expliquer sur une architecture Harvard. On peut par exemple imaginer une architecture Harvard qui utilise des adresses de 16 bits pour la ROM, et seulement 8 bits pour la RAM. Le résultat est qu'il peut adresser 64 kibioctets de ROM, mais seulement 256 octets de RAM. Les deux bus d'adresse sont alors de taille différente, l'un faisant 8 bits, l'autre 16. Quelques processeurs 8 bits étaient dans ce cas, comme on le verra dans le chapitre sur les CPU 8bits. Mais d'autres processeurs utilisent des valeurs différentes, avec par exemple des adresses de 16 bits pour la RAM, mais de 20 bits pour la ROM, ou inversement. Sur une architecture Von Neumann, tout dépend de comment les adresses sont réparties. La solution la plus simple découpe l'espace d'adressage en deux parties égales, avec la RAM qui est dans la moitié basse (qui part de l'adresse 0 jusqu'à l'adresse au milieu), alors que la ROM est dans la moitié haute (entre l'adresse du milieu et l'adresse maximale). Mais ce n'est pas la seule possibilité, la limite entre RAM et ROM peut être mise n'importe où. Prenons par exemple un processeur 32 bits, capable de gérer 4 milliards d'adresse. Il est parfaitement possible de réserver 128 mébioctets de poids fort à la mémoire ROM, et de laisser le reste à la mémoire RAM. ===Le décodage d'adresse sur les architectures Von Neumann=== Pour résumer, les architectures Harvard et Von Neumann se distinguent sur deux points : * L'accès à la RAM et à la ROM se font par des bus séparés sur l'architecture Harvard, sur le même bus avec l'architecture Von Neumann. * Les adresses pour la mémoire ROM et la mémoire RAM sont séparées sur les architectures Harvard, partagées sur l’architecture Von Neumann. Les architectures Von Neumann utilisent donc un seul bus pour connecter la RAM et la ROM au processeur. Mais cela ne parait pas intuitif : comment deux composants peuvent se connecter aux mêmes fils ? Parce que c'est ce qu'implique le fait de partager un bus. Si je prends une mémoire RAM et une mémoire ROM, toutes deux de 8 bits, elles seront connectées à un bus mémoire de 8 bits. Intuitivement, on se dit qu'il y aura des conflits, du genre : la RAM et la ROM vont accéder au bus en même temps, comment savoir si une adresse est destinée à la RAM ou la ROM, etc ? Tous ces problèmes sont résolus avec une solution très simple : à chaque instant, seule une mémoire est connectée au bus. L'idée est que les mémoires sont connectées ou déconnectées du bus selon les besoins. Si le processeur veut envoyer lire une donnée en mémoire RAM, il déconnecte la mémoire ROM du bus. Et inversement, s'il veut lire une instruction, il déconnecte la RAM et connecte la ROM. Pour cela, les mémoires RAM et ROM possèdent une entrée ''Chip Select'' ou ''Output Enable'', qui agit comme une sorte de bouton ON/OFF. Lorsqu'on met un 1 sur cette entrée, la mémoire se connectera au bus. Ses entrées et sorties fonctionneront normalement, elle pourra recevoir des adresses, envoyer ou recevoir des données, tout sera normal. Par contre, si on met un 0 sur cette entrée, la mémoire se "désactive", ses entrée-sorties ne répondent plus aux sollicitations extérieures. Pire que ça : elles sont électriquement déconnectées. Au total, tout cela demande de gérer deux bit ''Chip Select''/''Output Enable'' : un pour la RAM, un pour la ROM. Et ces deux bits sont configurés pour chaque accès mémoire, pour chaque lecture ou écriture. Pour cela, un circuit de '''décodage d'adresse''' prend en entrée l'adresse mémoire à lire/écrire, et active/désactive les mémoires RAM/ROM selon les besoins. Il prend l'adresse et configure les bits ''Chip Select''/''Output Enable''. [[File:Décodage d'adresse sur une architecture Von Neumann.png|centre|vignette|upright=2|Décodage d'adresse sur une architecture Von Neumann.]] L'implémentation la plus simple réserve la moitié des adresses pour la RAM, l'autre moitié pour la ROM. Typiquement, la ROM prend la moitié basse, la RAM la moitié haute. Dans ce cas, activer/désactiver la RAM et la ROM se fait avec seulement le bit de poids fort de l'adresse. Si le bit de poids fort est à 1, alors on accède à la RAM et la ROM doit être désactivée. Mais si ce bit est à 0, alors on accède à la moitié basse et il faut désactiver la RAM. Une remarque intéressante : le fait de séparer la mémoire en deux parts égales permet de simuler une architecture Harvard à partir d'une architecture Von Neumann. Par exemple, le tout premier processeur d'Intel, le 4004, était l'un de ceux là. La RAM et la ROM sont reliés au même bus, et il y a donc un unique espace d'adressage, qui est séparé en deux parties égales. Le truc est que le processeur traite les deux parties égales comme deux espaces d'adressage séparés. Le processeur se débrouille pour cacher le fait qu'il y a un espace d'adressage unique coupé en deux, ce qui fait que les programmeurs voient bien deux espaces d'adressages distincts. [[File:Décodage d'adresse sur une architecture Von Neumann basique.png|centre|vignette|upright=2|Décodage d'adresse sur une architecture Von Neumann basique.]] Pour résumer, quand une adresse est envoyée sur le bus, les deux mémoires vont la recevoir mais une seule va répondre et se connecter au bus. Le décodage d'adresse garantit que seule la mémoire adéquate réponde à un accès mémoire. Le décodage d'adresse est réalisé par la carte mère, par un composant dédié. Le mécanisme peut être utilisé pour combiner plusieurs RAM en une seule, idem avec les ROM. Pour comprendre l'idée, je vais prendre l'exemple de l'IBM PC, un des tout premier PC existant. Nous étudierons ce PC dans une section dédiée, à la fin du chapitre, aussi je vais passer rapidement dessus. Tout ce que je vais faire est vous présenter la carte mère du PC, et vous demander de faire est de compter les mémoires ROM et mémoires RAM sur la carte mère : [[File:IBM 5150 Motherboard.svg|centre|vignette|upright=3|Carte mère de l'IBM 5150, un modèle de l'IBM PC.]] Si vous remarquerez qu'il y a 5 mémoires ROM et 8 à 32 mémoires RAM. Le fait est que le processeur voit les différentes mémoires ROM comme une seule mémoire ROM. Idem avec les mémoires RAM : elle font chacune 2 kibioctets, et l'ensemble est vu par le processeur comme une seule RAM de 16 à 64 kibioctets. Et cela grâce aux circuits de décodage d'adresse, qui sont situés en haut à droite de la carte mère. Pour comprendre l'idée, prenons l'exemple d'un processeur 16 bits, capable de gérer 64 kibioctets de mémoire. L'espace d'adressage est découpé en quatre portions, de 16 kibioctets chacune. Une portion est réservée à une ROM de 16 kibioctet, les autres sont chacune réservée à une RAM de 16 kibioctet. Le décodage d'adresse sélectionne alors la mémoire adéquate en utilisant les deux bits de poids fort de l'adresse. * S'ils valent 00, alors c'est la mémoire ROM qui est activée, connectée au bus. * S'ils valent 01, alors c'est la première mémoire RAM qui est connectée au bus. * S'ils valent 10, alors c'est la seconde mémoire RAM qui est connectée au bus. * S'ils valent 11, alors c'est la troisième mémoire RAM qui est connectée au bus. [[File:Décodage d'adresse sur une architecture Von Neumann, utilisant plusieurs RAM et une ROM.png|centre|vignette|upright=3|Décodage d'adresse sur une architecture Von Neumann, utilisant plusieurs RAM et une ROM]] ===L'impact sur la conception du processeur=== Plus haut, j'ai parlé d'un des avantages des architectures Harvard : elles peuvent lire une instruction en même temps qu'elles accèdent à une donnée. La donnée est lue/écrite en RAM, alors que l'instruction est lue en ROM. Et cela permet de simplifier l'intérieur du processeur. Pas de beaucoup, mais c'est déjà ça de pris. Voyons maintenant comment cela impacte l'intérieur du processeur. Tout ce dont vous avez à vous rappeler est la séparation entre chemin de données et unité de contrôle, et que les registres généraux sont dans le premier, le ''program counter'' dans la seconde. Avec une architecture Harvard, les instructions et les données passent par des bus différent : bus ROM pour les instructions, bus RAM pour les données. L'intuition nous dit que le bus pour la mémoire ROM est connecté à l'unité de contrôle, alors que le bus pour la RAM est connecté au chemin de données. Et dans les grandes lignes, c'est vrai. La logique est imparable pour ce qui est des bus de données. Mais il y a une petite subtilité pour les bus d'adresse. Pour comprendre comment le processeur exploite ces deux bus, voyons ce qui transite dessus. Pour la mémoire ROM, elle reçoit l'adresse de l'instruction à lire, elle renvoie l'instruction adéquate. Pour cela, le ''program counter'' est envoyé sur le bus d'adresse, l'instruction sur le bus de données. Pour la mémoire RAM, elle échange des données avec les registres généraux, les registres pour les données. Les adresses utilisées pour la RAM viennent elles soit du chemin de données, soit de l'unité de contrôle, tout dépend du mode d'adressage. Mais le ''program counter'' n'est pas impliqué. [[File:Architecture Harvard - échanges de données.png|centre|vignette|upright=2|Architecture Harvard - échanges de données]] Les architectures Harvard modifiées doivent cependant rajouter une connexion entre le bus ROM et les registres généraux. C'est nécessaire pour charger une donnée constante depuis la mémoire ROM. Rappelons que la donnée constante est copiée dans un registre général, donc dans le chemin de données. [[File:Architecture Harvard modifiée - implémentation du processeur.png|centre|vignette|upright=2|Architecture Harvard modifiée - implémentation du processeur]] Avec les architectures Von Neumann, il y a un seul bus qui est relié à la fois au chemin de données et à l'unité de contrôle. Si le processeur lit une instruction, le bus doit être relié à l'unité de contrôle. Par contre, s'il accède à une donnée, il doit être relié au chemin de données (le bus d'adresse peut éventuellement être connecté au séquenceur, si celui-ci fournit l'adresse à lire). Il faut donc utiliser un paquet de multiplexeurs et de démultiplexeurs pour faire la connexion au bon endroit. [[File:Architecture Von Neumann - implémentation du processeur.png|centre|vignette|upright=2|Architecture Von Neumann - implémentation du processeur]] Une instruction se fait en deux temps : on charge l'instruction depuis la mémoire ROM, puis on l'exécute. Avec une architecture Harvard, tout cela se fait en un seul cycle d'horloge, vu que charger la ROM et accéder aux données peut se faire en même temps. Pas avec les architectures Von Neumann, qui doivent libérer le bus mémoire après avoir chargé une instruction. Elles n'ont pas le choix : elles chargent l'instruction lors d'un premier cycle d'horloge, puis l'exécutent lors du second. Pour cela, ils incorporent un registre appelé le '''registre d'instruction''', qui mémorise l'instruction chargée. L'instruction est copiée dans ce registre lors du premier cycle, puis est utilisée lors du second cycle. Le registre permet de ne pas oublier l’instruction entre les deux cycles. Le registre d'instruction est obligatoire sur les architectures Von Neumann. En comparaison, il est facultatif sur les architectures Harvard. Elles peuvent en avoir un, pour des raisons techniques, mais ce n'est pas obligatoire. [[File:Registre d'instruction.png|centre|vignette|upright=2|Registre d'instruction.]] ===Les architectures Von Neumann sont plus flexibles=== Sur les architectures Harvard, le processeur sait faire la distinction entre programme et données. Les données sont stockées dans la mémoire RAM, le programme est stocké dans la mémoire ROM. Les deux sont séparés, accédés par le processeur sur des bus séparés, et c'est ce qui permet de faire la différence entre les deux. Il est impossible que le processeur exécute des données ou modifie le programme. Du moins, tant que la mémoire qui stocke le programme est bien une ROM. Par contre, sur les architectures Von Neumann, il est impossible de distinguer programme et données, sauf en ajoutant des techniques de protection mémoire avancées. La raison est qu'il est impossible de faire la différence entre donnée et instruction, vu que rien ne ressemble plus à une suite de bits qu'une autre suite de bits. Et c'est à l'origine d'un des avantages majeur de l'architecture Von Neumann : il est possible que des programmes soient copiés dans la mémoire RWM et exécutés dans celle-ci. Un cas d'utilisation familier est celui de votre ordinateur personnel. Le système d'exploitation et les autres logiciels sont copiés en mémoire RAM à chaque fois que vous les lancez. Mais cet exemple implique un disque dur, ce qui rend les choses plus compliquées que prévu. Un autre exemple serait la compilation de code à la volée, mais il ne sera pas très parlant. Un exemple plus adapté serait celui où la ROM mémorise un programme compressée dans la mémoire ROM, qui est décompressé pour être exécuté en mémoire RAM. Le programme de décompression est stocké en mémoire ROM et est exécuté au lancement de l’ordinateur. Cette méthode permet d'utiliser une mémoire ROM très petite et très lente, tout en ayant un programme rapide (si la mémoire RWM est rapide). Il est aussi possible de créer des programmes qui modifient leurs propres instructions : cela s'appelle du '''code auto-modifiant'''. Ce genre de choses servait autrefois sur des ordinateurs rudimentaires, au tout début de l'informatique. A l'époque, les adresses à lire/écrire devaient être écrites en dur dans le programme, dans les instructions exécutées. Pour gérer certaines fonctionnalités des langages de programmation qui ont besoin d'adresses modifiables, comme les tableaux, on devait corriger les adresses au besoin avec du code auto-modifiant. De nos jours, le code automodifiant est utilisée occasionnellement pour rendre un programme indétectable dans la mémoire (les virus informatiques utilisent beaucoup ce genre de procédés). L'impossibilité de séparer données et instructions est à l'origine de problèmes assez fâcheux. Il est parfaitement possible que le processeur charge et exécute des données, qu'il prend par erreur pour des instructions. C'est le cas quand des pirates informatiques arrivent à exploiter des bugs. Il arrive que des pirates informatiques vous fournissent des données corrompues, qui contiennent un virus ou un programme malveillant est caché dans les données. Les bugs en question permettent d'exécuter ces données, donc virus. Pour éviter cela, le système d'exploitation peut marquer certaines zones de la mémoire comme non-exécutable, c’est-à-dire que le système d'exploitation interdit d’exécution de quoi que ce soit qui est dans cette zone. Mais ce n'est pas parfait. Toujours est-il que tout cela est impossible sur les architectures Harvard. Et ce serait très limitant. Imaginez : pas possible de lancer un programme depuis le disque dur ou une clé USB, le programme doit impérativement être dans une mémoire ROM, pas de compilation à la volée, etc. Que des techniques très utilisées dans l'informatique moderne. Malgré ses défauts, les architectures Von Neumann ne sont pas les plus utilisées pour rien. Les architectures Harvard sont concrètement utilisées uniquement dans l'informatique embarquée, sur des microcontrôleurs très spécifiques. ==Le bus de communication avec les entrées-sorties== Le processeur, la mémoire et les entrées-sorties sont connectées par un ou plusieurs '''bus de communication'''. Ce bus n'est rien d'autre qu'un ensemble de fils électriques sur lesquels on envoie des zéros ou des uns. Pour communiquer avec la mémoire, il y a trois prérequis qu'un bus doit respecter : pouvoir sélectionner la case mémoire (ou l'entrée-sortie) dont on a besoin, préciser à la mémoire s'il s'agit d'une lecture ou d'une écriture, et enfin pouvoir transférer la donnée. Pour cela, on doit donc avoir trois bus spécialisés, bien distincts, qu'on nommera le bus de commande, le bus d'adresse, et le bus de donnée. * Le '''bus de données''', sur lequel s'échangent les données entre les composants. * Le '''bus de commande''' pour configurer la mémoire et les entrées-sorties. * Le '''bus d'adresse''', facultatif, permet de préciser quelle adresse mémoire il faut lire/écrire. Chaque composant possède des entrées séparées pour le bus d'adresse, le bus de commande et le bus de données. Par exemple, une mémoire RAM possédera des entrées sur lesquelles brancher le bus d'adresse, d'autres sur lesquelles brancher le bus de commande, et des broches d'entrée-sortie pour le bus de données. Précisons cependant que le bus de commande n'est pas exactement le même entre des mémoires RAM/ROM et des entrées-sorties. [[File:Bus general schematic.svg|centre|vignette|upright=2|Contenu d'un bus, généralités.]] ===Le réseau d'interconnexion : généralités=== Reprenons où nous nous étions arrêté. Avant de voir les architectures Harvard et Von Neumann, nous avions dit que le processeur, les mémoires et les entrées-sorties sont reliées entre eux par un réseau d'interconnexion. Nous venons de voir qu'il est possible de mutualiser certains bus, notamment celui de la mémoire RAM et celui de la mémoire ROM. Mais il est possible de faire la même chose pour les entrées-sorties. Là encore, il est possible de regrouper le bus mémoire avec les bus pour les entrées-sorties. Voyons ce que cela implique. {| |[[File:Réseau d'interconnexion avec un processeur au centre.png|centre|vignette|upright=2|Réseau d'interconnexion avec une architecture Harvard.]] |[[File:Réseau d'interconnexion avec un processeur au centre et une architecture Harvard.png|centre|vignette|upright=2|Interconnexions d'une architecture Von Neumann.]] |} Avant de poursuivre, nous devons préciser quelque chose d'important. Sur les ordinateurs modernes, les entrées-sorties peuvent accéder à la mémoire RAM. Les ordinateurs modernes intègrent des techniques de '''''Direct Memory Access''''' (DMA) qui permettent aux entrées-sorties de lire ou d'écrire en mémoire RAM. Les transferts DMA se font sans intervention du processeur. Ils permettent de copier un bloc de plusieurs octets, dans deux sens : de la mémoire RAM vers une entrée-sortie, ou inversement. Le DMA demande d'ajouter un circuit dédié sur la carte mère : le contrôleur DMA. Il effectue la copie d'un paquet d'octets de la RAM vers l'entrée-sortie ou dans l'autre sens. [[File:Réseau d'interconnexion avec un processeur au centre, et direct memory access.png|centre|vignette|upright=2|Réseau d'interconnexion avec un processeur au centre, et direct memory access]] ===Les bus systèmes=== La première solution utilise un bus unique, celui-ci est appelé le '''bus système''', aussi appelé ''backplane bus''. Le bus système est connecté à la mémoire RAM, la mémoire ROM, au processeur, et aux entrées-sorties. Tous les composants présents dans l'ordinateur sont connectés à ce bus, sans exception. De tels bus avaient pour avantage la simplicité. Le processeur n'est connecté qu'à un seul bus, ce qui utilise peu de broches et économise des fils. La mutualisation des bus est totale, le câblage est plus simple, la fabrication aussi. [[File:Architecture minimale d'un ordinateur.png|centre|vignette|upright=2|Architecture minimale d'un ordinateur.]] Un bus système contient un bus d'adresse, de données et de commande. Un bus système se marie bien avec des entrées-sorties mappées en mémoire. La conséquence est que le bus d'adresse ne sert pas que pour l'accès à la mémoire RAM/ROM, mais aussi pour l'accès aux entrées-sorties. Il y a moyen d'implémenter un système d'adresse séparés avec, mais c'est pas l'idéal. [[File:Architecture Von Neumann avec les bus.png|centre|vignette|upright=2|Architecture Von Neumann avec les bus.]] Un bus système n'a pas de limitations quant aux échanges de données. Le processeur peut communiquer directement avec les mémoires et les entrées-sorties, les entrées-sorties peuvent communiquer avec la mémoire RAM, etc. Notamment, un bus système peut implémenter le ''Direct Memory Access''. Il suffit juste de connecter un contrôleur DMA sur le bus système. Le contrôleur DMA est considéré comme une entrée-sortie, ses registres sont mappés en mémoire et sont donc accessibles directement par le processeur. [[File:Bus système avec controleur DMA.png|centre|vignette|upright=2|Bus système avec contrôleur DMA.]] Si on suit la définition à la lettre, un bus système est systématiquement une architecture Von Neumann, vu que la mémoire ROM et la mémoire RAM sont reliées sur le bus système. La conséquence est que les circuits de décodage d'adresse sont présents. Ils sont toujours sur la carte mère, et sont plus ou moins à côté du bus système. Cependant, le décodage d'adresse est parfois étendu pour tenir compte des entrées-sorties. Les entrées-sorties soudées sur la carte mère ont elles aussi des entrées ''Chip Select'' ou quelque chose de similaire. Le décodage d'adresse peut alors les activer ou les désactiver suivant l'adresse envoyée sur le bus d'adresse. C'est ce qui arrive quand le processeur écrit dans un registre d’interfaçage : il envoie l'adresse de ce registre sur le bus d'adresse, le circuit de décodage d'adresse active seulement l'entrée-sortie associée. Il faut noter que ce n'est pas systématique, il existe des techniques pour se passer de décodage d'adresse. Mais nous en reparlerons dans le chapitre sur les bus de communication. [[File:Chipselectfr.png|centre|vignette|upright=1.5|Exemple détaillé.]] Les bus systèmes sont certes très simples, mais ils ont aussi des désavantages. Par exemple, il faut éviter que le processeur et les entrées-sorties se marchent sur les pieds, ils ne peuvent pas utiliser le bus en même temps. De tels conflits d'accès au bus système sont fréquents et ils réduisent la performance, comme on le verra dans le chapitre sur les bus. De plus, un bus système a le fâcheux désavantage de relier des composants allant à des vitesses très différentes : il arrivait fréquemment qu'un composant rapide doive attendre qu'un composant lent libère le bus. Le processeur était le composant le plus touché par ces temps d'attente. Elle était utilisée sur les tout premiers ordinateurs, pour sa simplicité. Elle était parfaitement adaptée aux anciens composants, qui allaient tous à la même vitesse. De nos jours, les ordinateurs à haute performance ne l'utilisent plus trop, mais elle est encore utilisée sur certains systèmes embarqués, en informatique industrielle dans des systèmes très peu puissants. ===Les bus d'entrées-sorties=== Les bus systèmes ont de nombreux problèmes, ce qui fait que d'anciens ordinateurs faisaient autrement. A la place d'un bus système unique, ils utilisent un bus séparé pour les mémoires, et un autre séparé pour les entrées-sorties. Le bus spécialisé pour la mémoire est appelé le '''bus mémoire''', l'autre bus est appelé le '''bus d'entrées-sorties'''. Le bus mémoire est généralement relié à la fois à la mémoire RAM et à la mémoire ROM, les exceptions ne sont pas rares, cependant. [[File:Bus mémoire séparé du bus pour les IO.png|centre|vignette|upright=2|Bus mémoire séparé du bus pour les IO]] Les bus d'entrée-sorties peuvent être spécialisés et simplifiés. Par exemple, ils peuvent avoir un bus de commande différent de celui de la mémoire, qui utilise nettement moins de fils. Le bus d'adresse peut aussi être réduit, et utiliser des adresses plus courtes que celles du bus mémoire. Les bus de données peuvent aussi être de taille différentes. Il est ainsi possible d'avoir un bus mémoire capable de lire/écrire 64 bits à la fois, alors que la communication avec les entrées-sorties se fait octet par octet ! En général, les bus d'entrée-sortie sont assez petits, ils ont une taille de 8 ou 16 bits, même si le bus mémoire est plus grand. Cela permet de ne pas gaspiller trop de broches. Ajouter un bus d'entrée-sortie n'est donc pas très gourmand en broches et en fils. : Il est en théorie possible d'avoir une fréquence différente pour les deux bus, avec un bus mémoire ultra-rapide et un bus pour les entrées-sorties est un bus moins rapide. Mais il faut que le processeur soit prévu pour, et c'est très rare. Niveau performances, le processeur peut théoriquement accéder à la mémoire en attendant qu'une entrée/sortie réponde, mais il faut que le processeur soit prévu pour, et ce n'est pas de la tarte. Par contre, cela implique d'avoir des adresses séparées pour les registres d’interfaçage et la mémoire. En clair : pas d'entrée-sortie mappée en mémoire ! Un autre problème est que les entrées-sorties ne peuvent pas communiquer avec la mémoire directement, elles doivent passer par l'intermédiaire du processeur. En clair : pas de ''Direct Memory Access'' ! Les deux sont des défauts rédhibitoires pour les programmeurs système, notamment pour ceux qui codent les pilotes de périphériques. Pour résumer, les défauts sont assez problématiques : pas d'entrées-sorties mappées en mémoire, pas de ''Direct Memory Access'', économie de broches limitée. Les deux premiers sont des défauts majeurs, qui font que de tels bus ne sont pas utilisés dans les ordinateurs modernes. A la place, ils utilisent une troisième solution, distincte des bus systèmes et des bus d'entrée-sorties. ===Les bus avec répartiteur=== Il existe une méthode intermédiaire, qui garde deux bus séparés pour la mémoire et les entrées-sorties, mais élimine les problèmes de brochage sur le processeur. L'idée est d'intercaler, entre le processeur et les deux bus, un '''circuit répartiteur'''. Il récupère tous les accès et distribue ceux-ci soit sur le bus mémoire, soit sur le bus des périphériques. Le ou les répartiteurs s'appellent aussi le '''''chipset''''' de la carte mère. C'était ce qui était fait à l'époque des premiers Pentium. À l'époque, la puce de gestion du bus PCI faisait office de répartiteur. Elle mémorisait des plages mémoires entières, certaines étant attribuées à la RAM, les autres aux périphériques mappés en mémoire. Elles utilisaient ces plages pour faire la répartition. [[File:IO mappées en mémoire avec séparation des bus.png|centre|vignette|upright=2|IO mappées en mémoire avec séparation des bus]] Niveau adresses des registres d'interfacage, il est possible d'avoir soit des adresses unifiées avec les adresses mémoire, soit des adresses séparées. L'usage d'un répartiteur ne pose pas de problèmes particuliers pour implémenter le DMA. La seule contrainte est que le contrôleur DMA soit intégré dans le répartiteur. Les échanges entre IO et mémoire passent par le répartiteur, qui fait le pont entre bus mémoire et bus des IO. [[File:Implémentation du DMA avec un répartiteur.png|centre|vignette|upright=2|Implémentation du DMA avec un répartiteur]] ==Les microcontrôleurs et ''system on chip''== Parfois, on décide de regrouper la mémoire, les bus, le CPU et les ports d'entrée-sortie dans un seul circuit intégré, un seul boitier. L'ensemble forme alors ce qu'on appelle un '''''System on Chip''''' (système sur une puce), abrévié en SoC. Le nom est assez explicite : un SoC comprend un système informatique complet sur une seule puce de silicium, microprocesseurs, mémoires et périphériques inclus. Ils incorporent aussi des ''timers'', des compteurs, et autres circuits très utiles. [[File:ARMSoCBlockDiagram.svg|centre|vignette|upright=2|SoC basé sur un processeur ARM, avec des entrées-sorties typiques de celles d'un µ-contrôleur. Le support du bus CAN, d'Ethernet, du bus SPI, d'un circuit de PWM (génération de signaux spécifiques), de convertisseurs analogique-digital et inverse, sont typiques des µ-contrôleurs.]] Le terme SoC regroupe des circuits imprimés assez variés, aux usages foncièrement différents et à la conception distincte. Les plus simples d’entre eux sont des microcontrôleurs, qui sont utilisés pour des applications à base performance. Les plus complexes sont utilisés pour des applications qui demandent plus de puissance, nous les appellerons SoC haute performance. La relation entre SoC et microcontrôleurs est assez compliquée à expliquer, la terminologie n'est pas clairement établie. Il existe quelques cours/livres qui séparent les deux, d'autres qui pensent que les deux sont très liés. Dans ce cours, nous allons partir du principe que tous les systèmes qui regroupent processeur, mémoire et quelques périphériques/entrées-sorties sont des SoC. Les microcontrôleurs sont donc un cas particulier de SoC, en suivant cette définition. ===Les microcontrôleurs=== Les '''microcontrôleurs''' sont des composants utilisés dans l'embarqué ou d'informatique industrielle. Leur nom trahit leur rôle. Ils sont utilisés pour contrôler de l'électroménager, des chaines de fabrication dans une usine, des applications robotiques, les alarmes domestiques, les voitures. De manière générale, on les trouve dans tous les systèmes dits embarqués et/ou temps réel. Ils ont besoin de s'interconnecter à un grand nombre de composants et intègrent pour cela un grand nombre d'entrée-sorties. Les microcontrôleurs sont généralement peu puissants, et doivent consommer peu d'énergie/électricité. [[File:Microcontroller 8051.gif|centre|vignette|upright=2.5|Microcontrôleur Intel 8051.]] Un microcontrôleur tend à intégrer des entrées-sorties assez spécifiques, qu'on ne retrouve pas dans les SoC destinés au grand public. Un microcontrôleur est typiquement relié à un paquet de senseurs et son rôle est de commander des moteurs ou d'autres composants. Et les entrées-sorties intégrées sont adaptées à cette tâche. Par exemple, ils tendent à intégrer de nombreux convertisseurs numériques-analogiques pour gérer des senseurs. Ils intègrent aussi des circuits de génération de signaux PWM spécialisés pour commander des moteurs, le processeur peut gérer des calculs trigonométriques (utiles pour commander la rotation d'un moteur), etc. Fait amusant, on en trouve dans certains périphériques informatiques. Par exemple, les anciens disques durs intégraient un microcontrôleur qui contrôlait plusieurs moteurs/ Les moteurs pour faire tourner les plateaux magnétiques et les moteurs pour déplacer les têtes de lecture/écriture étaient commandés par ce microcontrôleur. Comme autre exemple, les claviers d'ordinateurs intègrent un microcontrôleur connecté aux touches, qui détecte quand les touches sont appuyées et qui communique avec l'ordinateur. Nous détaillerons ces deux exemples dans les chapitres dédiés aux périphériques et aux disques durs, tout deviendra plus clair à ce moment là. La majorité des périphériques ou des composants internes à un ordinateur contiennent des microcontrôleurs. ===Les SoC haute performance=== Les SoC les plus performants sont actuellement utilisés dans les téléphones mobiles, tablettes, ''Netbook'', ''smartphones'', ou tout appareil informatique grand public qui ne doit pas prendre beaucoup de place. La petite taille de ces appareils fait qu'ils gagnent à regrouper toute leur électronique dans un circuit imprimé unique. Mais les contraintes font qu'ils doivent être assez puissants. Ils incorporent des processeurs assez puissants, surtout ceux des ''smartphones''. C'est absolument nécessaire pour faire tourner le système d'exploitation du téléphone et les applications installées dessus. Niveau entrées-sorties, ils incorporent souvent des interfaces WIFI et cellulaires (4G/5G), des ports USB, des ports audio, et même des cartes graphiques pour les plus puissants d'entre eux. Les SoC incorporent des cartes graphiques pour gérer tout ce qui a trait à l'écran LCD/OLED, mais aussi pour gérer la caméra, voire le visionnage de vidéo (avec des décodeurs/encodeurs matériel). Par exemple, les SoC Tegra de NVIDIA incorporent une carte graphique, avec des interfaces HDMI et VGA, avec des décodeurs vidéo matériel H.264 & VC-1 gérant le 720p. Pour résumer, les périphériques sont adaptés à leur utilisation et sont donc foncièrement différents de ceux des microcontrôleurs. [[File:Phone hardware.png|centre|vignette|upright=2|Hardware d'un téléphone. On voit qu'il est centré autour d'un SoC, complété par de la RAM, un disque dur de faible capacité, de quoi gérer les entrées utilisateurs (l'écran tactile, les boutons), et un modem pour les émissions téléphoniques/2G/3G/4G/5G.]] Un point important est que les processeurs d'un SoC haute performance sont... performants. Ils sont le plus souvent des processeurs de marque ARM, qui sont différents de ceux utilisés dans les PC fixe/portables grand public qui sont eux de type x86. Nous verrons dans quelques chapitres en quoi consistent ces différences, quand nous parlerons des jeux d'instruction du processeur. Autrefois réservé au monde des PCs, les processeurs multicœurs deviennent de plus en plus fréquents pour les SoC de haute performance. Il n'est pas rare qu'un SoC incorpore plusieurs cœurs. Il arrive même qu'ils soient foncièrement différents, avec plusieurs cœurs d'architecture différente. La frontière entre SoC haute performance et microcontrôleur est de plus en plus floue. De nombreux appareils du quotidien intègrent des SoC haute performance, d'autres des microcontrôleurs. Par exemple, les lecteurs CD/DVD/BR et certains trackers GPS intègrent un SoC ou des processeurs dont la performance est assez pêchue. À l'opposé, les systèmes domotiques intègrent souvent des microcontrôleurs simples. Malgré tout, les deux cas d'utilisation font que le SoC/microcontrôleur est connecté à un grand nombre d'entrées-sorties très divers, comme des capteurs, des écrans, des LEDs, etc. [[File:GPS tracker Hardware Architecture.png|centre|vignette|upright=2|Hardware d'un tracker GPS.]] ==Étude de quelques exemples d'architectures== Après avoir vu la théorie, nous allons voir des exemples réels d'ordinateurs. Dans ce qui suit, nous allons voir des ordinateurs assez anciens, pour une raison simple : ils collent assez bien à l''''architecture de base''' vue plus haut, avec un CPU, une RAM et une ROM, quelques entrées-sorties. Tous les ordinateurs modernes, mais aussi dans les smartphones, les consoles de jeu et autres, utilisent une architecture grandement modifiée et améliorée, avec un grand nombre de périphériques, disques durs/SSD, un grand nombre de mémoires différentes, etc. Il pourrait sembler pertinent d’étudier des microcontrôleurs ou des ''System On Chip'', en premier lieu. Mais nous éviterons soigneusement de tels systèmes pour le moment. La raison est qu'ils ont un grand nombre d'entrées-sorties, qui sont peu familières. Attendez-vous à avoir près d'une vingtaine ou centaine d'entrée-sorties différentes pour de tels systèmes. Le tout est très complexe, bien trop pour un premier exemple. A la place, nous allons voir précisément des exemples plus simples : les premiers PC, et des consoles de jeu 8 et 16 bits. Bien que ce soit des systèmes très simples, ils sont cependant plus complexes que l'architecture de base. Et leur avantages/désavantages sont un peu inverse l'un de l'autre. Si on devait résumer les différences, on aurait ceci : * Les PC ont plus d'entrées-sorties que les consoles, bien que nettement moins que pour les microcontrôleurs/SoC. * Les PC utilisent des disques durs, les consoles font avec soit des cartouches de jeu, soit des CD/DVD. * Les PC utilisent des cartes électroniques séparées pour le son et l'écran, les consoles utilisent des circuits soudés sur la carte mère, qui sont souvent des co-processeurs. * Les PC ont une mémoire ROM soudées sur la carte mère, les consoles 8 bits font sans. Les PC et micro-ordinateurs ont plus d'entrées-sorties que les consoles. Même si on mets de côté les périphériques, ils ont aussi beaucoup de composants soudées sur la carte mère. En comparaison, les consoles de jeu 8/16 bits se débrouillent avec : une cartouche de jeu et une manette en entrée, une sortie vidéo et une sortie son. Un autre point important est l'absence de disque dur ou de lecteur CD. La présence d'un disque dur ou d'un lecteur CD/DVD complexifie tout de suite l'architecture des PC. Il faut leur réserver un bus dédié ou les connecter à un bus système, cela demande d'ajouter des circuits sur la carte mère, etc. Et surtout, il faut expliquer comment l'ordinateur exécute des programmes, ce qui demande de parler de l'interaction avec le disque dur et la ROM du BIOS. Rien de tout cela sur les consoles de jeu 8 et 16 bits. Elles utilisent à la place des cartouches de jeu, qui intègrent une mémoire ROM, pour mémoriser les données du jeu, voire son code. Pas besoin de parler des mémoires de stockage, on est beaucoup plus proche de l'architecture de base avec une ROM unique. Par contre, n'allez pas croire que tout est rose avec les consoles 8/16 bits. Il y a quelques différences qui font qu'elles sont plus complexes qu'un PC sur certains points. Les PC utilisent des cartes électroniques à brancher sur la carte mère pour alimenter l'écran et les hauts-parleurs/casques, alors que les consoles de jeu utilisent des souvent co-processeurs dédiés pour le son et les graphismes. La différence parait mineure, mais elle avantage les consoles. Nous avons déjà expliqué ce que sont les co-processeurs plus haut, aussi les co-processeurs des consoles nous paraitrons familiers. On n'a pas à s’embêter à expliquer ce que sont les cartes d'extension, les bus associés et tout ce qui va avec, cela peut être retardé pour la section sur l'architecture des PC. La gestion de la cartouche de jeu est aussi un peu subtile à comprendre, bien que ce soit bien plus simple à comprendre qu'un système avec un disque dur. Les cartouches de jeu intègrent une mémoire ROM, pour mémoriser les données du jeu, voire son code. Et le processeur doit exécuter le code depuis cette mémoire ROM. La conséquence est que les consoles 8/16 bits utilisent une architecture Harvard, avec un bus relié à la cartouche pour lire les instructions. Mais si ce n'était que ça... Les cartouches mémorisent aussi les données pour les graphismes, ce qui fait que le co-processeur vidéo doit lui aussi lire la cartouche pour récupérer ces données... ===L'architecture de la TurboGraphX-16=== La console PC Engine, aussi appelée TurboGraphX, est une ancienne console 8 bits. Elle contient un processeur 65C02, 8 kibioctets de RAM, un port manettes, une carte son et une carte vidéo. La '''carte son''' est le composant qui s'occupe de commander les haut-parleurs et de gérer tout ce qui a rapport au son. La '''carte graphique''' est le composant qui est en charge de calculer les graphismes, tout ce qui s'affiche à l'écran. Sur cette console, les cartes son et graphique ne sont PAS des co-processeurs, ce sont des circuits électroniques dits fixes. C'est totalement différent de ce qu'on a sur les consoles modernes, aussi le préciser est important. Bien que la carte graphique ne soit pas un processeur, elle a 64 kibioctets de RAM rien que pour elle. La RAM en question est séparée de la RAM normale, c'est un circuit intégré séparé. Et c'est un cas très fréquent, qui reviendra par la suite. La majeure partie des cartes graphiques dispose de leur propre '''mémoire vidéo''', totalement réservée à la carte graphique. La RAM vidéo est connectée à la carte graphique via un bus séparé. Le processeur est souvent connecté à ce bus, afin de pouvoir écrire des données dedans, mais ce n'est pas le cas ici. [[File:Architecture de la PC Engine, aussi appelée TurboGrafx-16.png|centre|vignette|upright=2.5|Architecture de la PC Engine, aussi appelée TurboGrafx-16]] L'architecture de la console était particulièrement simple. Le processeur était le centre de l'architecture, tout était connecté dessus. Il y a un bus pour la cartouche de jeu, un autre pour la RAM, un autre pour les manettes, un autre pour carte son, et un dernier pour la carte graphique. Le fait d'avoir un bus par composant est assez rare et ce n'est le cas ici que parce des conditions particulières sont remplies. Déjà, il y a peu d'entrée-sorties. Ensuite, les bus font tous 8 bits, vu que le processeur est un CPU 8 bits. Avec 5 connexions de 8 bits, le tout utilise 40 broches, ce qui est beaucoup, mais totalement gérable. Par contre, les choses changerons pour les autres consoles. Au final, l'organisation des bus peut s'expliquer avec ce qu'on a vu dans la section sur les bus de communication. La console utilise une architecture Harvard, car la ROM et la RAM utilisent des bus différents. De plus, il y a des bus dédiés aux entrées-sorties, séparés des bus mémoire. Enfin, la carte graphique a droit à ses propres bus pour lire dans la cartouche et dans sa RAM vidéo dédiée. ===L'architecture de la console de jeu NES=== Maintenant, nous allons voir la console de Jeu Famicom, aussi appelée la NES en occident. Elle a une architecture centrée sur un processeur Ricoh 2A03, similaire au processeur 6502, un ancien processeur autrefois très utilisé et très populaire. Le processeur est associé à 2 KB de mémoire RAM. Sur certaines cartouches, on trouve une RAM utilisée pour les sauvegardes, qui est adressée par le processeur directement. Première variation par rapport à l'architecture de la console précédente : l'ajout de la RAM pour les sauvegardes dans les cartouches. Niveau carte graphique, une différence importante est que la carte graphique est connectée à la cartouche de jeu via un autre bus, afin de pouvoir lire les sprites et textures du jeu dans la cartouche. [[File:Architecture de la NES.png|centre|vignette|upright=2.5|Architecture de la NES]] La différence avec l'architecture précédente est que des bus ont été fusionnés. Comme dit plus haut, le système utilise une architecture Harvard, vu que la ROM est dans la cartouche, alors que la RAM est soudée à la carte mère. Par contre, la Famicon utilise un bus dédié aux entrées-sorties. Il est utilisé pour la carte son et la carte graphique, seules les manettes sont sur un bus à part. Ce qui fait qu'on devrait plutôt parler de bus de sorties, mais passons... L'essentiel est qu'on n'est plus tout à fait dans le cas de la console précédente, avec un bus par composant. ===L'architecture de la SNES=== L'architecture de la SNES est illustrée ci-dessous. Les changements pour le processeur et la RAM sont mineurs.La RAM a augmenté en taille et passe à 128 KB. Pareil pour la RAM de la carte vidéo, qui passe à 64 KB. Par contre, on remarque un changement complet au niveau des bus, de la carte graphique et de la carte son. [[File:Architecture de la SNES.png|centre|vignette|upright=2|Architecture de la SNES]] La console utilise un '''bus système unique''', sur lequel tout est connecté : ROM, RAM, entrées-sorties, etc. La seule exception est pour les manettes, qui sont encore connectées directement sur le processeur, via un bus séparé. La transition vers un bus système s'explique par le fait que la console est maintenant de 16 bits, ce qui fait que les bus doivent être plus larges. Le processeur adresse des mémoires RAM et ROM plus grandes, ce qui double la taille de leurs bus. De plus, les entrées-sorties aussi ont besoin d'un bus plus large. Le processeur n'ayant pas un nombre illimité de broches, la seule solution est de fusionner les bus en un seul bus système. Un autre changement est que la carte graphique est maintenant composée de deux circuits séparés. Encore une fois, il ne s'agit pas de coprocesseurs, mais de circuits non-programmables. Par contre, la carte son est remplacée par deux coprocesseurs audio ! De plus, les deux processeurs sont connectés à une mémoire RAM dédiée de 64 KB, comme pour la carte graphique. L'un est un processeur 8 bits (le DSP), l'autre est un processeur 16 bits. Un point très intéressant : certains jeux intégraient des coprocesseurs dans leurs cartouches de jeu ! Par exemple, les cartouches de Starfox et de Super Mario 2 contenait un coprocesseur Super FX, qui gérait des calculs de rendu 2D/3D. Le Cx4 faisait plus ou moins la même chose, il était spécialisé dans les calculs trigonométriques, et diverses opérations de rendu 2D/3D. En tout, il y a environ 16 coprocesseurs d'utiliser et on en trouve facilement la liste sur le net. La console était conçue pour, des pins sur les ports cartouches étaient prévues pour des fonctionnalités de cartouche annexes, dont ces coprocesseurs. Ces pins connectaient le coprocesseur au bus des entrées-sorties. Les coprocesseurs des cartouches de NES avaient souvent de la mémoire rien que pour eux, qui était intégrée dans la cartouche. ===L'architecture de la Megadrive et de la néo-géo=== Passons maintenant à la console de jeu Megadrive, une console 16 bits. Elle a une architecture similaire à celle de la néo-géo, une autre console bien plus puissante, sorti à peu près en même temps. Elles intègrent deux processeurs : un Motorola 68000 qui sert de processeur principal, un Z80 qui sert de processeur dédié à l'audio. Le Z80 et le Motorola 68000 étaient deux processeurs très populaires à l'époque. Le Z80 est une sorte de version améliorée de l'Intel 8088 utilisé sur les anciens PC et de nombreuses consoles utilisaient des Z80 comme processeur principal. Il était familier pour les programmeurs de l'époque, pour son cout réduit, sa bonne disponibilité, et bien d'autres avantages liés à sa production de masse. Le Z80 est utilisé comme co-processeur audio. Il commande un synthétiseur sonore, et est relié à sa propre mémoire, distincte de la mémoire principale. Le MC68000 est le processeur principal et a une relation maitre-esclave avec le Z80 : le MC68000 envoie des commandes au Z80, mais la communication ne va pas dans l'autre sens. Le Motorola 68000 était un processeur 16 bits, alors que le Z80 est un processeur 8 bits. Et cette différence fait que l'on ne peut pas connecter directement les deux sur le même bus, ou du moins pas facilement. La solution retenue est d'utiliser deux bus séparés : un bus de 16 bits connecté au 68000, un bus de 8 bits connecté au Z80. Le premier bus est un bus système sur lequel est connecté le 68000, 64 kibioctets de RAM, la cartouche de jeu, et la carte graphique. Le second bus est un bus de 8 bits, plus court, relié au Z80, à un synthétiseur sonore, et 8 kibioctets de RAM Les deux bus sont connectés à un '''''chipset''''', un circuit répartiteur, qui fait le pont entre les deux bus. Les manettes sont connectées sur le ''chipset''. Il contient un registre de 8 bits, dans lequel le MC68000 peut écrire dedans à sa guise, le registre étant adressable par le processeur. Lorsque le MC68000 écrit une valeur dedans, cela déclenche l’exécution automatique d'un programme pré-déterminé sur le Z80. : Pour ceux qui savent ce qu'est une interruption, les valeurs écrites dans ce registre sont des numéros d'interruption, qui indiquent quelle routine d'interruption exécuter. [[File:Architecture de la Megadrive et de la Néogeo.png|centre|vignette|upright=2.5|Architecture de la Megadrive et de la Néogeo]] Cet exemple nous montre que les bus systèmes sont certes très simples, mais aussi inflexibles. Ils fonctionnent bien quand les composants branchés dessus sont tous des composants 8 bits, ou sont tous de 16 bits, ou tous 32 bits. Mais dès qu'on mélange composants 8, 16, 32 ou 64 bits, les choses deviennent plus compliquées. Il est alors préférable d'utiliser des bus séparés, avec des répartiteurs pour faire le pont entre les différents bus. Et nous verrons que le problème s'est posé lui aussi sur les PC. ===L'architecture des anciennes consoles Playstation : beaucoup de co-processeurs=== Les consoles que nous venons d'aborder étaient des consoles 8 ou 16 bits. A partir des consoles 32 bits, leur architecture s'est rapprochée de celle des PC, avec un usage plus complexes de répartiteurs. La XBOX était très semblable à un PC : le processeur était un Pentium 3 modifié, la carte graphique était une Geforce 3 modifiée, les 64 mébioctets de RAM était la même mémoire DDR que celle des PC, le répartiteur secondaire était un ''chipset'' nForce de NVIDIA, etc. Mais les Playstation 1, 2 et 3 se distinguent de leur contemporains. Elles disposent de très nombreux co-processeurs, qui sont en plus très variés. La Playstation 1 a été une des premières console à utiliser les CD-ROM comme support de stockage, en remplacement des cartouches. La conséquence est que la console contient une mémoire ROM, soudée à la carte mère, de 512 kibioctets. Elle contient aussi 2 mébioctets de RAM, une carte graphique avec 1 mébioctet de mémoire vidéo, un processeur, et de quoi gérer les périphériques. Il y a un co-processeur audio spécialisé, avec 512 kibioctets de RAM, ce qui nous est familier. Par contre, les autres co-processeurs ne le sont pas. Déjà, le lecteur de CD-ROM est associé à des circuits sur la carte mère, il y a tout un sous-système dédié au lecteur de CD. Il y a un contrôleur qui sert d'interface avec le lecteur proprement dit, mais aussi deux co-processeurs audio et 32 kibioctets de RAM. Les co-processeurs audio servent à lire des CD sans trop utiliser le second co-processeur audio, ils lui servent de complément. Ensuite, le processeur incorpore plusieurs cœurs, avec un cœur principal et plusieurs co-processeurs. Le premier est un co-processeur système, qui est utilisé pour gérer la mémoire cache intégrée au processeur, pour des fonctionnalités appelées interruptions et exceptions, ainsi que pour configurer le processeur. Le second est un co-processeur arithmétique spécialisé dans les calculs en virgule flottante, très importants pour le rendu 3D. Enfin, il y a un décodeur vidéo, qui n'est pas un co-processeur, mais un circuit non-programmable, spécialisé dans le décodage vidéo. De nos jours, ce circuit aurait été intégré dans la carte graphique, mais il était intégré dans le processeur sur la Playstation 2. Pour le reste, le processeur est la figure centrale de la console. Il est connecté à 4 bus : un pour la RAM, un pour la carte graphique, un pour les manettes, un autre pour le reste. Le dernier bus est connecté au système audio et au système pour le lecteur CD. Ce serait un bus d'entrée-sortie, s'il n'était pas connecté à la mémoire ROM. Vous avez bien lu : la mémoire ROM est reliée au bus d'entrée-sortie. [[File:Architecture de la Playstation.png|centre|vignette|upright=2.5|Architecture de la Playstation]] La Playstation 2 est composé d'un processeur, couplé à 32 Mébioctets de RAM, et d'un paquet de co-processeurs. Plus de co-processeurs que la PS1. Le processeur principal n'est pas la même que celui de la PS1, mais il a une architecture similaire. Il intègre un décodeur vidéo sur le même circuit intégré, ainsi que deux co-processeur. Les co-processeurs ne sont cependant pas les mêmes. Le co-processeur système disparait et est remplacé par un second co-processeur arithmétique. Les deux co-processeurs arithmétiques sont spécialisés dans les nombres flottants, avec quelques différences entre les deux. Par exemple, le second co-processeur gérait des calculs trigonométriques, des exponentielles, des logarithmes, et d'autres fonctions complexes du genre ; mais pas le premier co-processeur. Ils sont reliés à 4 kibioctets de RAM pour le premier, 16 kibioctets de RAM pour le second ; qui sont intégrées dans le processeur et non-représentés dans le diagramme ci-dessous. La PS2 intègre aussi un co-processeur d'entrées-sorties. Pour information, il s'agit du processeur principal de la Playstation 1, qui est ici utilisé différemment, suivant que l'on place un jeu PS1 ou PS1 dans la console. Si on met un jeu PS1, il est utilisé pour émuler la Playstation 1, afin de faire tourner le jeu PS1 sur la PS2. Si on met un jeu PS2, il est utilisé comme co-processeur d'entrée-sortie et fait l'interface entre CPU et entrées-sorties. Il est relié à 2 mébioctets de RAM, soit exactement la même quantité de mémoire que la Playstation 1. Tous les périphériques sont connectés au co-processeur d'entrées-sortie. Pour cela, le co-processeur d'entrées-sortie est relié à deux bus dédiés aux périphériques. Le premier bus est relié aux manettes, aux ports USB et aux ports pour cartes mémoires. Le second bus est relié à la carte son, la carte réseau, le lecteur DVD, et un port PCMIA. Notons que la carte son intègre un co-processeur audio, qui n'est pas représenté dans le diagramme ci-dessous. [[File:Playstation 2 architecture.png|centre|vignette|upright=2.5|Playstation 2 architecture]] ==L'architecture des PC et son évolution== Après avoir vu les consoles, nous allons maintenant voir les anciens PC, des années 80 ou 90. Le tout premier PC était techniquement l''''IBM PC'''. Par la suite, de nombreux ordinateurs ont tenté de reproduire l'IBM PC originel, avec parfois quelques modifications mineures. De tels ordinateurs ''IBM PC compatibles'', ont été très nombreux, pour des raisons diverses. Le fait d'utiliser des composants banalisés, facilement disponibles, ainsi qu'une bonne documentation de l'IBM PC originel, a grandement aidé. Les IBM PC compatibles ont progressivement évolué pour donner les PC actuels. L'IBM PC compatible a donné naissance à de nombreux standards divers. ===L'IBM PC originel et l'IBM PC XT=== [[File:IBM PC XT 02.jpg|vignette|IBM PC XT.]] Nous allons commencer par voir l'IBM PC originel, et son successeur : l'IBM Personal Computer XT. Nous les appelerons tous deux l'IBM PC. L'IBM PC utilisait un processeur Intel 8088, qui était un processeur 8 bits. Ils utilisaient un bus système unique, appelé le '''bus XT'''. Le bus système allait à 4.77 MHz, soit la même fréquence que le processeur. C'était un bus de 8 bits, ce qui collait parfaitement avec les processeurs 8 bits commercialisés par Intel à l'époque. L'IBM PC comprenait une mémoire ROM avec de quoi faire fonctionner le PC. La ROM en question contenait un programme minimal, appelé le '''BIOS''', sans lequel le PC ne fonctionnait pas du tout. Il servait de base pour le système d'exploitation et MS-DOS ne fonctionnait pas sans elle. De nos jours, son rôle est plus limité : sans elle, le PC ne démarre pas. Mais nous détaillerons cela dans le prochain chapitre. En plus de la ROM pour le BIOS, l'IBM PC avait quatre mémoires ROM dédiée au langage de programmation BASIC. Lorsque le PC démarrait, il ne bootait pas un système d'exploitation, mais lançait l'interpréteur pour le langage BASIC. De nos jours, ce serait l'équivalent d'un ordinateur qui boote directement sur du Python, à savoir la console Python que vous avez peut-être déjà utilisé si vous avez testé Python. Ceux qui ont déjà touché à un ordinateur de l'époque savent ce que ca veut dire, mais c'est malheureusement très difficile à expliquer sans ce genre d'expérience. Toujours est-il que c'était une sorte de norme à l'époque : les ordinateurs bootaient généralement sur un interpréteur BASIC. [[File:XT Bus pins.svg|vignette|Connecteur du bus XT.]] Les PC étaient conçus pour qu'on branche des '''cartes d'extension''', à savoir des cartes électroniques qu'on branchait sur la carte mère, à l'intérieur du PC. Les cartes d'extension de l'époque étaient surtout des cartes son ou des cartes graphiques, mais aussi des cartes pour brancher des péripéhriques. par exemple, on pouvait ajouter deux cartes graphiques dans l'IBM PC originel : l'''IBM Monochrome Display Adapter'' et/ou la ''IBM Color Graphics Adapter''. De nos jours, les cartes son sont intégrées à la carte mère, mais les cartes graphiques sont restées des cartes d'extension. Les cartes d'extension étaient branchées sur un '''connecteur XT''', qui était directement relié au bus XT. Le connecteur XT est illustré ci-contre, mais ne vous en souciez pas trop pour le moment. La carte mère de l'IBM PC avait 5 connecteurs de ce type, qu'on pouvait peupler avec autant de cartes d'extension. L'IBM Personal Computer XT est passé à 8 connecteurs XT, soit trois de plus. Pour ce qui est des périphériques, l'IBM PC avait plusieurs connecteurs : un port série, un port parallèle, un port pour le clavier, et un port pour un lecteur cassette. Le clavier et le lecteur cassette étaient connectés directement sur la carte mère, qui contenait quelques circuits pour gérer le clavier. Par contre, les deux premiers n'étaient pas connectés à la carte mère. Le port série était en réalité une carte d'extension, branchée sur un connecteur XT. Et il en est de même pour le port parallèle. Pour ce qui est des supports de stockage, l'IBM PC originel n'avait pas de disque dur et n'avait que des lecteurs de disquette. De plus, le lecteur de disquette n'était pas connecté directement sur la carte mère, mais était connecté à une carte d'extension, branchée sur un connecteur XT. La carte d'extension avait deux connecteurs, un par lecteur de disquette, ce qui fait que les deux lecteurs de disquettes pouvaient être branchés sur une seule carte d'extension. L'IBM Personal Computer XT a ajouté un disque dur, sauf sur quelques sous-modèles spécifiques. Le PC avait aussi un petit haut-parleur capable de faire des bips. Pour résumer, l'IBM PC originel se reposait beaucoup sur les cartes d'extension, sa carte mère contenait peu de choses. Enfin, peu de choses... Il y avait un processeur Intel 8088, éventuellement un coprocesseur flottant 8087, de la RAM, de la ROM, et des circuits intégrés assez divers. En voici la liste, certains vous seront familiers, d'autres vous seront inconnus à ce stade du cours : * les circuits de décodage d'adresse ; * un contrôleur DMA intel 8273 ; * un contrôleur d'interruption 8259 ; * un contrôleur de bus Intel 8288 pour gérer le bus XT ; * un générateur d'horloge Intel 8284 et un diviseur de fréquence ; * un ''timer'' Intel 8253, le même que celui étudié dans le chapitre sur les ''timers'' ; * un contrôleur parallèle 8255. Les multiplexeurs, registres et portes logiques, sont des circuits de décodage d'adresse, qui permettent de combiner plusieurs RAM en une seule, idem avec la mémoire ROM. Si vous verrez qu'il y a 5 mémoires ROM : une ROM pour le BIOS, et quatre autres ROM pour le BASIC. Les 4 ROM du BASIC sont combinées en une seule mémoire ROM. Pour les RAM, il y en a 8 à 32, qui sont combinées en une seule RAM de 16 à 64 kibioctets. [[File:IBM 5150 Motherboard.svg|centre|vignette|upright=3|Carte mère de l'IBM 5150, un modèle de l'IBM PC.]] ===L'architecture d'un IBM PC compatible 16 bits=== Les PC suivants sont passés à des processeurs 16 bits, mais c'était toujours des processeurs x86 d'Intel, à savoir des Intel 286 et 386. La RAM a grossi, quelques entrées-sorties ont été ajoutées, mais l'architecture globale est plus moins resté le même. C'est surtout au niveau du bus et des périphériques que les changements majeurs ont eu lieu. [[File:ISA Bus pins.svg|vignette|Connecteur ISA.]] Les PC 16 bits utilisaient un bus système unique, sur lequel tout était connecté : le processeur, la RAM, la ROM, les cartes d'extension et tout le reste. Le bus en question s'appelait le '''bus AT''', mais il a rapidement été renommé en '''bus ISA''' (''Industry Standard Architecture''). Le bus ISA était prévu pour avoir une compatibilité avec le bus 8 bits de l'IBM PC originel. D'ailleurs, cela se ressent jusque dans le connecteur utilisé : le connecteur ISA est un connecteur XT qu'on a fusionné avec un second connecteur pour l'étendre de 8 à 16 bits. Les PC 16 bits avaient toujours un port série, un port parallèle, un clavier, un lecteur de disquette et des cartes d'extension. Des disques durs pouvaient être ajoutés, aussi. Mais pour ces périphériques, un changement majeur a eu lieu comparé à l'IBM PC originel. L'IBM PC originel utilisait des cartes d'extension pour tout, sauf le clavier. Mais maintenant, les périphériques ne sont plus connectés à une carte d'extension. A la place, les circuits de la carte d'extension sont déplacés sur la carte mère. Mais n'allez pas croire qu'ils étaient connectés directement au bus ISA, il y avait des intermédiaires. Le clavier était relié à un '''contrôleur de clavier''', qui faisait l'interface entre le connecteur du clavier et le bus ISA. Le contrôleur de clavier était appelé le ''Keyboard Controler'', abrévié en KB. Il recevait ce qui est tapé au clavier et traduisait cela en quelque chose de compréhensible par l'ordinateur. Les autres périphériques étaient connectés à un circuit intégré dédié : l''''Intel 82091AA'''. Il était connecté au lecteur de disquette, au port série et au port parallèle. Il servait d'intermédiaire entre ces périphériques et le bus ISA. Vous pouvez le voir comme une sorte de répartiteur, mais qui ne serait pas connecté sur le processeur et la RAM Enfin, il ne faut pas oublier les autres composants présents sur l'IBM PC originel. Le BIOS est toujours là, de même que les ''timers'' Intel 8253 PIT, le contrôleur d'interruption Intel 8259 et le contrôleur DMA Intel 8237. Les PC 16 bits ont aussi intégré une ''Real Time Clock'' (RTC). Pour rappel, c'est un composant qui permet au PC de mémoriser la date et l'heure courante, à la seconde près. Le tout est résumé dans le schéma ci-dessous. [[File:Architecture de l'IBM PC compatible.png|centre|vignette|upright=2.5|Architecture de l'IBM PC compatible]] Un point important est que le bus ISA allait à la même fréquence que le processeur, vu que c'était un bus système. Les processeurs de l'époque étaient des CPU 286 d'Intel, ou le 386 d'Intel. Les Intel 286 allaient de 4 MHz minimum, à 25 MHz maximum. Le 386, quant à lui, allait de 12 à 40 MHz. Le bus ISA devait aller à cette fréquence, il était synchrone avec le processeur. Par la suite, les processeurs ont gagné en performance, ce qui fait que le bus ISA est devenu trop lent pour le processeur. Une idée a alors été de conserver le bus ISA, pour des raisons de compatibilité, mais de le reléguer comme bus secondaire. L'ordinateur contient alors deux bus : un bus système, et un bus ISA secondaire. Le lien entre les deux est réalisé par un '''pont ISA''', ''ISA Bridge'' en anglais. Le bus ISA fonctionnait alors sa fréquence usuelle, alors que le bus système était beaucoup plus rapide. Le bus système fonctionnait à une fréquence bien plus élevée, ce qui fait que le processeur pouvait communiquer à pleine vitesse, notamment avec la RAM. Le processeur n'était alors plus forcé à aller à la même fréquence que le bus ISA [[File:Architecture de l'IBM PC compatible avec bridge ISA.png|centre|vignette|upright=2.5|Architecture de l'IBM PC compatible avec bridge ISA]] Les PC de l'époque intégraient donc plusieurs bus séparés. Vous avez bien lu : plusieurs bus ! Ici, il s'agit de ce que j'appelle des '''bus en cascade''', à savoir qu'un bus est connecté à un autre bus par un intermédiaire. Au passage, si j'aborde ces exemples, car c'est pareil sur les ordinateurs modernes. Le pont ISA a été remplacé par des circuits différents, mais qui ont un rôle assez similaire. Le ''chipset'' de votre carte mère n'est qu'un lointain descendant du pont ISA, qui s'interface avec des bus différents. ===L'arrivée des standards AT et IDE pour les disques durs=== Initialement, les disques durs étaient placés dans l'ordinateur et étaient connectés sur le bus ISA, via une carte d'extension ISA. En clair, il fallait connecter le disque dur sur une carte d'extension, et non sur la carte mère. Les cartes d'extension en question permettaient de connecter un ou plusieurs disques durs, parfois des lecteurs de disquette supplémentaires. Les cartes ISA de ce type faisaient juste l'interface entre le bus ISA et les disques durs, rien de plus. L'interface en question a été standardisée, ce qui a donné le standard ''AT Bus Attachment'', qui a été abrévié en ATA. Et ce n'était pas que pour les disques durs, de nombreux composants étaient dans ce cas. Une carte d'extension servait d'intermédiaire entre eux et la carte mère. Les cartes d'extension en question étaient appelées des ''Host bus adapter''. [[File:Acculogic sIDE-4 Controller ISA.jpg|centre|vignette|upright=2|Carte ISA d'interface disque dur, de marque Acculogic.]] Mais les choses ont rapidement évoluées, que ce soit du côté des cartes mères que du côté des disques durs. Le '''standard IDE''' a permis de brancher un disque dur directement sur la carte mère, sans passer par une carte d'interface ISA. Pour cela, la carte mère réservait un connecteur ISA pour le disque dur, renommé '''connecteur ATA'''. Pour que cela soit possible, il a fallu rajouter des circuits sur la carte mère. Tout ce qui était sur les cartes d'interface ISA s'est retrouvé sur la carte mère. [[File:Ajout des ports IDE sur la carte mère.png|centre|vignette|upright=2|Ajout des ports IDE sur la carte mère]] En réalité, les connecteurs ATA étaient des connecteurs ISA simplifiés. Un connecteur ISA avait en tout 98 broches, alors qu'un connecteur ATA n'en contient que 40. Les broches qui étaient inutiles pour les disques durs ont simplement été enlevées. Et qui dit connecteur spécialisé, dit câble spécialisé. Les disques durs étaient branchés sur le connecteur AT grâce à un câble ATA, sur lequel on pouvait connecter deux disques durs. [[File:ATA Plug.svg|centre|vignette|upright=2|Connecteur ATA.]] [[File:ATA cables.jpg|centre|vignette|upright=2|Cable ATA.]] Il était donc possible de connecter deux disques durs sur un seul connecteur ATA. Et cette possibilité est devenue d'autant plus utile par la suite. A partir de la version 2, ATA supportait aussi les lecteurs de disquettes, les lecteurs de CD/DVD, et bien d'autres supports de stockage. Il était alors possible de connecter un lecteur CD et un disque dur sur un seul connecteur. Les cartes mères avaient généralement deux connecteurs ATA, et n'avaient pas besoin de plus. C'était suffisant pour connecter un disque dur, un lecteur de disquette et un lecteur CD, configuration courante entre les années 90 et 2000. Un câble est donc connecté à deux supports de stockage. Pour distinguer les deux, le standard ATA ajoute une possibilité de configuration. Sur un câble, il doit y avoir un support de stockage "maitre" et un support "esclave". C'était la terminologie de l'époque, que je reproduis ici, même si elle est fortement trompeuse. N'allez pas croire que cela implique que l'un ait des avantages sur l'autre. Le support 'maitre" n'a pas droit à plus de bande passante, il n'a pas la priorité sur l'autre, rien du tout. Il s'agit juste d'un nombre qui permet de savoir avec qui le processeur communique, qui vaut 0 pour le premier support, 1 pour l'autre. Une sorte d'adresse de 1 bit, si l'on veut. [[File:ATA-Konfiguration02.png|centre|vignette|upright=2|Configuration ATA.]] Pour configurer un support de stockage en mode "maitre" ou "esclave", le support de stockage avait quelques pins dédiés. Il suffisait de placer un détrompeur en plastique sur les pins adéquats. Les pins se trouvaient à l'arrière du disque dur ou du lecteur de CD/DVD/Disquette/autre. [[File:HDD Master and Slave Description.jpg|centre|vignette|upright=2|Configuration ''Master/Slave''.]] ===L'architecture d'un PC avec un processeur Intel 486=== Maintenant, passons aux ordinateurs 32 bits, avec l'exemple d'un PC avec un processeur 486 d'Intel. A cette époque, le bus ISA était devenu trop limité et était en place d'être remplacé par le bus PCI, qui avait la même fonction. De nombreuses cartes d'extension utilisaient déjà ce standard et étaient branchées sur des connecteurs PCI dédiés, différents des connecteurs ISA. Intuitivement, on se dit que le bus PCI remplaçait le bus ISA, mais les choses étaient plus compliquées. Les disques durs gardaient leur connecteur ATA, et ne passaient pas par le bus PCI. Ils avaient un bus IDE séparé, qui était un bus ISA modifié. Là encore, les processeurs étaient devenus beaucoup plus rapides que le bus PCI. Les deux allaient à des fréquences assez différentes, ce qui fait que le bus PCI était séparé du bus système. Il y avait alors deux implémentations possibles. * La première utilise un répartiteur unique, relié au processeur, à la RAM, au bus PCI, et au bus IDE. * La seconde utilise un bus système séparé du bus PCI, avec un '''pont PCI''' pour faire l'interface entre les deux. Le '''''System Controler''''' était un circuit intégré, placé sur la carte mère, qui peut servir soit de pont PCI, soit de répartiteur. Le répartiteur PCI sert d'intermédiaire avec le bus PCI, mais aussi avec le bus IDE, utilisé pour les disques durs, aussi appelé le bus ''Parallel ATA''. Il peut aussi être connecté au processeur, à la mémoire RAM, ainsi qu'à la mémoire cache, mais cela ne sert que quand il est utilisé comme répartiteur. [[File:Architecture d'un PC utilisant un bus PCI, implémentation avec un répartiteur.png|centre|vignette|upright=2|Architecture d'un PC utilisant un bus PCI, implémentation avec un répartiteur]] Pour des raisons de compatibilité, le bus ISA avait été conservé, aux côtés du bus PCI. Il y avait un pont ISA en plus du pont/répartiteur PCI. Une implémentation possible aurait été de connecter les deux ponts ISA et PCI à un bus système unique. Mais cette solution n'a pas été retenue. La raison est que le bus PCI et le bus ISA ont des performances très différentes. Le bus PCI est très rapide, le bus ISA beaucoup plus lent. La différence est d'un ordre de grandeur, environ. Dans ces conditions, il est possible de faire passer les communications ISA à travers le bus PCI. Pour cela, le pont ISA est directement connecté sur le pont PCI, comme illustré ci-dessous. Et il en est de même pour le bus dédié aux disques durs. En effet, les disques durs étaient autrefois reliés au bus ISA, mais cela a changé depuis. Ils disposent maintenant de leur propre bus dédié, le '''bus IDE''', qui est un bus ISA simplifié. Et ce bus ISA simplifié était connecté directement sur le pont PCI. [[File:Architecture de l'IBM PC compatible avec pont PCI.png|centre|vignette|upright=2|Architecture de l'IBM PC compatible avec pont PCI]] Dans ce qui va suivre, nous allons étudier un exemple qui utilise un bus système séparé, avec un pont PCI, sans répartiteur. Voilà pour les grandes lignes, mais le schéma ci-dessous montre que tout est plus complexe. Vous remarquerez des connexions optionnelles entre le pont PCI et la mémoire RAM et la mémoire cache. La raison est que le pont PCI peut aussi servir de répartiteur en remplacement du bus système. Concrètement, on peut alors retirer le bus système. La mémoire, le bus PCI, le bus ISA, le bus IDE, le processeur et la RAM sont alors connectés au répartiteur PCI, qui sert d'intermédiaire central entre tous ces composants. Mais ce n'est pas la solution qui a été retenue dans notre exemple. [[File:Intel486-Typ PCI System.png|centre|vignette|upright=2|PC IBM compatible avec un 486, un bus PCI et un bus ISA. Le ''host bus'' est le bus système.]] Le pont ISA sert ici d'intermédiaire entre le bus système et le bus ISA. De plus, il a été amélioré sur de nombreux points. Il inclut notamment des circuits qui étaient autrefois sur la carte mère, à savoir le contrôleur DMA 82C87 et le contrôleur d'interruption 82C59, ainsi que les ''timers'' Intel 82C54. Les composants restants sont eux reliés sur un quatrième bus : le bus X, l'ancêtre du bus ''Low Pin Count''. Le bus X était celui du BIOS, du contrôleur de clavier, de la ''Real Time Clock'', et du contrôleur de périphérique 82091AA d'Intel. [[File:ISA Bridge schematic.png|centre|vignette|upright=2|ISA Bridge.]] ===L'architecture des PC des années 90-2000=== Par la suite, les ponts PCI et ISA ont évolué avec l'évolution des bus de l'ordinateur. Le bus ISA a progressivement été remplacé par d'autres bus, comme le bus ''Low Pin Count'', le bus PCI a été remplacé par le PCI Express, d'autres bus ont été ajoutés, etc. Mais la séparation du ''chipset'' en deux a été conservée. [[File:Chipset schematic.svg|vignette|upright=1.0|Chipset séparé en northbridge et southbridge.]] Le pont PCI et le pont ISA ont été remplacés respectivement par le '''pont nord''' et le '''pont sud''', plus connus par leurs noms anglais de ''northbridge'' et de ''southbridge''. Le pont nord servait d'interface entre le processeur, la mémoire et la carte graphique et est connecté à chacun par un bus dédié. Il intégrait aussi le contrôleur mémoire. Le pont sud est le répartiteur pour les composants lents, à savoir l'USB, l'Ethernet, etc. Le bus qui relie le processeur au pont nord était appelé le '''''Front Side Bus''''', abrévié en FSB. [[File:IMac Chipset.png|centre|vignette|upright=2|Chipset séparé en northbridge et southbridge.]] Un point important est que le bus PCI est devenu un bus assez lent, ce qui fait qu'il a finit par être connecté au pont sud. Le pont PCI est donc devenu le pont sud, dans le courant des années 2000. Durant un moment, un équivalent du pont ISA a subsisté dans un circuit de '''''Super IO'''''. Concrètement, il s'occupait du lecteur de disquette, du port parallèle, du port série, et des ports PS/2 pour le clavier et la souris. Mais il ne gérait pas le bus ISA, mais son remplaçant, le bus ''Low Pin Count''. [[File:Motherboard diagram fr.svg|centre|vignette|upright=1.5|Carte mère avec circuit Super IO.]] ===L'architecture des PC depuis les années 2000=== Depuis la sortie du processeur AMD Athlon 64, le pont nord a été fusionné dans le processeur. La fusion ne s'est pas faite en une fois, des fonctionnalités ont progressivement été progressivement intégrées dans le processeur. Le pont sud est resté, mais il a alors été progressivement connecté directement au processeur. La raison derrière cette intégration est que les processeurs avaient de plus en plus de transistors à leur disposition. Ils en ont profité pour intégrer le pont nord. Et cela permettait de simplifier le câblage des cartes mères, sans pour autant rendre vraiment plus complexe la fabrication du processeur. Les industriels y trouvent leur compte. La première étape a été l'intégration du contrôleur mémoire a été intégré au processeur. Concrètement, le résultat était que la mémoire RAM n'était plus connectée au pont nord, mais était connectée directement au processeur ! Il y a donc eu un retour d'un bus mémoire, mais spécialisé pour la mémoire RAM. En théorie, une telle intégration permet diverses optimisations quant aux transferts avec la mémoire RAM. Les transferts ne passent pas par un répartiteur, ce qui réduit le temps d'accès à la mémoire RAM. Ajoutons de sombres histoires de prefetching, d'optimisation des commandes, et j'en passe. Toujours est-il que le pont nord ne servait alors d'intermédiaire que pour les ports PCI Express, et le pont sud. [[File:X58 Block Diagram.png|centre|vignette|upright=2|Chipset X58 d'Intel.]] Par la suite, la carte graphique fût aussi connectée directement sur le processeur. Le processeur incorpore pour cela des contrôleurs PCI-Express. Le pont nord a alors disparu complétement, son intégration dans le processeur était complète. Sur les cartes mères Intel récentes, le pont sdud subsiste, il est appelé le ''Platform Controler Hub'', ou PCH. L'organisation des bus sur la carte mère qui résulte de cette connexion du processeur à la carte graphique, est illustrée ci-dessous, avec l'exemple du PCH. [[File:Intel 5 Series architecture.png|centre|vignette|upright=2|Intel 5 Series architecture]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=L'interface électrique entre circuits intégrés et bus | prevText=L'interface électrique entre circuits intégrés et bus | next=La hiérarchie mémoire | nextText=La hiérarchie mémoire }} </noinclude> 74zeg8yxl6pj5kqd0iq52oorfcvjimb Fonctionnement d'un ordinateur/Contrôleur mémoire externe 0 65796 764844 764704 2026-04-24T14:05:33Z Mewtow 31375 764844 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> rr5o7v9dh0x3ondd55zdzpc5h6j2327 764846 764844 2026-04-24T14:06:22Z Mewtow 31375 /* Le contrôleur mémoire d'une SDRAM ou d'une DDR */ 764846 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> b3p7x9spke53eglxwbc28d7g2unyyd6 764847 764846 2026-04-24T14:11:00Z Mewtow 31375 /* Le contrôleur mémoire d'une SDRAM ou d'une DDR */ 764847 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. Il gérait 16 rangées de mémoire DDR 3, gérait des transferts entre cache et RAM de 128 octets (des lignes de cache de 128 octets), et, intégrait une mémoire cache de 16 mébioctets d'eDRAM (de la RAM dans un circuit imprimé). ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> t6btw71o3k3cmhgcy6wmsznbuh7ydt3 764850 764847 2026-04-24T14:33:41Z Mewtow 31375 /* La politique de gestion du tampon de ligne */ 764850 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. Il gérait 16 rangées de mémoire DDR 3, gérait des transferts entre cache et RAM de 128 octets (des lignes de cache de 128 octets), et, intégrait une mémoire cache de 16 mébioctets d'eDRAM (de la RAM dans un circuit imprimé). ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures se font quand le cache est plein : le cache est vidé d'un seul coup en mémoire RAM. La conséquence est que les écritures se font en bloc, ce que la mémoire préfère. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> pl9r810d9gz5fpupdc7wge2st0f84gz 764851 764850 2026-04-24T14:34:10Z Mewtow 31375 /* Les caches intégrés aux contrôleurs de SDRAM */ 764851 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. Il gérait 16 rangées de mémoire DDR 3, gérait des transferts entre cache et RAM de 128 octets (des lignes de cache de 128 octets), et, intégrait une mémoire cache de 16 mébioctets d'eDRAM (de la RAM dans un circuit imprimé). ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures se font quand le cache est plein : le cache est vidé d'un seul coup en mémoire RAM. La conséquence est que les écritures se font en bloc, ce que la mémoire préfère. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'Intel E8870 - Scalable Memory Controller peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> 1d8eawgy7hws1bocb8lw4lr9g53gt4i 764852 764851 2026-04-24T14:35:26Z Mewtow 31375 /* Le contrôleur mémoire d'une SDRAM ou d'une DDR */ 764852 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures se font quand le cache est plein : le cache est vidé d'un seul coup en mémoire RAM. La conséquence est que les écritures se font en bloc, ce que la mémoire préfère. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Un autre exemple est le ''POWER 8 Memory Buffer'' d'IBM, mentionné plus haut. iL intégrait une mémoire de type eDRAM (de la RAM dans un circuit imprimé), 16 mébioctets en tout. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> anw3ev80wixvy3mmii6rg8sul7752pv 764853 764852 2026-04-24T14:36:35Z Mewtow 31375 /* Les caches intégrés aux contrôleurs de SDRAM */ 764853 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures sont retardées, elles se font quand le cache est plein. Le cache est alors vidé d'un seul coup en mémoire RAM, en bloc. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Un autre exemple est le ''POWER 8 Memory Buffer'' d'IBM, mentionné plus haut. Il intégrait une mémoire de type eDRAM (de la RAM dans un circuit imprimé), 16 mébioctets en tout. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> r9kdzm4y0q6dbm5x0k89pprzcp169tf 764855 764853 2026-04-24T14:37:30Z Mewtow 31375 /* Les caches intégrés aux contrôleurs de SDRAM */ 764855 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures sont retardées, elles se font quand le cache est plein. Le cache est alors vidé d'un seul coup en mémoire RAM, en bloc. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. Le contrôleur mémoire peut aussi regrouper plusieurs accès à des adresses consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les écritures mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une écriture en rafale. Une telle optimisation est appelée la '''combinaison d'écriture'''. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Un autre exemple est le ''POWER 8 Memory Buffer'' d'IBM, mentionné plus haut. Il intégrait une mémoire de type eDRAM (de la RAM dans un circuit imprimé), 16 mébioctets en tout. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> 1l7ddwgargc8pnwiwemhy3tdyq9bgoc 764856 764855 2026-04-24T14:44:32Z Mewtow 31375 /* Les caches intégrés aux contrôleurs de SDRAM */ 764856 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power PC 8. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures sont retardées, elles se font quand le cache est plein. Le cache est alors vidé d'un seul coup en mémoire RAM, en bloc. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. La présence de ce cache permet d'ajouter d'autres optimisations au contrôleur mémoire. Par exemple, le contrôleur mémoire peut fusionner plusieurs écritures dans la même adresse en une seule. Par exemple, si une écriture modifie une adresse, et qu'une écriture ultérieure écrit une autre valeur à la même adresse, seule la dernière écriture est envoyée à la mémoire RAM. Le contrôleur mémoire peut aussi regrouper plusieurs accès à des adresses consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les écritures mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une écriture en rafale. Les deux optimisations, bien que différentes sur le fond, et n'ayant rien à voir, portent pourtant le même nom. Elles sont appelées la '''combinaison d'écriture'''. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Un autre exemple est le ''POWER 8 Memory Buffer'' d'IBM, mentionné plus haut. Il intégrait une mémoire de type eDRAM (de la RAM dans un circuit imprimé), 16 mébioctets en tout. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> ddogzghpr5u9uckrqumk6mlcmxe5dyq 764909 764856 2026-04-24T21:26:13Z Mewtow 31375 /* Le contrôleur mémoire d'une SDRAM ou d'une DDR */ 764909 wikitext text/x-wiki Les mémoires ROM ou SRAM ont généralement une interface simple, à laquelle le processeur peut s'interfacer directement. Mais pour les DRAM, ce n'est pas le cas. Les DRAM utilisent un bus d'adresse multiplexé, où l'adresse est envoyée en deux fois. Connecter le processeur directement sur une DRAM n'est pas pratique : le bus d'adresse du processeur et celui de la mémoire ne collent pas. Les DRAM doivent aussi être rafraichies régulièrement. Le rafraichissement mémoire peut être délégué au processeur, mais c'est loin d'être idéal. Et il y a bien d'autres raisons qui font que le processeur ne peut pas s'interfacer facilement avec les mémoires DRAM. Pour gérer ces problèmes, les mémoires DRAM ne sont pas connectées directement au processeur. À la place, on ajoute un intermédiaire entre le processeur et la mémoire : le '''contrôleur mémoire externe'''. Son but est de montrer au processeur une interface simple, semblable à celle d'une SRAM classique, alors qu'il commande une mémoire DRAM à l'interface plus complexe. Les anciens contrôleurs de DRAM étaient des composants séparés du processeur, du ''chipset'' ou du reste de la carte mère. Ils étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégré au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Ce chapitre va expliquer quels sont les rôles du contrôleur mémoire, son interface et ce qu'il y a à l'intérieur. Dans ce chapitre, quand nous parlerons de ''contrôleur mémoire'', cela fera systématiquement référence au contrôleur mémoire externe. Et avant de poursuivre, sachez qu'il est difficile de faire des généralités sur les contrôleurs mémoire, car les mémoires DRAM elles-mêmes sont assez différentes les unes des autres. Entre une mémoire EDO, une mémoire SDR, une mémoire DDR et une DRAM asynchrone, les contrôleurs mémoires seront fortement différents. J'ai choisit de vous séparer les contrôleurs mémoire pour les DRAM asynchrones de ceux pour les SDRAM/DRR. ==Le contrôleur d'une DRAM asynchrone== Les premières DRAM asynchrones avaient des contrôleurs mémoires dédiés, qui étaient séparés du processeur et du ''chipset'' de la carte mère. Par exemple, les composants Intel 8202, Intel 8203 et Intel 8207 étaient des contrôleurs mémoire pour DRAM asynchrones qui étaient vendus dans des boitiers DIP et étaient soudés sur la carte mère. Par la suite, ils ont été intégrés au ''chipset'' de la carte mère pendant les décennies 90-2000. Après les années 2000, ils ont été intégrés dans les processeurs. Leurs fonctions étaient le multiplexage de l'adresse et le rafraichissement mémoire. Ils recevaient une adresse mémoire complète, qu'ils découpaient une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre sur le bus mémoire. Pour le rafraichissement mémoire, ils rafraichissaient la DRAM régulièrement, de manière automatique, entre deux accès mémoire normaux. Le processeur n'avait ainsi plus à rafraichir la mémoire lui-même, cette fonction était déléguée au contrôleur de DRAM. Ils étaient connectés au bus d'adresse et de commande, avec éventuellement des relations indirectes avec le bus de données. ===L'interface d'un contrôleur de DRAM asynchrone=== L'interface du contrôleur mémoire décrit ses broches d'entrées/sorties et leur signification. Elle est généralement très simple et contient deux ports : un connecté au processeur, un autre connecté à la DRAM. Cela trahit d'ailleurs son rôle principal, qui est de transformer les requêtes de lecture/écriture provenant du processeur en une suite de commandes acceptée par la mémoire. Le port connecté à la DRAM est connecté ua bus d'adresse et au bus de commande. Le bus de données est lui relié au processeur et/ou au bus système. Un accès mémoire provenant du processeur contient une adresse à lire/écrire, le bit R/W qui indique s'il faut faire une lecture ou une écriture, et éventuellement une donnée à écrire. Mais, nous avons vu que les accès mémoires sur une DRAM sont multiplexés : on envoie l'adresse en deux fois : la ligne d'abord, puis la colonne. De plus, il faut générer les signaux RAS, CAS et bien d'autres. Le tout est illustré ci-dessous. [[File:Contrôleur mémoire.png|centre|vignette|upright=2|Contrôleur mémoire externe.]] Un point important est que les DRAM asynchrones n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. Pour certains contrôleurs de DRAM, il faut ajouter l''''interface électrique''', qui traduit les signaux du processeur en signaux compatibles avec la mémoire. Il est en effet très fréquent que la mémoire et le processeur n'utilisent pas les mêmes tensions pour coder un bit, ce qui fait qu'elles ne sont pas compatibles. Dans ce cas, le contrôleur mémoire fait la conversion. Le contrôleur DRAM peut fonctionner en mode synchrone ou asynchrone, du point de vue du processeur. Quand il fonctionne en mode synchrone, il permet d'interfacer un processeur synchrone avec une mémoire DRAM asynchrone. Un point important est que le contrôleur DRAM sert d'intermédiaire entre une mémoire DRAM et "le reste du monde". Il ne fait pas forcément office d'intermédiaire entre DRAM et processeur, mais peut aussi faire l'intermédiaire entre la DRAM et un bus système, entre une DRAM et le ''Video Display Controler'' d'une carte graphique, ou n'importe quel autre composant électronique qui utilise cette DRAM. ===Le générateur de ''timings'' et la traduction d'adresse=== Le contrôleur mémoire doit traduire les adresses du processeur en adresses compatibles avec la mémoire. Et la traduction est assez variable, suivant que le bus mémoire est un bus normal, un bus multiplexé, ou partiellement multiplexé. Nous avons vu ces trois types de bus mémoire dans le chapitre sur l'interface des mémoires, mais nous ferons quelques rappels rapides. Avec un ''bus totalement multiplexé'', le bus d'adresse et le bus de données sont fusionnés. Dans ce cas, on peut envoyer soit une adresse, soit lire/écrire une donnée sur le bus, mais on ne peut pas faire les deux en même temps. Un bit ALE indique si le bus est utilisé en tant que bus d'adresse ou bus de données. Le contrôleur mémoire gère cette situation, en fixant le bit ALE et en envoyant séparément adresse et donnée pour les écritures. [[File:Bus multiplexé avec bit ALE.png|centre|vignette|upright=2|Bus multiplexé avec bit ALE.]] Avec un ''bus d'adresse multiplexé'', l'adresse est découpée en une adresse de ligne et une adresse de colonne, envoyées l'une après l'autre. Le contrôleur mémoire prend en entrée une adresse mémoire complète, la découpe en deux, et envoie chaque morceau au bon moment. Pour cela, il suffit d'un registre pour mémoriser l'adresse et d'un multiplexeur. Le multiplexeur choisit soit les bits de poids fort de l'adresse, soit ceux de poids faible. Les premiers correspondent à l'adresse de ligne, les autres à l'adresse de colonne. La commande du multiplexeur est le fait d'un petit circuit séquentiel, qui génère aussi les signaux CAS et RAS. Au premier cycle, il met le signal RAS à 1, met le CAS à 0, et configure le MUX pour sélectionner les bits de poids fort. Au second cycle, il génère un signal CAS à 1, met le RAS à 0 et configure le MUX pour sélectionner les bits de poids faible. Le circuit en question est appelé le générateur de ''timings''. [[File:Controleur de DRAM simple, sans rafraichissement mémoire.png|centre|vignette|upright=2|Contrôleur de DRAM simple, sans rafraichissement mémoire.]] Le générateur de ''timings'' est un circuit séquentiel qui implémente une petite machine à état. Il est très simple sur une mémoire DRAM asynchrone basique, mais il est plus complexe sur les mémoires FPM, EDO, quartet, et autres. Le regroupement des multiplexeurs d'adresse et du générateur de ''timings'' est appelé le '''séquenceur mémoire'''. C'est le séquenceur mémoire qui traduit la requête processeur en commande DRAM, le reste du contrôleur est dédié au rafraichissement mémoire ou à d'autres fonctions facultatives. ===Le rafraichissement mémoire=== La gestion du rafraichissement mémoire est la fonction principale du contrôleur DRAM. Pour gérer le rafraichissement mémoire, le contrôleur mémoire intègre deux compteurs, un pour gérer l'adresse à rafraichir, l'autre pour gérer l'intervalle de temps entre deux rafraichissements. Le rafraichissement se fait à intervalle régulier, tous les x microsecondes. Pour déclencher le rafraichissement au bon moment, le contrôleur mémoire contient un ''Refresh Timer'', aussi appelé le '''compteur de rafraichissement'''. Il est initialisé avec le temps entre deux rafraichissements, une adresse est rafraichie quand ce compteur atteint 0. Le rafraichissement mémoire balaye la mémoire adresse par adresse. Pour savoir à quelle adresse il en est rendu, le contrôleur mémoire utilise un '''compteur d'adresse'''. Il contient la prochaine adresse à rafraichir, aussi appelée l'adresse de rafraichissement. Régulièrement, l'adresse dans ce compteur est envoyée à la RAM, pour une lecture. Mais la donnée lue n'est pas envoyée sur le bus de donnée, soit parce que la RAM est prévue pour, soit parce que le contrôleur désactive son bit ''output enable''. Dans le second cas, la RAM fait la lecture en interne, mais se déconnecte du bus de donnée, perdant la donnée lue dans le néant. Pour envoyer l'adresse de rafraichissement sur le bus d'adresse, il faut rajouter un multiplexeur, qui choisit entre l'adresse normale et l'adresse de rafraichissement. [[File:Controleur de DRAM avec rafraichissement mémoire.png|centre|vignette|upright=2|Controleur de DRAM avec rafraichissement mémoire.]] Le multiplexeur ne doit cependant pas être configuré si une adresse est déjà en cours de transfert. Pour cela, un circuit d'arbitrage se débrouille pour éviter qu'un accès mémoire soit interrompu par une demande de rafraichissement et inversement. Il peut être inclus dans le séquenceur mémoire ou séparé de celui-ci. [[File:Controleur mémoire, intérieur simplifié.png|centre|vignette|upright=2.5|Contrôleur mémoire, intérieur simplifié.]] Il faut noter que le rafraichissement mémoire peut être délégué non pas au contrôleur mémoire, mais au processeur où à la DRAM elle-même. Quand elle est le fait du processeur, celui-ci incorpore un ''refresh timer'' et un compteur d'adresse. Un exemple est celui du processeur Zilog Z80, qui implémentait des compteurs internes pour gérer le rafraichissement mémoire. On peut considérer que le processeur incorpore alors le contrôleur mémoire, au moins partiellement. Il est aussi possible de déléguer le rafraichissement au logiciel (certains jeux vidéos Amiga ou Commodore faisaient cela pour la mémoire vidéo). Quand la DRAM elle-même s'occupe de son propre rafraichissement, c'est elle qui intègre un ''refresh timer'' et le compteur d'adresse. ===Le décodage d'adresse=== Le contrôleur mémoire gère aussi le '''décodage d'adresse'''. pour rappel, celui-ci est utilisé quand on combine plusieurs chips mémoire ensemble, pour combiner leurs capacités mémoire. Par exemple, on peut combiner 4 chips mémoires de 1 mébioctet chacun, pour que le processeur voit comme 4 mébioctets de RAM unique. Le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Pour cela, on active le chip mémoire adéquat, en fonction de l'adresse à consulter. Les autres chips mémoire sont désactivés pendant l'accès mémoire. En théorie, activer ou désactiver un chip mémoire se fait en utilisant son entrée ''Chip Select''. Il faut noter que si les SDRAM disposent bien d'un signal ''Chip Select'', ce n'est pas le cas des mémoires RAM asynchrones. A la place, ce sont les signaux RAS qui font office de ''Chip Select''. Une RAM asynchrone est activée quand son signal RAS lui demande de lire une ligne, elle est désactivée sinon. Mais c'est un détail. Toujours est-il que les signaux ''Chip Select'', ou leurs équivalents, sont générés par le contrôleur de DRAM, à partir des bits de poids fort de l'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Le contrôleur mémoire doit avoir plusieurs sorties ''Chip Select'', une par chip mémoire. Et le nombre de ces sorties limite le nombre de chips mémoire qu'on peut combiner. Par exemple, s'il y a seulement 4 sorties ''Chip Select'', on ne pourra brancher que 4 chips mémoire dessus. Sauf à ruser, avec un arrangement horizontal, mais cela n'est pas le ressort du contrôleur mémoire. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] ===Exemple : l'Intel 8202-8203=== L'Intel 8202 et le 8203 étaient des contrôleurs de mémoire DRAM, parmi les plus simples qui soient. Ils avaient une entrée d'adresse de 12 bits, ce qui permettait d'adresser 4 kibioctets de RAM. Ils fournissaient en sortie une adresse multiplexée sur 6 bits, envoyée en deux fois. Ils avaient donc 12 entrées d'adresse, 6 sorties d'adresse, un signal RAS, un signal CAS. Les adresses présentées en entrées n'étaient pas mémorisées dans des registres, ce qui fait qu'elles devaient être maintenues durant toute la durée de l'accès mémoire. Le processeur ne pouvait donc pas se déconnecter du bus d'adresse pendant l'accès mémoire, peu importe sa durée. Le 8202 contenait aussi un compteur de rafraichissement. Rappelons que sur les DRAM asynchrones, le rafraichissement se fait ligne par ligne. Le contrôleur mémoire a juste à présenter l'adresse de ligne, il n'a pas à envoyer l'adresse de colonne. La commande de rafraichissement se fait en mettant le signal RAS à 0, mais en laissant le CAS à 1 (je rappelle que les signaux sont actifs à 0). Le compteur d'adresse de rafraichissement a donc juste à mémoriser l'adresse de ligne. Le séquenceur mémoire était précédé par un circuit d'arbitrage, non-représenté dans le schéma ci-dessous. La microarchitecture de l'Intel 8202 est la suivante : [[File:Microarchitecture de l'Intel 8202.png|centre|vignette|upright=2|Microarchitecture de l'Intel 8202.]] Le 8202 avait une entrée pour un signal d'horloge, ainsi qu'un ''Chip Select'' un peu particulier. Si le signal CS passait à 0 lors d'un accès mémoire, le 8202/8203 ne se désactivait qu'une fois l'accès mémoire terminé. On ne pouvait pas l'interrompre pendant un accès mémoire, même en changeant le bit CS. Le signal d'horloge était utilisé pour commander le ''refresh timer''. Pour commander les lectures et écriture, il recevait en entrée un bit ''Write Request'' et un bit ''Read Request'', qui demandent respectivement une écriture et une lecture. En sortie, on trouvait un unique bit R/W qui valait 0 pour une lecture et 1 pour une écriture. Il avait aussi un bit d'entrée pour forcer le rafraichissement mémoire. S'il est à 1, la mémoire rafraichie l'adresse envoyée par le processeur. Le 8202 pouvait être connecté sur 1 à 4 chips mémoire, ce qui permettait d'adresser au maximum 16 kibioctets de RAM. Les 4 chips ne sont pas accédés en parallèle, un seul l'est à chaque fois. Pour le décodage d'adresse, le 8202 dispose de deux bits BO et B1 pour sélectionner le chip adéquat, ainsi que 4 sorties RAS pour activer la banque adéquate. On rappelle que le signal RAS remplace le signal ''Chip Select''. C'est le séquenceur mémoire qui se charge de générer ces signaux RAS, à partir des deux bits B0 et B1 (qui sont techniquement des bits d'adresse). Pour communiquer avec le processeur, l'Intel 8202 disposait de deux bits XACK et SACK. SACK indiquait au processeur que le 8202/8203 est en train de faire un accès mémoire et qu'il est indisponible pour un second accès mémoire. Cela permet de bloquer le processeur tant que le 8202 est indisponible. Le signal XACK indique que l'accès mémoire précédent est terminé et que : soit la donnée lue est présente sur le bus de données, soit que l'écriture s'est terminée. : Le signal SACK est très utile sur les configurations multiprocesseurs. Un processeur peut démarrer un accès mémoire, le signal SACK indiquera au second processeur qu'il doit attendre que l'accès soit terminé pour que ce soit son tour. ==Les contrôleurs de DRAM asynchrones évolués== L'Intel 8202 était un contrôleur mémoire basique, comme beaucoup d'autres à cette époque. Mais Intel a vendu des contrôleurs mémoires plus complexes. Par exemple, l'Intel 8207 était un contrôleur mémoire bien plus avancé que les deux précédents. Passons sur certains détails, comme le fait qu'il pouvait gérer jusqu'à 256 kibioctets de DRAM. Au-delà de ça, il y avait des fonctionnalités bien plus intéressantes, à savoir : un support de l'ECC, il était double port, il permettait de simuler une DRAM synchrone à partir d'une DRAM asynchrone. Il n'était pas le seul dans ce cas et des contrôleurs de DRAM très évolués étaient capables de faire des merveilles. Voyons comment cela était possible. ===Les contrôleurs mémoire synchrone=== Il est parfaitement possible d'utiliser un contrôleur mémoire synchrone avec une DRAM asynchrone. A vrai dire, le contrôleur DRAM peut complétement simuler une mémoire synchrone alors que la DRAM associée est asynchrone. La traduction asynchrone vers synchrone se fait en ajoutant des registres sur le bus mémoire, notamment sur le bus de données et le bus d'adresse/commande. Nous avions détaillé cela dans le chapitre sur les SRAM, c'est la même chose avec une mémoire DRAM. Sauf que cette fois-ci, le contrôleur mémoire doit aussi être prévu pour. [[File:Controleur mémoire synchrone utilisé avec une DRAM asynchrone.png|centre|vignette|upright=2|Contrôleur mémoire synchrone utilisé avec une DRAM asynchrone]] Les deux-trois registres illustrés plus haut peuvent être intégrés directement dans le contrôleur mémoire, que ce soit totalement ou en partie. Le strict minimum pour avoir un contrôleur mémoire synchrone est que celui-ci doit mémoriser adresse et commandes dans un registre. Par exemple, le 8207 d'Intel était capable de mémoriser les requêtes processeurs dans un registre interne, mais il fallait utiliser deux registres séparés pour le bus de données. Les deux registres étaient alors commandés par le contrôleur mémoire. Il est cependant possible d'aller plus loin et d'intégrer les registres du bus de données dans le contrôleur mémoire. [[File:Controleur mémoire DRAM synchrone.png|centre|vignette|upright=2|Contrôleur mémoire DRAM synchrone.]] : Il faut noter que cette fonctionnalité est parfois disponible sur les SRAM. En clair, on peut associer une SRAM asynchrone avec un contrôleur de SRAM synchrone. Le contrôleur de SRAM se charge alors de simuler une SRAM synchrone à partir de la SRAM asynchrone. Utiliser un contrôleur mémoire synchrone a de nombreux avantages, l'un d'entre eux étant lié aux ''wait state''. Quand le processeur envoie une requête de lecture/écriture à la mémoire RAM, celle-ci met plusieurs cycles d'horloge à répondre. Et pendant ce temps, le processeur... attend. Et pendant ce temps d'attente, il doit maintenir l'adresse mémoire sur le bus d'adresse. Les cycles d'horloge perdus à attendre la mémoire RAM étaient appelés des '''''Wait states'''''. Utiliser un contrôleur mémoire synchrone d'éliminer les ''wait state'', dans une certaine mesure. Avec un contrôleur mémoire synchrone, le processeur envoie l'adresse, mais c'est le contrôleur mémoire qui la maintient sur le bus d'adresse. Le processeur peut envoyer l'adresse et la donnée à écrire, elles sont recopiées dans les registres, et le controleur mémoire y a accès sans que le processeur doive les maintenir. Le processeur peut se déconnecter du bus mémoire et faire du travail dans son coin pendant que le contrôleur mémoire accède à la DRAM. Les ''wait state'' disparaissent alors, du moins du point de vue du processeur. ===La gestion de l'ECC=== L''''ECC''' peut être géré dans le contrôleur mémoire. Pour cela, on couple les registres mentionnés dans la section précédente, avec un circuit de détection et de correction d'erreur. Le circuit d'ECC peut, comme les registres synchrones, être intégré dans le contrôleur mémoire, ou au contraire être situé dans un circuit séparé. Si le circuit d'ECC est séparé du contrôleur mémoire, il communique avec lui, histoire que le contrôleur mémoire puisse signaler toute erreur de parité ou d'ECC au processeur. [[File:Controleur mémoire synchrone avec ECC intégré.png|centre|vignette|upright=2|Controleur mémoire synchrone avec ECC intégré]] Reprenons l'exemple du 8207 d'Intel. Le contrôleur mémoire 8207 gère le bus d'adresse et de commande, mais n'a pas de connexions directes avec le bus de données. Il ne peut donc pas prendre en charge l'ECC. Il avait besoin d'être couplé avec un circuit d'ECC séparé, relié au bus de données : l'Intel 8206. Le 8026 prenait en entrée : 16 bits de données et 8 bits d'ECC. Il fournissait en sortie 16 bits de données après correction d'erreur, les 8 bits d'ECC pour indiquer qu'une erreur a été détectée mais pas corrigée, ainsi que des bits de parité. Le 8206 détectait/corrigeait les erreurs et générait les bits d'ECC, mais il communiquait avec le contrôleur mémoire pour cela. [[File:8207 avec ECC.png|centre|vignette|upright=2|8207 avec ECC]] La détection/correction d'erreur était appliquée à la fois pour les accès mémoire et pour les rafraichissements mémoire. Lors d'un rafraichissement mémoire, la donnée rafraichie est lue et réécrite. Avec l'ECC activé et configuré correctement, le rafraichissement passe par le bus de données. Au lieu d'avoir un cycle de lecture-écriture interne à la DRAM, on a un cycle de lecture-correction-écriture qui utilise le 8206. La donnée lue est envoyée sur le bus de données, puis le 8206 corrige une éventuelle erreur, et la donnée corrigée est alors réécrite en mémoire. Au passage, si une erreur non-correctible est détectée, le 8206 ne fait rien, l'erreur est ignorée. La gestion de l'erreur sera retardée jusqu'à une lecture ultérieure. Et encore : si lecture ultérieure il y a. Si la donnée est écrasée par une écriture, la donnée corrompue sera simplement écrasée et disparaitra sans avoir pu faire le moindre dégât. Mais pour cela, le 8206 doit communiquer avec le contrôleur mémoire, pour savoir s'il est dans un cycle de rafraichissement ou un accès mémoire normal. Il prévient le 8207 lors d'une erreur, et c'est ce dernier qui décide si l'erreur doit être prise en compte ou ignorée. C'est seulement lors d'un accès mémoire normal que le processeur est prévenu qu'une erreur de parité/autre a eu lieu. ===Les contrôleurs mémoires multiports=== Les '''contrôleur mémoire multiport''' disposent de plusieurs ports, chacun permettant de traiter un accès mémoire. Ils peuvent simuler une mémoire multiport à partir d'une DRAM monoport. Évidemment, la simulation n'est pas parfaite. Des accès mémoire simultanés, envoyés en même temps sur différents ports, sont en réalité exécutés un par un, pas en même temps. Il y a donc une petite pénalité en termes de performances, mais elle est mineure. Encore une fois, nous allons reprendre l'exemple du 8207. Il avait deux ports séparés, et était prévu pour fonctionner dans un système à deux processeurs. L'usage de deux ports séparés permettait de partager une unique mémoire DRAM entre deux processeurs. Le partage se faisait en interfaçant deux processeurs sur le contrôleur mémoire, chacun étant connecté à un port. Lors d'une lecture, il redirigeait la donnée lue vers le bon processeur, en configurant le bus de données correctement. Le contrôleur mémoire recevait des requêtes mémoire de deux processeurs, mais il les exécutait une à la fois. S'il recevait deux requêtes en même temps, l'une d'entre elles était mise en attente. Le contrôleur mémoire doit arbitrer les accès à la mémoire, et faire en sorte que les deux processeurs aient accès à la mémoire à tour de rôle. Et non seulement il doit arbitrer les deux ports, mais il y a aussi un troisième port interne au contrôleur mémoire : le rafraichissement mémoire ! Pour cela, le circuit d'arbitrage qui choisissait entre rafraichissement mémoire et accès mémoire, est amélioré de manière à gérer un second port. Le circuit d'arbitrage donne l'accès au séquenceur mémoire à un port sélectionné. L'arbitrage était configurable, avec deux options : soit le port A est privilégié sur le port B, soit le port le plus récemment accédé à la priorité. Les deux ports pouvaient être configurés pour fonctionner soit de manière asynchrone, soit de manière synchrone. Il était aussi possible de configurer l'ECC, des options liées à la fréquence du processeur et de la RAM, ainsi que de nombreuses options liées au rafraichissement. Pour cela, le 8207 contenait un registre de configuration interne, programmable en fournissant les entrées adéquates. Tout ce qui vient d'être dit se généralise avec plus de deux processeurs. Le 8207 ne permettait pas ça, mais les contrôleurs mémoire des PC modernes en sont capables. Ils peuvent gérer plusieurs dizaines de processeurs facilement. ==Le contrôleur mémoire d'une DRAM ''Fast Page Mode''== Les mémoires DRAM classiques sont des mémoires à tampon de ligne, mais qui sont assez mal utilisées. Notamment, tout accès mémoire se fait en deux phases : un accès pour sélectionner la ligne, un autre pour sélectionner la colonne. Les mémoires ''Fast Page Mode'' permettent d'optimiser le tout. Elles permettent de faire plusieurs accès successifs à la même ligne, à des colonnes différentes. Et le contrôleur mémoire doit être adapté pour cela. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Le contrôleur mémoire doit détecter que deux accès mémoire consécutifs se font dans la même ligne. Si deux accès consécutifs accèdent à la même ligne, on doit juste changer de colonne et altérer le signal CAS. C'est un ''succès de tampon de ligne'', aussi appelé un '''succès de page'''. Si deux accès consécutifs accèdent à une ligne différente, c'est un ''défaut de tampon de ligne'', aussi appelé un '''défaut de page'''. Il faut alors changer de ligne, en altérant les signaux RAS et en envoyant une adresse de ligne. Pour détecter les succès ou défauts de page, il faut ajouter un circuit spécialisé dans le contrôleur mémoire. Il mémorise la ligne ouverte, et plus précisément son adresse de ligne (numéro de banque inclut). A chaque requête processeur, il compare l'adresse de ligne recue avec celle déjà ouverte. C'est un succès si les deux sont égales, un défaut si elles sont différentes. Le circuit qui fait cette comparaison est appelé le '''décodeur de commande'''. Il prévient le séquenceur mémoire en cas de succès de page, grâce à un signal de un bit, qui vaut 0 en cas de défaut de page et 1 en cas de succès. Le séquenceur mémoire décide alors comment gérer les signaux RAS et CAS, ainsi que l'envoi des adresses de ligne/colonne. [[File:Controleur mémoire d'une FPM-DRAM.png|centre|vignette|upright=2|Controleur mémoire d'une FPM-DRAM]] ==Le contrôleur mémoire d'une SDRAM ou d'une DDR== Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. En général, le contrôleur de SDRAM/DDR est intégré au processeur ou au ''chipset'' de la carte mère. Les mémoires SDRAM sont arrivées sur le marché à une époque où la miniaturisation des transistors était bien entamée. Les ''chipsets'' de carte mère étaient déjà bien complets et intégraient déjà de nombreux circuits, contrôleurs mémoire inclus. Il y a cependant eu quelques rares exceptions. Un exemple est celui du ''POWER 8 Memory Buffer'' d'IBM, qui était prévu pour fonctionner avec les processeurs Power8 d'IBM, des processeurs destinés aux serveurs. ===L'interface physique des SDRAM et son impact sur le contrôleur SDRAM=== Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. Contrairement aux mémoires DRAM basiques, les mémoires SDRAM sont cadencées par un signal d'horloge. Et ce signal d'horloge vient bien de quelque part. Pour cela, deux solutions : soit le contrôleur mémoire génère la fréquence qui commande la mémoire, soit il prend en entrée une fréquence de base qu'il multiplie pour obtenir la fréquence désirée. Les deux solutions sont équivalentes, si ce n'est que les circuits impliqués ne sont pas les mêmes. Dans le premier cas, le contrôleur doit embarquer un circuit oscillateur, qui génère la fréquence demandée. Dans l'autre cas, un simple multiplieur/diviseur de fréquence suffit et c'est généralement une PLL qui est utilisée pour cela. : Notez qu'il ne faut pas confondre la fréquence de la SDRAM et celle du contrôleur mémoire. Le contrôleur mémoire fonctionne à une vitesse assez élevée, en interne. Le port relié au processeur fonctionne à haute fréquence, généralement la même que celle du processeur. A vrai dire, de nos jours, il est intégré dans le processeur. Pour le décodage d'adresse, tout est plus simple sur les SDRAM/DDR. Les chips de mémoire SDRAM et DDR disposent d'une entrée ''Chip Select'', ce qui facilite grandement le décodage d'adresse. Les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et sont transmis sur le bus de commande. Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur une ou plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, pour un contrôleur de DRAM supportant maximum 8 rangées, 4 barrettes de 4 rangées chacune dépassent la limite. ===Le séquenceurs mémoire pour les SDRAM/DDR=== Le séquenceur mémoire existe toujours pour les mémoires SDRAM, c'est toujours un circuit séquentiel qui implémente une machine à état. Il traduit toujours une requête processeur en une séquence de commandes envoyées à des timings bien précis. Les commandes mémoires peuvent provenir de l'extérieur, mais aussi d'un circuit de rafraichissement intégré dans le contrôleur mémoire, comme pour les autres DRAM. La seule différence est que la machine à état est plus complexe. Pour rappel, une requête de lecture/écriture se fait en trois étapes maximum : une commande PRECHARGE pour précharger le tampon de ligne, une commande ACT qui fixe l'adresse de ligne, et enfin une commande READ/WRITE avec l'adresse de colonne. Et ces commandes sont séparées par des '''délais mémoire''' bien précis. Par exemple, je prends des chiffres arbitraires : il faut attendre 2 cycles entre une commande ACT et une commande READ, 6 cycles avant deux commandes WRITE consécutives, etc. La gestion des délais mémoire rend la conception du séquenceur plus complexe. Il faut aussi tenir compte des commandes SDRAM anticipées, à savoir que l'on peut envoyer des commandes avant que la précédente soit terminée. Les commandes anticipées sont idéales dans le cas où des accès successifs se font dans des banques différentes. Pour les exploiter au mieux, le contrôleur mémoire doit donc détecter si des accès successifs se font dans des banques différentes, ou dans la même banque, pour décider d'envoyer des commandes anticipées ou non, mais aussi pour gérer les succès/défauts de cache. Cette '''détection des conflits de banque''' complexifie le séquenceur. ===La détection des succès/défauts de page=== Un point important est que dans certaines conditions, certaines commandes peuvent être omises. Par exemple, en cas de succès de page, les commandes PRECHARGE et ACT ne doivent pas être envoyées, seules les commandes READ/WRITE le sont. Le contrôleur doit toujours '''détecter les succès et défauts de page''' et agir en fonction. La solution utilisée est la même que pour les mémoires FPM : il faut mémoriser quelle ligne est ouverte ou fermée. La différence avec les FPM est qu'il faut faire cela pour chaque banque mémoire ! En effet, chaque banque a son propre tampon de ligne, ce qui fait que la gestion des lignes se fait indépendamment dans chaque banque. Le séquenceur mémoire doit donc se souvenir des lignes actives dans chaque banque. Pour cela, il mémorise ces lignes dans une petite mémoire : la '''table des banques''', aussi appelée ''bank status memory''. Pour détecter un succès ou un défaut, le contrôleur doit extraire la ligne de l'adresse, mais aussi le numéro de banque. Il envoie alors le numéro de banque à la table des banques, sur son entrée d'adresse. Il récupère alors le numéro de la ligne active sur les sorties de données. Il compare alors ce numéro de ligne avec le numéro de ligne de l'adresse envoyée par le processeur. C'est un succès si les deux sont égales, un défaut sinon. [[File:Controleur mémoire FPM avec plusieurs banques.jpg|centre|vignette|upright=2|Contrôleur mémoire FPM avec plusieurs banques.]] ===La politique de gestion du tampon de ligne=== Pour ce qui est des succès/défauts de page, le séquenceur mémoire peut fonctionner de plusieurs manières, dont les plus extrêmes sont appelés la politique de la page fermée et la politique de la page ouverte. Voyons à quoi elles correspondent. Avec la '''politique de la page fermée''', chaque accès mémoire est suivi d'une commande PRECHARGE, qui ferme la ligne courante et précharge les lignes de bits. Même si deux accès consécutifs se font dans la même ligne, la ligne est fermée et ré-ouverte entre deux accès mémoire. En clair : l'optimisation introduite par les mémoires FPM est désactivée, le contrôleur mémoire fait exprès de ne pas en profiter. On appelle cette méthode la close ''page autoprecharge''. Cette méthode réduit grandement les performances pour les accès à des adresses consécutives, mais fonctionne à merveille si les accès sont "aléatoires", à savoir qu'ils se font sans régularités évidentes. Un exemple classique est celui où plusieurs processeurs accèdent à la même mémoire RAM, mais accèdent à des données très éloignées en mémoire (ce n'est pas toujours le cas, mais ça l'est dans cet exemple). Leurs accès sont dispersés en mémoire, ce qui fait qu'il est rare qu'ils accèdent deux fois de suite à la même ligne. Utiliser la politique de la page fermée améliore les performances, dans ce cas précis. Un autre avantage est que l'implémentation du séquenceur mémoire est très simple. En effet, le séquenceur mémoire se passe complétement de la table des banques, du comparateur de ligne, et de tous les circuits nécessaires pour vérifier les succès ou défauts de page. De plus, le séquenceur mémoire profite grandement des commandes READA et WRITEA, qui fusionnent une commande READ/WRITE avec une commande PRECHARGE. Le séquenceur mémoire a juste à envoyer des commandes ACT, READA, WRITEA et PREFETCH à la mémoire, pas besoin des commandes PRECHARGE, READ ou WRITE. Et ce détail simplifie grandement la conception du séquenceur mémoire. À l'opposé, la '''politique de la page ouverte''' ne ferme pas automatiquement la ligne. Elle la laisse ouverte, en espérant que le prochain accès mémoire se fasse dans cette ligne. Lorsqu'un nouvel accès mémoire arrive, elle doit détecter les succès ou défauts de page et agir en fonction. En cas de défaut de page, la ligne est fermée, le séquenceur mémoire envoie une commande PRECHARGE, puis l'accès suivant effectue les deux commandes ACT + READ ou WRITE. En cas de succès de page, les commandes PRECHARGE et ACT ne sont pas envoyées, seules la commande READ ou WRITE l'est. Un désavantage est que le contrôleur mémoire doit inclure une table des banques et un comparateur, comme vu plus haut dans la section sur les mémoires FPM. Un autre défaut est que garder une ligne ouverte consomme beaucoup d'énergie, comparé à un simple état de PRECHARGE. En conséquence, il est préférable de fermer les lignes dès que possible. Par contre, les performances sont d'autant meilleures que les accès mémoire consécutifs à une même ligne soient assez fréquents. Si les accès mémoire sont aléatoires, les performances sont moins bonnes. La politique de la page fermée fermait les lignes en avance, avec des commandes READA ou WRITEA, avant même que l'accès suivant démarre. Avec la politique de la page ouverte, on doit attendre pour détecter un défaut de page, puis fermer la ligne avec une commande PRECHARGE séparée. La ligne est donc fermée avec un peu temps de retard, et envoyer deux commandes au lieu d'une prend plus de temps. : Les lignes ne restent pas ouvertes indéfiniment, elles sont automatiquement fermées lorsqu'elles sont rafraichies. Vu que c'est le contrôleur mémoire qui décide du rafraichissement mémoire, il sait quelles lignes sont rafraichies à quel moment. Et il sait donc quand elles sont fermées. Les contrôleurs mémoires basiques utilisent une des deux solutions précédentes. Soit la page est toujours fermée, soit elle est toujours laissée ouverte jusqu'à ce qu'un accès mémoire la referme. Mais les contrôleurs plus évolués utilisent des '''politiques hybrides''', capables de switcher entre les deux suivant la situation. La méthode la plus simple laisse une ligne ouverte un temps prédéterminé avant de fermer la ligne. Il existe aussi des '''politiques prédictives'''. En clair, il, qui tentent de prédire s'il faut fermer ou laisser ouvertes les pages ouvertes. Elles regardent, pour les N derniers accès, s'ils ont fait un succès ou un défaut de page. Mémoriser les N derniers accès demande d'utiliser un simple registre à décalage de N bits, chaque bit indiquant si le énième accès précédent a été un succès de page ou non. Pour chaque valeur de ce registre, il faut prédire si le prochain accès demandera une ouverture ou une fermeture. Une prédiction simple fait la moyenne des bits à 1 dans ce registre et ferme la page si elle est inférieure à 1/2. Pour améliorer un petit peu l'algorithme, on peut faire en sorte que les bits des accès mémoires les plus récents aient plus de poids dans le calcul de la moyenne. Il existe sans doute d'autres solutions plus évoluées, mais il est difficile de savoir ce qu'il y a dans les contrôleurs de SDRAM modernes. : Le fait de laisser ouverte une ligne ou au contraire de la fermer systématiquement, se fait pour chaque banque. ===Les caches intégrés aux contrôleurs de SDRAM=== Il arrive que des contrôleurs de SDRAM intègrent des mémoires caches. Cela peut sembler étrange, car les mémoires caches sont censées être soit dans le processeur, soit entre le processeur et le contrôleur de SDRAM. Mais ces caches sont un peu différents des caches du processeur : ils servent à mettre en attente les écritures, ils ne servent à rien pour les lectures. L'idée est la suivante : quand le processeur lance une écriture dans la RAM, l'écriture est mise en attente dans ce cache. Les lectures consultent ce cache, dans le cas où la donnée à lire soit dedans, mais elles ne chargent pas de données dans le cache. Seules les écritures copient des données dans ce cache. L'intérêt est multiple. Le premier est que cela rend certaines lectures plus rapides. Quand on relit une donnée récemment écrite, la donnée est encore dans le cache, et elle est relue depuis le cache, sans passer par la RAM. Le résultat est qu'on a économisé un peu de bande passante, on n'a pas besoin d’accéder à la RAM pour cette lecture. Et la lecture est plus rapide. Mais ce n'est pas l'intérêt principal, car de telles situations sont assez rares. La vraie optimisation est que cela permet de faire des écritures en bloc, idem pour les lectures. Les écritures sont retardées, elles se font quand le cache est plein. Le cache est alors vidé d'un seul coup en mémoire RAM, en bloc. De plus, entre deux vidanges du cache, la mémoire RAM ne voit que des lectures. Le résultat est que ce cache permet de regrouper les lectures ensemble, et les écritures ensemble. Or, nous avons vu dans le chapitre précédent qu'alterner entre lectures et écriture entraine une performance sous-optimale. Les SDRAM préfèrent enchainer une succession de lecture ou une succession d’écriture, ce que permet ce cache. La présence de ce cache permet d'ajouter d'autres optimisations au contrôleur mémoire. Par exemple, le contrôleur mémoire peut fusionner plusieurs écritures dans la même adresse en une seule. Par exemple, si une écriture modifie une adresse, et qu'une écriture ultérieure écrit une autre valeur à la même adresse, seule la dernière écriture est envoyée à la mémoire RAM. Le contrôleur mémoire peut aussi regrouper plusieurs accès à des adresses consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les écritures mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une écriture en rafale. Les deux optimisations, bien que différentes sur le fond, et n'ayant rien à voir, portent pourtant le même nom. Elles sont appelées la '''combinaison d'écriture'''. L'optimisation ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Un autre exemple est le ''POWER 8 Memory Buffer'' d'IBM, mentionné plus haut. Il intégrait une mémoire de type eDRAM (de la RAM dans un circuit imprimé), 16 mébioctets en tout. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires RAM dynamiques (DRAM) | prevText=Les mémoires RAM dynamiques (DRAM) | next=Les mémoires associatives | nextText=Les mémoires associatives }} </noinclude> n0074hy00w7188qhr5mp74ihh19trkz Fonctionnement d'un ordinateur/Le parallélisme mémoire 0 65888 764834 764821 2026-04-24T12:11:38Z Mewtow 31375 /* Les optimisations liées à la présence de plusieurs banques */ 764834 wikitext text/x-wiki Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre. Pour donner un exemple, il est possible de pipeliner les accès mémoire. Il est possible de pipeliner l'accès au cache et/ou l'accès à la mémoire, et nous verrons comment faire dans ce chapitre. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, qu'ils aient ou non un pipeline dynamique. Par contre, pipeliner la mémoire est une technique ancienne, aujourd'hui peu utilisée. Elle était utilisée sur des très vieux ordinateurs, qui avaient un pipeline mais pas de mémoire cache. Mais de nos jours, les mémoires SDRAM et DDR ne sont pas adaptées pour ça, il est très difficile de les pipeliner correctement. Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Par exemple, un processeur ''in-order'' avec des lectures non-bloquantes peut e, profiter. Il peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. À l'opposé, les processeurs sans lectures non-bloquantes profitent pas du parallélisme mémoire. À la rigueur, ils peuvent en profiter s'ils intègrent des techniques de préchargement. Pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand-chose. ==Le ''line fill buffer'' et les techniques associées== Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache. Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache. La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache. Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache. ===L'''early restart'' et le ''critical word load''=== La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante. Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin. Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible. Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire. ==Les caches pipelinés== Il est possible de pipeliner l'accès au cache, ce qui demande juste de rajouter des registres au bon endroits et quelques circuits de contrôle. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique. Et l'implémentation peut se faire de plusieurs manières différentes. Il faut dire que découper une mémoire cache en plusieurs étapes peut se faire de plusieurs manière. Commençons par la plus simple. Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres. Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline. ===Le ''pipelining'' des caches ''direct-mapped''=== Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près. [[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]] Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire. [[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]] Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs. : Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache. ===Le ''pipelining'' des caches splittés/sériels=== Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner. Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ? ==Les caches non bloquants== Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps. ===Les ''Miss Handling Status Registers''=== Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA. Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache. L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''. Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes : * Le numéro de la ligne de cache dans laquelle les données sont chargées. * Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu. * Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture. ** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''. ** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire. Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés). ===Les accès simultanés à une même ligne de cache=== Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''. Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter. La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation. Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire. Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui. ===Les MSHR simples=== Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent. Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde. L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser ===Les MSHR adressés implicitement=== Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient. Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum : * Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire. * Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture. * Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire. La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps. ===Les MSHR adressés explicitement=== Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''. L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand. L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO). ===Les MSHRs inversés=== Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés. Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente. ===Les MSHR intégrés au cache=== Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache. Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache. ==L'entrelacement mémoire== Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique. La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline. ===Utiliser plusieurs banques sans entrelacement=== Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Il s'agit de ce qui s'appelle un arrangement horizontal, et nous avions vu celui-ci dans le chapiutre sur les mémoires SDRAM. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} L'entrelacement change cette répartition, afin d'accélérer les accès mémoire. L'entrelacement classique vise à améliorer les accès à des adresses mémoires consécutives, mais des formes plus évoluées d'entrelacement visent à optimiser des accès mémoire arbitraires. Voyons-les dans l'ordre, du plus simple au plus complexe. ===L'entrelacement classique=== Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques consécutives. Précisons que cette attribution des adresses n'implique absolument pas la mémoire virtuelle ou n'importe quel mécanisme dans le processeur. La répartition décide que telle adresse mémoire va dans telle banque, à telle adresse dans la banque. Elle est donc le fait du contrôleur mémoire, donc en dehors du processeur (les contrôleurs mémoires n’étaient pas encore intégrés dans le processeur à l'époque). [[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]] L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. [[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]] L'animation suivante illustre bien le processus, avec quatres banques. [[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]] L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire. [[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]] Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas. L'entrelacement classique pourrait être utilisé pour accélérer les transferts entre mémoire RAM et cache, qui se font en blocs d'adresses consécutives. Mais de nos jours, il n'est pas utilisé dans cette optique. Il faut dire qu'il est redondant avec le mode rafale des mémoires DRAM. Les deux font globalement la même chose et on voit mal comment utiliser les deux en même temps. Le mode rafale étant plus simple à implémenter, et plus léger niveau utilisation du bus de commande mémoire, il est préféré à l'entrelacement. Par contre, l'entrelacement a eu son heure de gloire sur d'anciens processeurs qui n'avaient pas de mémoire cache, alors qu'ils disposaient d'un pipeline. L'exemple typique est celui des nombreux ''processeurs vectoriels'', que nous n'avons pas encore abordé à ce stade du cours. De tels processeurs avaient un pipeline, une unité de calcul fortement pipelinée, et parfois même de l'exécution dans le désordre et du renommage de registres ! ===L'entrelacement par décalage=== L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en enjambée (en ''stride''), où l'on accède en série à des adresses sont séparées par N mots mémoires. [[File:Accès par enjambées.png|centre|vignette|upright=2|Accès par enjambées.]] De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Un cas classique est celui du parcours d'une matrice colonne par colonne. Les matrices de nombres sont mémorisées ligne par ligne, ce qui fait que parcourir une colonne demande de passer d'une ligne à la suivante et de faire des grands sauts en mémoire RAM, mais tous espacés par la même distance. Avec l'entrelacement simple, les accès en enjambée sont moins performants que les accès à des adresses consécutives, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Mais en dehors de ce cas, on voit une amélioration par rapport à la situation sans entrelacement. Pour obtenir des performances maximales pour les accès en enjambées, il faut répartir les mots mémoires dans la mémoire autrement. L'organisation idéale est la suivante. : Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début. [[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]] En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes : * adresse à envoyer à la banque = adresse totale / N ; * numéro de la banque = (adresse + décalage) modulo N ; * décalage = (adresse totale * P) mod N. Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Malgré ce défaut, la technique a été utilisée sur quelques ordinateurs, avec l'exemple notable du superordinateur ''Burroughs Scientific Processor''. Pour éviter cela, il y a plusieurs solutions. Par exemple, on peut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Mais en pratique, elles n'ont pas vraiment été implémentées dans une vraie machine, et sont restées à l'état de recherche, aussi je les passe sous silence. ===L'entrelacement pseudo-aléatoire=== Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque. Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. ==Les contrôleurs SDRAM/DDR avec "exécution dans le désordre"== Après avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM, et leurs contrôleurs mémoire en font tout autant. C'est une différence majeure avec les mémoires asynchrones FPM/EDO, qui n'acceptaient qu'un seul accès mémoire à la fois. Leur contrôleur mémoire n'acceptait qu'un seul accès mémoire à la fois, c'était un contrôleur mémoire bloquant. Les contrôleurs mémoires des SDRAM sont eux non-bloquants et peuvent encaisser une dizaine d'accès mémoire à la fois. Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. ===Rappel sur les SDRAM : tampon de ligne et commandes=== Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture. [[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]] Les accès mémoire sont traduits par un séquenceur mémoire en une série de commandes mémoires, qui sont séparées par des délais mémoire de quelques cycles d'horloge. Les délais sont très précis, et sont à respecter à la lettre. Une lecture ou une écriture se fait en maximum trois commandes : une commande PRECHARGE qui ferme la ligne précédemment utilisée, une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne et éventuellement la donnée à écrire. : Pour être plus précis, la commande PRECHARGE précharge les lignes de bits du plan mémoire à une tension particulière, ce qui les vide de leur contenu. Mais c'est un détail sans importance pour ce qui va suivre. Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans. Si un accès mémoire accède à une ligne déjà activée, on dit que c'est un '''succès de page'''. Si ce n'est pas le cas, on doit fermer la ligne courante, rouvrir la ligne vboulue, et préciser la colonne. C'est alors un '''défaut de page'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | bgcolor="#FFA0FF" | PRECHARGE || bgcolor="#FFA0FF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#A0FFFF" | READ (2) || bgcolor="#A0FFFF" | READ (3) || || || bgcolor="#A0FFFF" | READ (4) || bgcolor="#A0FFFF" | READ (5) || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | Donnée READ 1 || ||bgcolor="#A0FFFF" | Donnée READ 2 | bgcolor="#A0FFFF" | Donnée READ 3 || || || bgcolor="#A0FFFF" | Donnée READ 4 || bgcolor="#A0FFFF" | Donnée READ 5 |} Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Mais le respect des délais mémoire est très limitant, ce qui fait qu'on ne peut pas parler de réel pipeline, comme c'est le cas sur les processeurs. Parlons plutot de '''commandes anticipées'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Un dernier point est que les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] ===La mise en attente des accès mémoire=== Un contrôleur de SDRAM peut accepter plusieurs accès mémoire en même temps. Mais cela ne signifie pas que le contrôleur sera prêt à les traiter immédiatement. Pour éviter tout problème de disponibilité, le contrôleur met en attente les accès mémoire que le processeur lui envoie, pour les exécuter dès que possible. Les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée, notamment pour renvoyer les lectures dans l'ordre demandé. Il y a aussi une mémoire FIFO pour les données à écrire et une FIFO pour les données lues. Cette dernière sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue. [[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]] Des optimisations sont possibles dès la mémoire FIFO. Par exemple, on peut regrouper plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures. L'optimisation précédente ne paraissent pas payer de mine, mais elles deviennent plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870 - Scalable Memory Controller'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Deux pages mémoire si la mémoire virtuelle utilise des pages de 4 kibioctets ! ===Les lectures anticipées : une forme d'OOO mémoire=== La mise en attente des accès mémoire est une optimisation intéressante, mais pas mirifique. Elle permet surtout de ne pas bloquer le processeur si le contrôleur mémoire a du travail sur la planche. Cependant, elle peut être optimisée quand on se rend compte d'une chose : le processeur ne voit que les lectures, pas les écritures. Pour les écritures, il les envoie au contrôleur mémoire et ce dernier fait le travail demandé, le processeur n'est pas prévenu quand une écriture se termine. Mais pour les lectures, c'est différent, car il reçoit la donnée lue. En conséquence, il est possible d'optimiser les écritures sans que le processeur ne voit quoique ce soit. Une optimisation possible est alors de changer l'ordre des accès mémoire, histoire de retarder les écritures ou au contraire de les faire en avance. La raison est que les mémoires SDRAM n'aiment pas quand on alterne lectures et écritures. Les délais mémoire, les fameux ''timings'' mémoire, sont clairs : faire une suite de lecture ou une suite d'écriture est plus performant que d'alterner entre lectures et écritures. L'idée est alors de changer l'ordre des écritures de manière à les faire en bloc, idem pour les lectures. L’optimisation est possible, mais à condition que le processeur n'y verra que du feu. Or, vous l'avez deviné, il y a des cas où ces réorganisations ne sont pas possibles, et vous avez sans doute trouvé que la situation était familière. L'optimisation en question est une forme d'exécution dans le désordre des accès mémoire, réalisée par le contrôleur mémoire lui-même ! Et qui dit exécution dans le désordre dit : problèmes liés aux dépendances de données. Changer l'ordre des écritures n'est pas toujours possible, notamment en raison des dépendances RAW, WAR et WAW. Pour que le processeur n'y voit que du feu, il faut respecter plusieurs critères. Premièrement, les lectures doivent être renvoyées au processeur dans l'ordre. Et quand je dis dans l'ordre, cela veut dire : dans l'ordre d'envoi des lectures au contrôleur mémoire. Les écritures aussi doivent se faire dans l'ordre, histoire qu'une série d'écriture donne le bon résultat final. Le troisième critère est qu'une lecture doit donner le résultat de la dernière écriture ''à la même adresse''. Pour le dire autrement, il faut juste détecter les dépendances RAW. Concrètement, si on a une série de lectures et d'écritures alternées, on peut regrouper les lectures et les écritures dans deux paquets séparés, à condition qu'aucune lecture ne lise une adresse écrite par une écriture. Mais si une lecture est dépendante d'une écriture, alors la lecture doit attendre que l'écriture se termine, idem pour les lectures suivantes. Une implémentation basique remplace la mémoire FIFO vue au-dessus, par deux mémoires FIFOs : une pour les lectures, une pour les écritures. Lorsqu'un accès mémoire arrive au séquenceur, il regarde si c'est une lecture ou une écriture et place l'accès mémoire dans la file adéquate. Le fait que ce soit des FIFOs garantit que les lectures se font dans l'ordre, idem pour les écritures. En sortie des deux FIFOs, le séquenceur mémoire détecte les dépendances RAW. Précisément, quand une lecture sort de la mémoire FIFO, il consulte la file d'attente des écriture pour voir si la lecture est dépendante d'une écriture en attente. La lecture attend si c'est le cas, et les écritures sont exécutées à la place. Séparer lectures et écriture est une source d'optimisation. Il est par exemple possible d'utiliser le réacheminement lecture sur écriture (''Store to load forwarding''). Il s'agit d'un équivalent de l’optimisation du même nom, utilisée dans le cadre de la désambiguïsation mémoire. Imaginez qu'une lecture accède à une donnée pas encore écrite, en attente dans le contrôleur mémoire. C'est une dépendance RAW assez claire. Dans ce cas, le contrôleur mémoire peut renvoyer la donnée directement depuis ses mémoires FIFOs, sans faire d'accès mémoire en lecture. Le contrôleur mémoire a tendance à privilégier les lectures, car celles-ci sont cruciales pour l'exécution dans le désordre. Plus elles se font tôt, plus vite le processeur recevra les données et pourra démarrer les instructions dépendantes de cette donnée. Le séquenceur a donc tendance à piocher en priorité dans la file de lecture, plutôt que dans la file d'écriture. A vrai dire, dans le cas idéal, les écritures ne sont faites que quand la file d'écriture est pleine ou quasi-pleine... Prenons l'exemple des coprocesseurs IO 81341 et 81342, qui étaient en réalité des ''chipsets'' intégrant un contrôleur SDRAM. Le ''chipset'' avait 5 ports : un pour les processeurs, un pour le pont sud (''southbridge'') et trois pour des canaux DMA. Pour le port processeur, il n'y avait pas de réordonnancement et ce port utilisait une seule mémoire FIFO. Les autres ports utilisaient l'optimisation qu'on vient de voir, et avaient vraisemblablement des files séparées pour les lectures et écritures. Le séquenceur mémoire vérifiait les dépendances mémoire de type RAW et autres. [[File:Double file d'attente pour les lectures et écritures.png|centre|vignette|upright=2.5|Double file d'attente pour les lectures et écritures]] ===Le ré-ordonnancement des commandes mémoires=== L'optimisation précédente est peu poussée, comparé aux formes d'exécution dans le désordre que les processeurs utilisent. Et on peut se demander si une exécution dans le désordre plus poussée est possible. La réponse est oui : un contrôleur mémoire peut faire des réorganisations bien plus poussées. Par contre, il faut faire une précision très importante : le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre. Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. Maintenant que ces précisions sont faites, posons cette question : dans quelles situations est-il pertinent de faire des accès mémoire dans le désordre ? La réponse est : quand plusieurs accès à une même ligne ne sont pas consécutifs, qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire à une même ligne sont exécutés l'un à la suite de l'autre, ce qui est beaucoup plus rapide. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants : * Une lecture ligne A ; * PRECHARGE + ACT ; * Une écriture ligne B ; * PRECHARGE + ACT ; * Une lecture ligne A. Sans réordonnancent, on doit émettre deux commandes PRECHARGE quand on passe d'une ligne à l'autre, et il faut ajouter les commandes ACT avec. pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. le résultat est alors le suivant : * Lecture ligne A ; * Lecture ligne A * PRECHARGE + ACT ; * Une écriture ligne B. On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Et encore une fois, il faut éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, les dépendances RAW posent problème ! L'implémentation est assez simple : la ou les mémoires FIFOs précédentes sont remplacées par des mémoires similaires aux fenêtres d'instruction. Le contrôleur mémoire vérifie à chaque cycle les accès en attente, et vérifie à quelle ligne ils accèdent. Il priorise alors les accès qui tombent dans la ligne ouverte : ceux-là sont exécutés avant les autres. S'il n'y en a pas, il prend l'accès mémoire le plus ancien (ordre FIFO). Il teste aussi les dépendances mémoires RAW avant d'envoyer des commandes à la mémoire DDR/SDRAM. une telle solution est appelée l''''algorithme ''FR-FCFS''''' (''First Ready-First Come First Serve''). ===Les optimisations liées à la présence de plusieurs banques=== Les optimisations précédentes sont décuplées par la présence de plusieurs banques dans la mémoire SDRAM. Il est en effet possible de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. La seule contrainte est que la SDRAM est limitée à 4 banques actives en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || |- ! Banque Numéro 3 | || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || |} Les optimisations précédentes peuvent s'appliquer par banque. Il est par exemple possible d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème, car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs. Il y a cependant un risque que les lectures se fassent dans le désordre si on n'y prend pas garde. [[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]] Il est aussi possible d'utiliser une file séparée pour les lectures et les écritures, pour chaque banque. Les performances sont alors améliorées comparé à deux files globales pour toute la SDRAM. En idem avec la réorganisation des accès mémoire, pour regrouper les accès à une même ligne. Un problème avec ces optimisations est qu'il est rare que des accès mémoire se fassent dans des banques séparées. Les accès mémoire tendent à se faire avec une bonne localité spatiale, ce qui fait qu'ils tombent dans une même banque. Heureusement, les contrôleurs SDRAM/DDR modernes incorporent des optimisations pour corriger ce problème. Les optimisations en question sont une forme d'entrelacement adaptée aux mémoires SDRAM. L'entrelacement naïf ne marche pas à cause de la présence du tampon de ligne. Cependant, il peut y avoir un entrelacemententre banques SDRAM. Voyons ce que ca veut dire. L''''entrelacement de banques''' répartit deux lignes consécutives dans deux banques différentes. Pour comprendre l'idée, prenons un exemple. Imaginons une mémoire avec deux banques et 4 lignes. Imaginons qu'on parcoure/balaye la mémoire RAM en partant des adresses basses. Sans entrelacement de ligne, les accès se feront comme suit, de gauche à droite : {|class="wikitable" |+ Adresse mémoire |- ! colspan="4" | Banque numéro 1 !! colspan="4" | Banque numéro 2 |- | Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 || Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 |} Avec l'entrelacement de banques, les accès se feront comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 |- | Ligne 1 || Ligne 1 || Ligne 2 || Ligne 2 || Ligne 3 || Ligne 3 || Ligne 4 || Ligne 4 |} L'avantage est que passer d'une ligne à la suivante est plus rapide. Pas besoin de fermer la ligne pour passer à la suivante, on ouvre directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Sans entrelacement, les adresses mémoire sont découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- | Adresse de banque || Adresse de ligne || Adresse de colonne |} Avec l'entrelacement de banques, l'adresse est découpée comme suit. {|class="wikitable" |+ Adresse mémoire |- | Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet) |} Il est aussi possible de faire la même chose, mais avec les rangées ou en utilisant du ''dual channel'', mais je vais passer cela sous silence. Toujours est-il que les méthodes d'entrelacement sont nombreuses et chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant. L'entrelacement est géré juste avant le séquenceur mémoire, dans un '''circuit d'entrelacement'''. Ce dernier intervertit certains bits de l'adresse lors des accès mémoires. [[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]] Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=La désambiguïsation mémoire | prevText=La désambiguïsation mémoire | next=Les processeurs superscalaires | nextText=Les processeurs superscalaires }} </noinclude> 3fabmkxa69wh0iyxmftj3dx9sk81vyh 764836 764834 2026-04-24T12:12:50Z Mewtow 31375 /* Les contrôleurs SDRAM/DDR avec "exécution dans le désordre" */ 764836 wikitext text/x-wiki Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre. Pour donner un exemple, il est possible de pipeliner les accès mémoire. Il est possible de pipeliner l'accès au cache et/ou l'accès à la mémoire, et nous verrons comment faire dans ce chapitre. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, qu'ils aient ou non un pipeline dynamique. Par contre, pipeliner la mémoire est une technique ancienne, aujourd'hui peu utilisée. Elle était utilisée sur des très vieux ordinateurs, qui avaient un pipeline mais pas de mémoire cache. Mais de nos jours, les mémoires SDRAM et DDR ne sont pas adaptées pour ça, il est très difficile de les pipeliner correctement. Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Par exemple, un processeur ''in-order'' avec des lectures non-bloquantes peut e, profiter. Il peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. À l'opposé, les processeurs sans lectures non-bloquantes profitent pas du parallélisme mémoire. À la rigueur, ils peuvent en profiter s'ils intègrent des techniques de préchargement. Pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand-chose. ==Le ''line fill buffer'' et les techniques associées== Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache. Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache. La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache. Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache. ===L'''early restart'' et le ''critical word load''=== La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante. Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin. Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible. Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire. ==Les caches pipelinés== Il est possible de pipeliner l'accès au cache, ce qui demande juste de rajouter des registres au bon endroits et quelques circuits de contrôle. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique. Et l'implémentation peut se faire de plusieurs manières différentes. Il faut dire que découper une mémoire cache en plusieurs étapes peut se faire de plusieurs manière. Commençons par la plus simple. Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres. Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline. ===Le ''pipelining'' des caches ''direct-mapped''=== Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près. [[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]] Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire. [[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]] Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs. : Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache. ===Le ''pipelining'' des caches splittés/sériels=== Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner. Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ? ==Les caches non bloquants== Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps. ===Les ''Miss Handling Status Registers''=== Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA. Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache. L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''. Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes : * Le numéro de la ligne de cache dans laquelle les données sont chargées. * Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu. * Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture. ** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''. ** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire. Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés). ===Les accès simultanés à une même ligne de cache=== Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''. Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter. La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation. Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire. Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui. ===Les MSHR simples=== Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent. Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde. L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser ===Les MSHR adressés implicitement=== Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient. Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum : * Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire. * Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture. * Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire. La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps. ===Les MSHR adressés explicitement=== Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''. L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand. L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO). ===Les MSHRs inversés=== Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés. Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente. ===Les MSHR intégrés au cache=== Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache. Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache. ==L'entrelacement mémoire== Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique. La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline. ===Utiliser plusieurs banques sans entrelacement=== Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Il s'agit de ce qui s'appelle un arrangement horizontal, et nous avions vu celui-ci dans le chapiutre sur les mémoires SDRAM. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} L'entrelacement change cette répartition, afin d'accélérer les accès mémoire. L'entrelacement classique vise à améliorer les accès à des adresses mémoires consécutives, mais des formes plus évoluées d'entrelacement visent à optimiser des accès mémoire arbitraires. Voyons-les dans l'ordre, du plus simple au plus complexe. ===L'entrelacement classique=== Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques consécutives. Précisons que cette attribution des adresses n'implique absolument pas la mémoire virtuelle ou n'importe quel mécanisme dans le processeur. La répartition décide que telle adresse mémoire va dans telle banque, à telle adresse dans la banque. Elle est donc le fait du contrôleur mémoire, donc en dehors du processeur (les contrôleurs mémoires n’étaient pas encore intégrés dans le processeur à l'époque). [[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]] L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. [[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]] L'animation suivante illustre bien le processus, avec quatres banques. [[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]] L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire. [[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]] Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas. L'entrelacement classique pourrait être utilisé pour accélérer les transferts entre mémoire RAM et cache, qui se font en blocs d'adresses consécutives. Mais de nos jours, il n'est pas utilisé dans cette optique. Il faut dire qu'il est redondant avec le mode rafale des mémoires DRAM. Les deux font globalement la même chose et on voit mal comment utiliser les deux en même temps. Le mode rafale étant plus simple à implémenter, et plus léger niveau utilisation du bus de commande mémoire, il est préféré à l'entrelacement. Par contre, l'entrelacement a eu son heure de gloire sur d'anciens processeurs qui n'avaient pas de mémoire cache, alors qu'ils disposaient d'un pipeline. L'exemple typique est celui des nombreux ''processeurs vectoriels'', que nous n'avons pas encore abordé à ce stade du cours. De tels processeurs avaient un pipeline, une unité de calcul fortement pipelinée, et parfois même de l'exécution dans le désordre et du renommage de registres ! ===L'entrelacement par décalage=== L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en enjambée (en ''stride''), où l'on accède en série à des adresses sont séparées par N mots mémoires. [[File:Accès par enjambées.png|centre|vignette|upright=2|Accès par enjambées.]] De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Un cas classique est celui du parcours d'une matrice colonne par colonne. Les matrices de nombres sont mémorisées ligne par ligne, ce qui fait que parcourir une colonne demande de passer d'une ligne à la suivante et de faire des grands sauts en mémoire RAM, mais tous espacés par la même distance. Avec l'entrelacement simple, les accès en enjambée sont moins performants que les accès à des adresses consécutives, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Mais en dehors de ce cas, on voit une amélioration par rapport à la situation sans entrelacement. Pour obtenir des performances maximales pour les accès en enjambées, il faut répartir les mots mémoires dans la mémoire autrement. L'organisation idéale est la suivante. : Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début. [[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]] En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes : * adresse à envoyer à la banque = adresse totale / N ; * numéro de la banque = (adresse + décalage) modulo N ; * décalage = (adresse totale * P) mod N. Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Malgré ce défaut, la technique a été utilisée sur quelques ordinateurs, avec l'exemple notable du superordinateur ''Burroughs Scientific Processor''. Pour éviter cela, il y a plusieurs solutions. Par exemple, on peut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Mais en pratique, elles n'ont pas vraiment été implémentées dans une vraie machine, et sont restées à l'état de recherche, aussi je les passe sous silence. ===L'entrelacement pseudo-aléatoire=== Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque. Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. ==Les contrôleurs SDRAM/DDR avec "exécution dans le désordre"== Après avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM, et leurs contrôleurs mémoire en font tout autant. C'est une différence majeure avec les mémoires asynchrones FPM/EDO, qui n'acceptaient qu'un seul accès mémoire à la fois. Leur contrôleur mémoire n'acceptait qu'un seul accès mémoire à la fois, c'était un contrôleur mémoire bloquant. Les contrôleurs mémoires des SDRAM sont eux non-bloquants et peuvent encaisser une dizaine d'accès mémoire à la fois. Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. ===Rappel sur les SDRAM : tampon de ligne et commandes=== Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture. [[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]] Les accès mémoire sont traduits par un séquenceur mémoire en une série de commandes mémoires, qui sont séparées par des délais mémoire de quelques cycles d'horloge. Les délais sont très précis, et sont à respecter à la lettre. Une lecture ou une écriture se fait en maximum trois commandes : une commande PRECHARGE qui ferme la ligne précédemment utilisée, une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne et éventuellement la donnée à écrire. : Pour être plus précis, la commande PRECHARGE précharge les lignes de bits du plan mémoire à une tension particulière, ce qui les vide de leur contenu. Mais c'est un détail sans importance pour ce qui va suivre. Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans. Si un accès mémoire accède à une ligne déjà activée, on dit que c'est un '''succès de page'''. Si ce n'est pas le cas, on doit fermer la ligne courante, rouvrir la ligne voulue, et préciser la colonne. C'est alors un '''défaut de page'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | bgcolor="#FFA0FF" | PRECHARGE || bgcolor="#FFA0FF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#A0FFFF" | READ (2) || bgcolor="#A0FFFF" | READ (3) || || || bgcolor="#A0FFFF" | READ (4) || bgcolor="#A0FFFF" | READ (5) || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | Donnée READ 1 || ||bgcolor="#A0FFFF" | Donnée READ 2 | bgcolor="#A0FFFF" | Donnée READ 3 || || || bgcolor="#A0FFFF" | Donnée READ 4 || bgcolor="#A0FFFF" | Donnée READ 5 |} Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Mais le respect des délais mémoire est très limitant, ce qui fait qu'on ne peut pas parler de réel pipeline, comme c'est le cas sur les processeurs. Parlons plutôt de '''commandes anticipées'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Un dernier point est que les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] ===La mise en attente des accès mémoire=== Un contrôleur de SDRAM peut accepter plusieurs accès mémoire en même temps. Mais cela ne signifie pas que le contrôleur sera prêt à les traiter immédiatement. Pour éviter tout problème de disponibilité, le contrôleur met en attente les accès mémoire que le processeur lui envoie, pour les exécuter dès que possible. Les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée, notamment pour renvoyer les lectures dans l'ordre demandé. Il y a aussi une mémoire FIFO pour les données à écrire et une FIFO pour les données lues. Cette dernière sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue. [[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]] Des optimisations sont possibles dès la mémoire FIFO. Par exemple, on peut regrouper plusieurs accès à des données consécutives en un seul accès en rafale. Le contrôleur mémoire analyse les requêtes mises en attente et détecte si certaines se font à des adresses consécutives. Si c'est le cas, il fusionne ces requêtes en une lecture/écriture en rafale. Une telle optimisation est appelée la '''combinaison de lecture''' pour les lectures, et la '''combinaison d'écriture''' pour les écritures. L'optimisation précédente ne paraît pas payer de mine, mais elle devient plus compréhensible quand on sait que certains contrôleurs mémoire peuvent mettre en attente beaucoup de données. Par exemple, l'''Intel E8870 - Scalable Memory Controller'' peut mettre en attente 64 lignes de cache dans la mémoire FIFO, soit 8 kibioctets de RAM ! Deux pages mémoire si la mémoire virtuelle utilise des pages de 4 kibioctets ! ===Les lectures anticipées : une forme d'OOO mémoire=== La mise en attente des accès mémoire est une optimisation intéressante, mais pas mirifique. Elle permet surtout de ne pas bloquer le processeur si le contrôleur mémoire a du travail sur la planche. Cependant, elle peut être optimisée quand on se rend compte d'une chose : le processeur ne voit que les lectures, pas les écritures. Pour les écritures, il les envoie au contrôleur mémoire et ce dernier fait le travail demandé, le processeur n'est pas prévenu quand une écriture se termine. Mais pour les lectures, c'est différent, car il reçoit la donnée lue. En conséquence, il est possible d'optimiser les écritures sans que le processeur ne voie quoique ce soit. Une optimisation possible est alors de changer l'ordre des accès mémoire, histoire de retarder les écritures ou au contraire de les faire en avance. La raison est que les mémoires SDRAM n'aiment pas quand on alterne lectures et écritures. Les délais mémoire, les fameux ''timings'' mémoire, sont clairs : faire une suite de lecture ou une suite d'écriture est plus performant que d'alterner entre lectures et écritures. L'idée est alors de changer l'ordre des écritures de manière à les faire en bloc, idem pour les lectures. L’optimisation est possible, mais à condition que le processeur n'y voie que du feu. Or, vous l'avez deviné, il y a des cas où ces réorganisations ne sont pas possibles, et vous avez sans doute trouvé que la situation était familière. L'optimisation en question est une forme d'exécution dans le désordre des accès mémoire, réalisée par le contrôleur mémoire lui-même ! Et qui dit exécution dans le désordre dit : problèmes liés aux dépendances de données. Changer l'ordre des écritures n'est pas toujours possible, notamment en raison des dépendances RAW, WAR et WAW. Pour que le processeur n'y voie que du feu, il faut respecter plusieurs critères. Premièrement, les lectures doivent être renvoyées au processeur dans l'ordre. Et quand je dis dans l'ordre, cela veut dire : dans l'ordre d'envoi des lectures au contrôleur mémoire. Les écritures aussi doivent se faire dans l'ordre, histoire qu'une série d'écriture donne le bon résultat final. Le troisième critère est qu'une lecture doit donner le résultat de la dernière écriture ''à la même adresse''. Pour le dire autrement, il faut juste détecter les dépendances RAW. Concrètement, si on a une série de lectures et d'écritures alternées, on peut regrouper les lectures et les écritures dans deux paquets séparés, à condition qu'aucune lecture ne lise une adresse écrite par une écriture. Mais si une lecture est dépendante d'une écriture, alors la lecture doit attendre que l'écriture se termine, idem pour les lectures suivantes. Une implémentation basique remplace la mémoire FIFO vue au-dessus, par deux mémoires FIFOs : une pour les lectures, une pour les écritures. Lorsqu'un accès mémoire arrive au séquenceur, il regarde si c'est une lecture ou une écriture et place l'accès mémoire dans la file adéquate. Le fait que ce soit des FIFOs garantit que les lectures se font dans l'ordre, idem pour les écritures. En sortie des deux FIFOs, le séquenceur mémoire détecte les dépendances RAW. Précisément, quand une lecture sort de la mémoire FIFO, il consulte la file d'attente des écritures pour voir si la lecture est dépendante d'une écriture en attente. La lecture attend si c'est le cas, et les écritures sont exécutées à la place. Séparer lectures et écriture est une source d'optimisation. Il est par exemple possible d'utiliser le réacheminement lecture sur écriture (''Store to load forwarding''). Il s'agit d'un équivalent de l’optimisation du même nom, utilisée dans le cadre de la désambiguïsation mémoire. Imaginez qu'une lecture accède à une donnée pas encore écrite, en attente dans le contrôleur mémoire. C'est une dépendance RAW assez claire. Dans ce cas, le contrôleur mémoire peut renvoyer la donnée directement depuis ses mémoires FIFOs, sans faire d'accès mémoire en lecture. Le contrôleur mémoire a tendance à privilégier les lectures, car celles-ci sont cruciales pour l'exécution dans le désordre. Plus elles se font tôt, plus vite le processeur recevra les données et pourra démarrer les instructions dépendantes de cette donnée. Le séquenceur a donc tendance à piocher en priorité dans la file de lecture, plutôt que dans la file d'écriture. À vrai dire, dans le cas idéal, les écritures ne sont faites que quand la file d'écriture est pleine ou quasi pleine... Prenons l'exemple des coprocesseurs IO 81341 et 81342, qui étaient en réalité des ''chipsets'' intégrant un contrôleur SDRAM. Le ''chipset'' avait 5 ports : un pour les processeurs, un pour le pont sud (''southbridge'') et trois pour des canaux DMA. Pour le port processeur, il n'y avait pas de réordonnancement et ce port utilisait une seule mémoire FIFO. Les autres ports utilisaient l'optimisation qu'on vient de voir, et avaient vraisemblablement des files séparées pour les lectures et écritures. Le séquenceur mémoire vérifiait les dépendances mémoire de type RAW et autres. [[File:Double file d'attente pour les lectures et écritures.png|centre|vignette|upright=2.5|Double file d'attente pour les lectures et écritures]] ===Le ré-ordonnancement des commandes mémoires=== L'optimisation précédente est peu poussée, comparé aux formes d'exécution dans le désordre que les processeurs utilisent. Et on peut se demander si une exécution dans le désordre plus poussé est possible. La réponse est oui : un contrôleur mémoire peut faire des réorganisations bien plus poussées. Par contre, il faut faire une précision très importante : le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre. Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. Maintenant que ces précisions sont faites, posons cette question : dans quelles situations est-il pertinent de faire des accès mémoire dans le désordre ? La réponse est : quand plusieurs accès à une même ligne ne sont pas consécutifs, qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire à une même ligne sont exécutés l'un à la suite de l'autre, ce qui est beaucoup plus rapide. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants : * Une lecture ligne A ; * PRECHARGE + ACT ; * Une écriture ligne B ; * PRECHARGE + ACT ; * Une lecture ligne A. Sans réordonnancent, on doit émettre deux commandes PRECHARGE quand on passe d'une ligne à l'autre, et il faut ajouter les commandes ACT avec. Pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. Le résultat est alors le suivant : * Lecture ligne A ; * Lecture ligne A * PRECHARGE + ACT ; * Une écriture ligne B. On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Et encore une fois, il faut éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, les dépendances RAW posent problème ! L'implémentation est assez simple : la ou les mémoires FIFOs précédentes sont remplacées par des mémoires similaires aux fenêtres d'instruction. Le contrôleur mémoire vérifie à chaque cycle les accès en attente, et vérifie à quelle ligne ils accèdent. Il priorise alors les accès qui tombent dans la ligne ouverte : ceux-là sont exécutés avant les autres. S'il n'y en a pas, il prend l'accès mémoire le plus ancien (ordre FIFO). Il teste aussi les dépendances mémoires RAW avant d'envoyer des commandes à la mémoire DDR/SDRAM. une telle solution est appelée l''''algorithme ''FR-FCFS''''' (''First Ready-First Come First Serve''). ===Les optimisations liées à la présence de plusieurs banques=== Les optimisations précédentes sont décuplées par la présence de plusieurs banques dans la mémoire SDRAM. Il est en effet possible de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. La seule contrainte est que la SDRAM est limitée à 4 banques actives en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || |- ! Banque Numéro 3 | || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || |} Les optimisations précédentes peuvent s'appliquer par banque. Il est par exemple possible d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème, car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs. Il y a cependant un risque que les lectures se fassent dans le désordre si on n'y prend pas garde. [[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]] Il est aussi possible d'utiliser une file séparée pour les lectures et les écritures, pour chaque banque. Les performances sont alors améliorées comparé à deux files globales pour toute la SDRAM. En idem avec la réorganisation des accès mémoire, pour regrouper les accès à une même ligne. Un problème avec ces optimisations est qu'il est rare que des accès mémoire se fassent dans des banques séparées. Les accès mémoire tendent à se faire avec une bonne localité spatiale, ce qui fait qu'ils tombent dans une même banque. Heureusement, les contrôleurs SDRAM/DDR modernes incorporent des optimisations pour corriger ce problème. Les optimisations en question sont une forme d'entrelacement adaptée aux mémoires SDRAM. L'entrelacement naïf ne marche pas à cause de la présence du tampon de ligne. Cependant, il peut y avoir un entrelacement entre banques SDRAM. Voyons ce que ça veut dire. L''''entrelacement de banques''' répartit deux lignes consécutives dans deux banques différentes. Pour comprendre l'idée, prenons un exemple. Imaginons une mémoire avec deux banques et 4 lignes. Imaginons qu'on parcoure/balaye la mémoire RAM en partant des adresses basses. Sans entrelacement de ligne, les accès se feront comme suit, de gauche à droite : {|class="wikitable" |+ Adresse mémoire |- ! colspan="4" | Banque numéro 1 !! colspan="4" | Banque numéro 2 |- | Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 || Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 |} Avec l'entrelacement de banques, les accès se feront comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 |- | Ligne 1 || Ligne 1 || Ligne 2 || Ligne 2 || Ligne 3 || Ligne 3 || Ligne 4 || Ligne 4 |} L'avantage est que passer d'une ligne à la suivante est plus rapide. Pas besoin de fermer la ligne pour passer à la suivante, on ouvre directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Sans entrelacement, les adresses mémoire sont découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- | Adresse de banque || Adresse de ligne || Adresse de colonne |} Avec l'entrelacement de banques, l'adresse est découpée comme suit. {|class="wikitable" |+ Adresse mémoire |- | Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet) |} Il est aussi possible de faire la même chose, mais avec les rangées ou en utilisant du ''dual channel'', mais je vais passer cela sous silence. Toujours est-il que les méthodes d'entrelacement sont nombreuses et chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant. L'entrelacement est géré juste avant le séquenceur mémoire, dans un '''circuit d'entrelacement'''. Ce dernier intervertit certains bits de l'adresse lors des accès mémoires. [[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]] Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=La désambiguïsation mémoire | prevText=La désambiguïsation mémoire | next=Les processeurs superscalaires | nextText=Les processeurs superscalaires }} </noinclude> 9ret7b1x4d952lh31g5om91qbl2orbx 764854 764836 2026-04-24T14:36:52Z Mewtow 31375 /* La mise en attente des accès mémoire */ 764854 wikitext text/x-wiki Dans ce chapitre, nous allons voir les techniques qui permettent de gérer plusieurs accès mémoire simultanés directement au niveau du cache ou de la mémoire RAM. Par plusieurs accès mémoire simultanés, vous pensez sans doute à l'usage de cache multiports, voire de mémoires RAM multiport. C'est en effet une solution, mais ce n'est clairement pas la seule. Par exemple, il est possible de pipeliner l'accès au cache, voire à la mémoire RAM. Il existe de nombreuses techniques de '''parallélisme mémoire''', et nous allons les voir dans ce chapitre. Pour donner un exemple, il est possible de pipeliner les accès mémoire. Il est possible de pipeliner l'accès au cache et/ou l'accès à la mémoire, et nous verrons comment faire dans ce chapitre. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, qu'ils aient ou non un pipeline dynamique. Par contre, pipeliner la mémoire est une technique ancienne, aujourd'hui peu utilisée. Elle était utilisée sur des très vieux ordinateurs, qui avaient un pipeline mais pas de mémoire cache. Mais de nos jours, les mémoires SDRAM et DDR ne sont pas adaptées pour ça, il est très difficile de les pipeliner correctement. Le parallélisme mémoire est utile aussi bien sur des processeurs à émission dans l'ordre que dans le désordre. Par exemple, un processeur ''in-order'' avec des lectures non-bloquantes peut e, profiter. Il peut techniquement lancer une seconde lecture, après avoir rencontré une première lecture non-bloquante. En général, le nombre de lectures consécutives est cependant limité à moins d'une dizaine. À l'opposé, les processeurs sans lectures non-bloquantes profitent pas du parallélisme mémoire. À la rigueur, ils peuvent en profiter s'ils intègrent des techniques de préchargement. Pendant que le processeur exécute une lecture/écriture, il peut précharger une autre donnée en parallèle. Inutile de dire que sans pipeline processeur, le parallélisme mémoire ne sert pas à grand-chose. ==Le ''line fill buffer'' et les techniques associées== Lors d'un défaut de cache, le processeur doit attendre que toute la ligne de cache soit chargée avant d'être utilisable. Or, la taille d'une ligne de cache est supérieure à la largeur du bus mémoire, ce qui fait qu'une ligne de cache est chargée en plusieurs fois, morceaux par morceaux, mot mémoire par mot mémoire. Le chargement peut se faire directement dans le cache, mais ce n'est pas une solution très pratique. À la place, beaucoup de processeurs ajoutent une mémoire tampon entre la RAM et le cache, appelée le '''tampon de remplissage de ligne''' (''line-fill buffer'') dans les processeurs modernes. Lors d'un défaut de cache, le processeur charge la donnée de la RAM dans le tampon de remplissage de ligne, mot mémoire par mot mémoire. Une fois plein, le tampon de remplissage de ligne est recopié dans la ligne de cache. Le tampon de remplissage de ligne contient une ligne de cache, si ce n'est que certains bits de contrôle ne sont pas présents. Le tampon de remplissage de ligne contient un bit de validité pour chaque mot mémoire de la ligne de cache, qui indiquent si le mot mémoire a été chargé. Par exemple, prenons un processeur 64 bits, qui gère donc des mots mémoire de 8 octets, avec des lignes de cache 256 octets/32 mots mémoire. Le tampon de remplissage de ligne contiendra 32 bits de validité. Si le processeur a chargé les 6 premiers mots mémoire, les 6 premiers bits de validité seront mis à 1, les autres seront encore à zéro. Il faut noter que la disponibilité de la ligne complète se détermine assez facilement en faisant un ET logique entre tous les bits de validité. Le processeur sait ainsi quand la ligne de cache est disponible entièrement et donc quand la transférer dans le cache. La même chose existe avec une hiérarchie de cache, sauf que l'on trouve une mémoire tampon entre chaque niveau de cache. Il y a un tampon de remplissage de ligne entre le cache L1 et le cache L2, entre le cache L2 et le L3, etc. Si le cache ne gère qu'un seul défaut de cache à la fois, le ''fill line buffer'' est une mémoire très simple, qui ne mémorise qu'une seule ligne de cache. Et cela vaut aussi bien pour un cache bloquant que non-bloquant. Mais sur les caches capables de gérer plusieurs défauts simultanés, le tampon de remplissage de ligne est une mémoire de type FIFO ou LIFO, capable de mémoriser plusieurs lignes de cache. Notons que le tampon de remplissage de ligne est très utile pour implémenter certaines techniques, par exemple le contournement du cache. Nous avions vu dans le chapitre sur le cache que certains accès mémoire doivent contourner le cache, pour des raisons de cohérence des caches. C'est notamment nécessaire pour accéder aux périphériques, mais c'est aussi utile pour des raisons de performances dans des cas très spécifiques. Les accès qui contournent le cache se font directement dans le tampon de remplissage de ligne : le processeur écrit ou lit les données depuis ce tampon de remplissage de ligne, sans accéder au cache. ===L'''early restart'' et le ''critical word load''=== La présence du ''line buffer'' permet une optimisation assez intéressante, qui permet de réduire la latence des défauts de cache. L'optimisation consiste à lire un mot mémoire dans le tampon de remplissage de ligne, même si la ligne de cache complète n'a pas encore été chargée. Il existe deux manières de faire cela, qui portent les noms d'''early restart'' et de ''critical word load''. La première est la version la plus simple, la seconde est plus complexe mais plus performante. Avec la technique d''''''early restart''''', la ligne de cache est chargée normalement, en partant de son premier mot mémoire. Dès que le mot mémoire lu/écrit par le processeur est copié dans le ''line fill buffer'', il est envoyé au processeur immédiatement. Illustrons le tout par un exemple, où une ligne de cache fait 16 mots mémoire. Le processeur effectue une lecture, qui lit le 5ème mot mémoire. Sans ''early restart'', le processeur doit charger les 16 mots mémoire avant de faire la lecture dans le cache. Avec ''early restart'', le processeur reçoit la donnée dès que le 5ème mot mémoire est disponible. Le processeur doit attendre que les 4 premiers mots mémoire soient chargés, puis le 5ème mot mémoire arrive et est envoyé directement au processeur, il est lu directement depuis le ''line fill buffer''. Les 11 mots mémoire suivants sont ensuite chargés dans le cache pendant que le processeur fait des calculs dans son coin. Le ''critical word load'' est une optimisation de la technique précédente où le chargement de la ligne de cache commence directement à la donnée demandée par le processeur. Pour reprendre l'exemple précédent, où le processeur demande le 5ème mot mémoire sur 16, le ''critical word load'' charge le 5ème mot mémoire en premier et l'envoie au processeur, ce qui fait qu'il est chargé très rapidement. Pas besoin d'attendre que le processeur charge les 4 mots mémoire précédents comme avec l'''early restart''. Dans le détail, le processeur charge le 5ème mot mémoire en premier, puis charge les 11 suivants, et termine par les 4 mots mémoire du début. En clair, le ''critical word load'' commence par charger le mot mémoire lu, puis les blocs suivants, avant de revenir au début du bloc pour charger les blocs restants. Ainsi, la donnée demandée par le processeur sera la première disponible. Pour cela, l'organisation du tampon de remplissage de ligne est modifiée de manière à rendre cela possible. Il a une taille égale à une ligne de cache complète, qui contient elle-même plusieurs mots mémoire. Dans le ''line-fill buffer'', chaque mot mémoire est stocké avec un tag, qui indique l'adresse du mot mémoire stocké dans le ''line-fill buffer''. Le ''line-fill buffer'' est donc un cache un peu particulier, qui fonctionne comme un cache du point de vue du processeur, comme une mémoire FIFO pour les transferts avec le cache. Ainsi, un processeur qui veut lire dans le cache après un défaut peut accéder à la donnée directement depuis le tampon de remplissage de ligne, alors que la ligne de cache n'a pas encore été totalement recopiée en mémoire. ==Les caches pipelinés== Il est possible de pipeliner l'accès au cache, ce qui demande juste de rajouter des registres au bon endroits et quelques circuits de contrôle. Pipeliner l'accès au cache est une technique en vigueur dans les processeurs modernes, même ceux avec un pipeline dynamique. Et l'implémentation peut se faire de plusieurs manières différentes. Il faut dire que découper une mémoire cache en plusieurs étapes peut se faire de plusieurs manière. Commençons par la plus simple. Beaucoup de processeurs des années 2000 avaient une fréquence peu élevée comparée aux standards d'aujourd'hui, ce qui fait que leur cache avait bien un temps d'accès d'un cycle d'horloge. Mais l'accès au cache se faisait en deux cycles d'horloge : un cycle pour calculer une adresse et un cycle pour l'accès mémoire proprement dit. Et ces deux étapes étaient pipelinées, à savoir que deux micro-opérations mémoire peuvent s'exécuter en même temps : une dans l'étage de calcul d'adresse, une autre dans le cache. L'unité mémoire était donc pipelinée, alors que l'accès au cache ne l'était pas. Les processeurs qui implémentaient cette technique regroupent les micro-architectures K5 et K6 d'AMD, les processeurs Intel de micro-architecture P6 (Pentium 2 et 3) et quelques autres. Il est aussi possible de pipeliner l'accès au cache lui-même. Avec un cache pipeliné, l'accès au cache ne se fait pas en un seul cycle, mais en plusieurs. Cependant, on peut lancer un nouvel accès au cache à chaque cycle d'horloge, comme un processeur pipeliné lance une nouvelle instruction à chaque cycle. L'implémentation est assez simple : il suffit d'ajouter des registres dans le cache. Pour cela, on profite que le cache est composé de plusieurs composants séparés, qui échangent des données dans un ordre bien précis, d'un composant à un autre. De plus, le trajet des informations dans un cache est linéaire, ce qui les rend parfois pour l'usage d'un pipeline. ===Le ''pipelining'' des caches ''direct-mapped''=== Voici ce qui se passe avec un cache directement adressé. Pour rappel ce genre de cache est conçu en combinant une mémoire RAM, généralement une SRAM, avec quelques circuits de comparaison et un MUX. L'accès au cache se fait globalement en deux étapes : la première lit la donnée et le ''tag'' dans la SRAM, et on utilise les deux dans une seconde étape. Nous avions vu il y a quelques chapitre comment pipeliner des mémoires, dans le chapitre sur les mémoires évoluées. Et bien ces méthodes peuvent s'utiliser pour la mémoire RAM interne au cache !L'idée est d'insérer un registre entre la sortie de la RAM et la suite du cache, pour en faire un cache pipéliné, à deux étages. Le premier étage lit dans la SRAM, le second fait le reste. L'implémentation sur les caches associatifs à plusieurs voies est globalement la même à quelques détails près. [[File:Cache directement adressé pipeliné - deux étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - deux étages]] Avec le circuit précédent, il est possible d'aller plus loin, cette fois en pipelinant l'accès à la mémoire RAM interne au cache. Pour comprendre comment, rappelons qu'une mémoire SRAM est composée d'un plan mémoire et d'un décodeur. L'accès à la mémoire demande d'abord que le décodeur fasse son travail pour sélectionner la case mémoire adéquate, puis ensuite la lecture ou écriture a lieu dans cette case mémoire. L'accès se fait donc en deux étapes successives séparées, on a juste à mettre un registre entre les deux. Il suffit donc de mettre un gros registre entre le décodeur et le plan mémoire. [[File:Cache directement adressé pipeliné - trois étages.png|centre|vignette|upright=2|Cache directement adressé pipeliné - trois étages]] Et on peut aller encore plus loin en découpant le décodeur en deux circuits séparés. En effet, rappelez-vous le chapitre sur les circuits de sélection : nous avions vu qu'il est possible de créer des décodeurs en assemblant des décodeurs plus petits, contrôlés par un circuit de prédécodage. Et bien on peut encore une ajouter un registre entre ce circuit de prédécodage et les petits décodeurs. : Théoriquement, toute l'adresse est fournie d'un seul coup au cache, la quasi-totalité des processeurs présentent l'adresse complète à un cache pipeliné. Mais le Pentium 4 fait autrement. Il faut noter que les premiers étages manipulent l'indice dans la SRAM, qui est dans les bits de poids faible, alors que les étages ultérieurs manipulent le ''tag'' qui est dans les bits de poids fort. Les concepteurs du Pentium 4 ont alors décidé de présenter les bits de poids faible lors du premier cycle d'accès au cache, puis ceux de poids fort au second cycle. Pour cela, l'ALU fonctionnait à une fréquence double de celle du processeur, tout comme le cache L1. Il n'y avait pas de pipeline proprement dit, mais cela réduisait grandement la latence d'accès au cache. ===Le ''pipelining'' des caches splittés/sériels=== Il est aussi possible de pipeliner un cache dits splittés, aussi appelés à accès sériel. Pour rappel, les caches à accès sériel vérifient si il y a succès ou défaut de cache, avant d'accéder aux lignes de cache en cas de succès. Ils font donc différemment des autres caches, qui accèdent à une ligne de cache, avant de déterminer s'il y a succès ou défaut en lisant le tag de la ligne de cache. Les caches sériels disposent de deux SRAM : une pour les tags des lignes de cache et une pour les données. Ils accèdent à la SRAM pour les tags, avant d’accéder à la SRAM des données en cas de succès de cache. Vu que l'accès se fait en deux étapes, une vérification des tags suivie de la lecture/écriture des données, il est facile à pipeliner. Pipeliner le cache permet de régler le problème des accès au cache L1, et elle est tout le temps utilisé sur les processeurs modernes. Mais que faire en cas de défaut de cache ? ==Les caches non bloquants== Un '''cache bloquant''' est un cache auquel le processeur ne peut pas accéder pendant un défaut de cache. Il faut attendre que la lecture ou écriture en RAM soit terminée avant de pouvoir utiliser de nouveau le cache. Un '''cache non bloquant''' n'a pas ce problème : on peut l'utiliser pendant un défaut de cache. Les caches non bloquants permettent de démarrer une nouvelle lecture ou écriture alors qu'une autre est en cours, ce qui permet d'exécuter plusieurs lectures ou écritures en même temps. ===Les ''Miss Handling Status Registers''=== Lors d'un défaut de cache, la mémoire RAM est consultée pendant le défaut de cache, mais le cache est inutilisé. Un défaut de cache n'utilise pas le cache, ce n'est qu'un accès en mémoire RAM, sur le bus mémoire (ou un accès aux niveaux de cache inférieurs, peu importe). Le cache en lui-même est laissé libre, rien n’empêche d'y accéder, il est en réalité intrinsèquement non-bloquant. Les caches, bloquants comme non-bloquants, sont en réalité composés d'une mémoire cache proprement dite, entourée de circuits qui servent d'interface entre le processeur et le cache lui-même. Et parmi les circuits tout autour, certains gèrent l'accès au cache lors d'un défaut de cache. Ils sont regroupés sous le terme de '''''Miss Handling Architecture''''' (MHA). La différence entre un cache bloquant et un cache non-bloquant est en réalité liée à l'implémentation de la MHA. Les caches bloquants coupent volontairement l'accès au cache lors d'un défaut, car les défauts sont plus simples à gérer ainsi. Le défaut de cache rapatrie une donnée depuis la RAM, qui sera écrite dans le cache. Et il ne faut pas qu'une tentative d'accès à cette donnée ait lieu avant qu'elle ne soit chargée. Mais ce blocage est général et touche tout le cache, alors que seule une ligne de cache est concernée par le défaut de cache. L'idée derrière un cache non-bloquant est que seule la ligne de cache est bloquée, mais les autres sont accessibles. L'idée est alors de mémoriser les lignes de cache concernées par le défaut de cache, afin d'en bloquer l'accès. À chaque accès, on vérifie si la ligne de cache est déjà réservée par un défaut de cache. La lecture/écriture est alors bloquée si c'est le cas, mais elle accepte les accès sinon. Pour cela, la ''Miss Handling Architecture'' contient des registres qui mémorisent des informations sur les défauts de cache en cours. Ils portent le nom de '''''miss status handling registers''''', que j’appellerais dorénavant MSHR, qui sont aussi appelés des '''''miss buffer'''''. Le contenu des MSHR varie beaucoup suivant le processeur, mais ces derniers stockent au minimum les informations suivantes : * Le numéro de la ligne de cache dans laquelle les données sont chargées. * Un bit de validité qui indique si le MSHR est vide ou pas, qui est mis à 0 quand le défaut de cache est résolu. * Un ou plusieurs champs de lecture/écriture, qui contiennent des informations sur la lecture/écriture. ** Pour une lecture, elle contient des informations sur la destination de la donnée, à savoir qui prévenir quand le défaut de cache est terminé. C'est parfois un nom/numéro de registre (celui dans lequel charger la donnée), mais c'est souvent le numéro de l'entrée dans le ''load/store queue''. ** Pour les écritures, elle contient la donnée à écrire, ou éventuellement un numéro de ''load/store queue'' où se trouve la donnée à écrire. Il faut noter que le bus mémoire ne peut gérer qu'un seul défaut de cache à la fois. Aussi, il est intéressant de regarder ce qui se passe lorsqu'un second défaut de cache survient, pendant qu'un premier est en cours. Dans ce cas, il y a deux réponses qui correspondent à deux types de caches non-bloquants, qui portent les noms barbares de caches de type succès après défaut et défaut après défaut. Sur le premier type, il ne peut pas y avoir plusieurs défauts de cache simultanés. Dès qu'un second défaut de cache survient, le cache stoppe son activité et on ne peut plus démarrer de nouvelle lecture/écriture, tant que le premier défaut de cache n'est pas résolu. Le second type est plus souple et autorise la survenue de plusieurs défauts de cache simultanés. Du moins, jusqu'à une certaine limite, car le cache ne peut supporter qu'un nombre limité d'accès mémoires simultanés (pipelinés). ===Les accès simultanés à une même ligne de cache=== Il arrive que le processeur fasse plusieurs accès mémoire simultanés à la même ligne de cache. Si la ligne de cache en question n'a pas encore été chargée dans le cache, alors on a plusieurs défauts de cache consécutifs pour la même ligne de cache, et le cache non-bloquant doit gérer la situation. Pour la suite, il va falloir faire une petite distinction entre les défauts primaires et secondaires. Imaginons qu'un défaut de cache ait lieu et demande à charger une donnée dans la ligne de cache numéro N. Il s'agit du premier défaut impliquant cette ligne de cache précise, ce qui lui vaut le nom de '''défaut de cache primaire'''. Mais par la suite, d'autres accès mémoire à la même ligne de cache ont lieu, alors que la ligne de cache n'est pas encore disponible. Dans ce cas, il s'agit de '''défauts de cache secondaires'''. Pour l'unité d'accès mémoire, les défauts de cache primaire et secondaire sont différents (ils prennent tous une entrée dans la ''load/store queue''). Mais pour le cache, ils ne correspondent qu'à un seul accès au cache : celui qui demande de charger la ligne de cache demandée. Les défauts de cache primaire et secondaire à la même ligne de cache se voient attribuer un MSHR unique. La gestion des défauts de cache secondaires dépend du cache non-bloquant. La solution la plus simple ne permet pas les défauts de cache secondaires. Le cache ne permet pas deux défauts de cache simultanés pour la même ligne de cache. Les autres solutions le permettent, en fusionnant des accès simultanés à la même ligne de cache en un seul au niveau des MSHR. Dans tous les cas, détecter les défauts de cache secondaires sont un problème qu'il faut détecter. La ''Miss Handling Architecture'' doit détecter les défauts de cache secondaire. Pour cela, elle procède comme suit. Lors de chaque défaut de cache, la MHA récupère le numéro de la ligne de cache associé. Il vérifie alors chaque MSHR pour vérifier s'il contient le numéro en question. S'il n'y a aucune correspondance dans les MSHR, alors c'est signe que le défaut de cache est un défaut primaire. Mais s'il y en a une, alors c'est un défaut secondaire. Évidemment, cela signifie que lors d'un défaut de cache, le numéro de ligne de cache est envoyé à tous les MSHR, pour comparaison. Les MSHR sont donc regroupés dans une mémoire associative, une sorte de mini-cache, faciliter l'implémentation. Lors d'un défaut de cache primaire, l'accès à un cache non-bloquant se fait comme suit : le processeur envoie une adresse au cache, accède à celui-ci, et détecte la survenue d'un défaut de cache. Il en profite alors pour attribuer une ligne de cache dans laquelle sera chargée ce défaut. L'attribution est très simple dans le cas des caches ''direct mapped'', ou associatifs par voie, pour lesquels l'attribution se fait assez simplement. Il mémorise alors cette information dans les MSHR, après avoir vérifié que le défaut de cache n'était pas un défaut secondaire. Lors des accès ultérieurs à une adresse proche, censée être dans la même ligne de cache, le processeur va encore une fois rencontrer un défaut de cache. Il va alors déterminer le numéro de la ligne de cache associée à l'adresse, et comparer ce numéro avec les MSHRs. Si un MSHR contient ce numéro, c'est signe que le défaut de cache est un défaut secondaire. La MHA réagit alors différemment selon le processeur considéré. Une première solution n'autorise pas les défauts de cache secondaires. Si l'un d'entre eux survient, le processeur est gelé par un ''pipeline stall'', une bulle de pipeline. Une autre solution fusionne les défauts de cache secondaires avec le défaut de cache primaire : tout cela ne correspond qu'à un seul défaut de cache pour lui. ===Les MSHR simples=== Un cache non-bloquant à '''MSHR simple''' contient juste plusieurs MSHR qui mémorisent juste un numéro de ligne de cache, un bit de validité, le champ de lecture/écriture, et l'adresse exacte de lecture/écriture. Avec cette organisation, il est possible d'avoir plusieurs défauts de cache séparés, mais à la condition que chaque défaut accède à une ligne de cache différente. Deux accès simultanés à une même ligne de cache ne sont pas possibles, les défauts de cache secondaires ne sont pas autorisés. Ainsi, chaque défaut de cache se voit attribuer son propre MSHR, chacun contient un numéro de ligne de cache différent. Pour comprendre pourquoi c'est impossible de gérer les défauts secondaires, il faut regarder le champ de lecture/écriture. Si on veut effectuer plusieurs écritures consécutives à la même adresse, le MSHR n'aura pas de quoi mémoriser les deux données à écrire. Il pourra mémoriser la première donnée à écrire, pas la seconde. Même chose lors d'une lecture : le champ lecture/écriture peut mémorisr la destination de la première lecture, pas de la seconde. L'avantage est que la MHA n'a besoin que des MSHR et de quelques circuits annexes. Les autres solutions rajoutent des circuits annexes pour gérer les défauts de cache secondaires, qui utilisent beaucoup de circuits. Le cout en circuit est donc élevé, mais le gain en performance est là. Passons maintenant aux caches non-bloquants qui autorisent les défauts de cache secondaire. La solution la plus simple consiste à utiliser ===Les MSHR adressés implicitement=== Avec les '''MSHR adressés implicitement''', il est possible de fusionner plusieurs accès mémoire à une même ligne de cache, mais sous une condition très importante : ces accès lisent/écrivent des mots mémoire différents. Par exemple, imaginons qu'une ligne de cache contienne 8 mots mémoire de 64 bits. Si un premier accès mémoire lit le mot mémoire numéro 7 (dernier mot mémoire de la ligne), et le second accès le mot mémoire numéro 3, alors la fusion est possible. Mais si deux accès mémoire veulent lire/écrire le mot mémoire numéro 7, alors la fusion n'est pas possible et le processeur se bloque, un ''pipeline stall'' survient. Un MSHR adressé implicitement est un MSHR simple, qui contient naturellement un numéro de ligne de cache (tag) et un bit de validité, sauf que le champ de lecture/écriture est dupliqué. Les différents champs lecture/écriture d'un MSHR sont regroupés dans une mémoire RAM/cache qui contient autant d'entrées qu'il y a de mot mémoire dans une ligne de cache. Chaque entrée de la table est associée à un mot mémoire de la ligne de cache et stocke des informations sur celui-ci. Une entrée mémorise, au minimum : * Un champ de lecture/écriture qui contient soit la destination de la lecture, soit la donnée à écrire. * Un bit R/W permettant d'interpréter correctement le champ de lecture/écriture. * Un bit de validité pour chaque entrée de la table, qui dit si un défaut de cache antérieur accède déjà à ce mot mémoire. La fusion de deux défauts de cache est ainsi assez simple. Un défaut de cache primaire/secondaire configure l'entrée associée au mot mémoire lu/écrit. Si un défaut secondaire ultérieur lit/écrit un mot mémoire différent (dont le bit de validité de l'entrée dans la table est à zéro), pas de conflit : il configure une autre entrée, vide. Mais s'il lit/écrit un mot mémoire pour lequel l'entrée de la table est occupée, il y a conflit, le processeur est bloqué par un ''pipeline stall'', une bulle de pipeline. Avec cette organisation, le nombre de MSHR indique combien de lignes de cache peuvent être lues en même temps depuis la mémoire. Quant au nombre d'entrées par MSHR, il détermine combien d'accès mémoires qui ne se recouvrent pas peuvent avoir lieu en même temps. ===Les MSHR adressés explicitement=== Les '''MSHR adressés explicitement''' n'ont pas les contraintes des MSHR adressés implicitement. Avec eux, il est possible d'avoir plusieurs défauts de cache pointant vers la même ligne de cache, mais aussi vers le même mot mémoire. De tels défauts de cache apparaissent sur les processeurs à exécution dans le désordre, mais sont très rares, voire inexistants, sur les processeurs ''in-order''. L'idée est encore que chaque MSHR est associée à une table mémoire qui mémorise des entrées. Cette table n'est autre qu'une mémoire FIFO. Sauf que cette fois-ci, une entrée n'est pas associée à un mot mémoire. Une entrée est associée à un défaut de cache. Une entrée mémorise là encore la destination de la lecture ou la donnée de l'écriture suivi du bit R/W, ainsi que d'un bit de validité par entrée, mais aussi : la position du mot mémoire lu dans la ligne de cache. C'est cette dernière information qui n'était pas présente dans les MSHR adressés implicitement. De plus, le nombre d'entrée par MSHR n'est pas égal au nombre de mots mémoires dans une ligne de cache, mais peut être arbitrairement grand. L'avantage d'un tel cache est qu'il est capable de traité les défauts secondaires concernant un même mot mémoire, et ce, car les accès à la ligne de cache concernée se produisent dans l'ordre de génération des défauts (la table mémoire est une FIFO). ===Les MSHRs inversés=== Généralement, plus on veut supporter de défauts de cache, plus le nombre de MSHR et d'entrées augmente. Mais au-delà d'un certain nombre d'entrées et de MSHR, les MSHR adressés implicitement et explicitement ont tendance à bouffer un peu trop de circuits. Utiliser une organisation un peu moins gourmande en circuits est donc une nécessité. Cette organisation plus économe se base sur des MSHR inversés. Les MSHR inversés ne contiennent qu'une seule entrée, en quelque sorte : au lieu d’utiliser n MSHR de m entrées chacun, on va utiliser n × m MSHR inversés. La différence, c'est que plusieurs MSHR peuvent contenir un tag identique, contrairement aux MSHR adressés implicitement et explicitement. Lorsqu'un défaut de cache a lieu, chaque MSHR est vérifié. Si jamais aucun MSHR ne contient de tag identique à celui utilisé par le défaut, un MSHR vide est choisi pour stocker ce défaut, et une requête de lecture en mémoire est lancée. Dans le cas contraire, un MSHR est réservé au défaut de cache, mais la requête n'est pas lancée. Quand la donnée est disponible, les MSHR correspondant à la ligne qui vient d'être chargée vont être utilisés un par un pour résoudre les défauts de cache en attente. ===Les MSHR intégrés au cache=== Certains chercheurs ont remarqué que pendant qu'une ligne de cache est en train de subir un défaut de cache, celle-ci reste inutilisée, et son contenu est destiné à être perdu une fois le défaut de cache résolu. Ils se sont dit que, plutôt que d'utiliser des MSHR séparés, il vaudrait mieux utiliser la ligne de cache pour stocker les informations sur les défauts de cache en attente dans cette ligne de cache. Pour éviter tout problème, il faut rajouter un bit dans les bits de contrôle de la ligne de cache, qui sert à indiquer que la ligne de cache est occupée : un défaut de cache a eu lieu dans cette ligne, et elle stocke donc des informations pour résoudre les défauts de cache. ==L'entrelacement mémoire== Nous venons de voir comment une mémoire cache peut gérer plusieurs accès mémoire simultanés. Il se trouve que ce genre d'optimisation dépasse largement le cadre du cache. Les mémoires RAM ne sont pas en reste, elles aussi ! Il est possible de pipeliner l'accès à une mémoire RAM, en utilisant des techniques dites d''''entrelacement'''. Précisons cependant que cette optimisation n'est pas utilisée sur les mémoires SDRAM ou DDR modernes, du moins pas sans modifications majeures. Mais divers ordinateurs assez anciens, dont des superordinateurs, ont utilisé cette technique. La technique demande d'utiliser plusieurs mémoires séparées. Sur les anciens ordinateurs, les mémoires en question sont des chips mémoire, à savoir des circuits intégrés de DRAM. Pour faire plus général, nous allons utiliser le terme de '''banques''', ou encore de bancs mémoire. La différence est qu'il existe des mémoires multi-banque, qui regroupent plusieurs banques indépendantes dans un seul boitier, dans un seul chip mémoire. En clair, de telles mémoires regroupent plusieurs sous-mémoires dans un seul circuit intégré. Il est aussi possible d'utiliser plusieurs chips mémoire séparés, chacun ayant une banque. Reste à combiner ces banques pour former un pseudo-pipeline. ===Utiliser plusieurs banques sans entrelacement=== Sans optimisation particulière, les adresses sont réparties dans les banques comme indiqué ci-dessous. Il s'agit de ce qui s'appelle un arrangement horizontal, et nous avions vu celui-ci dans le chapiutre sur les mémoires SDRAM. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses sans entrelacement.]] Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} L'entrelacement change cette répartition, afin d'accélérer les accès mémoire. L'entrelacement classique vise à améliorer les accès à des adresses mémoires consécutives, mais des formes plus évoluées d'entrelacement visent à optimiser des accès mémoire arbitraires. Voyons-les dans l'ordre, du plus simple au plus complexe. ===L'entrelacement classique=== Avec l''''entrelacement classique''', des adresses consécutives sont réparties dans des banques consécutives. Précisons que cette attribution des adresses n'implique absolument pas la mémoire virtuelle ou n'importe quel mécanisme dans le processeur. La répartition décide que telle adresse mémoire va dans telle banque, à telle adresse dans la banque. Elle est donc le fait du contrôleur mémoire, donc en dehors du processeur (les contrôleurs mémoires n’étaient pas encore intégrés dans le processeur à l'époque). [[File:Répartition des adresses dans une mémoire interleaved.png|centre|vignette|upright=1.5|Répartition des adresses dans une mémoire interleaved.]] L'entrelacement simple permet d'accélérer les accès mémoire qui se font à des adresses consécutives. Avec l'entrelacement, chaque accès mémoire tombe dans une banque mémoire différente, ce qui fait qu'on peut démarrer un nouvel accès mémoire à chaque cycle d'horloge. Pendant qu'une banque est occupée par un accès mémoire, on démarre le suivant dans une autre banque, et ainsi de suite. Le tout se termine soit quand on a épuisé toutes les banques libres, soit quand l'accès en rafales se termine. Pas besoin d'attendre que la mémoire ait fini sa lecture/écriture avant de démarrer la lecture/écriture suivante. [[File:Pipemining mémoire.png|centre|vignette|upright=2.5|Pipelining mémoire]] L'animation suivante illustre bien le processus, avec quatres banques. [[File:Interleaving.gif|centre|vignette|upright=2.5|Pipelining mémoire]] L'entrelacement simple utilise les bits de poids faible pour sélectionner la banque, et les bits de poids fort pour la case mémoire. [[File:Adresse mémoire d'une mémoire entrelacée.png|centre|vignette|upright=2|Adresse mémoire d'une mémoire entrelacée]] Précisons que le temps d'accès mémoire ne change pas beaucoup avec l'entrelacement. Par contre, on peut faire plus d'accès mémoire simultanés. On peut démarrer un accès mémoire par cycle d'horloge, mais l'accès en lui-même prend plusieurs cycles. Les mémoires à entrelacement ont donc un débit supérieur aux mémoires qui ne l'utilisent pas. L'entrelacement classique pourrait être utilisé pour accélérer les transferts entre mémoire RAM et cache, qui se font en blocs d'adresses consécutives. Mais de nos jours, il n'est pas utilisé dans cette optique. Il faut dire qu'il est redondant avec le mode rafale des mémoires DRAM. Les deux font globalement la même chose et on voit mal comment utiliser les deux en même temps. Le mode rafale étant plus simple à implémenter, et plus léger niveau utilisation du bus de commande mémoire, il est préféré à l'entrelacement. Par contre, l'entrelacement a eu son heure de gloire sur d'anciens processeurs qui n'avaient pas de mémoire cache, alors qu'ils disposaient d'un pipeline. L'exemple typique est celui des nombreux ''processeurs vectoriels'', que nous n'avons pas encore abordé à ce stade du cours. De tels processeurs avaient un pipeline, une unité de calcul fortement pipelinée, et parfois même de l'exécution dans le désordre et du renommage de registres ! ===L'entrelacement par décalage=== L'entrelacement simple est très utile pour les accès en rafle ou équivalents. Par contre, il existe de rares situations où il n'est pas optimal. Une de ces situations est celle des accès en enjambée (en ''stride''), où l'on accède en série à des adresses sont séparées par N mots mémoires. [[File:Accès par enjambées.png|centre|vignette|upright=2|Accès par enjambées.]] De tels accès surviennent quand un logiciel accède à des structures de données spécifiques, à savoir des tableaux de structures, des matrices, ou d'autres structures de données dans le genre. Un cas classique est celui du parcours d'une matrice colonne par colonne. Les matrices de nombres sont mémorisées ligne par ligne, ce qui fait que parcourir une colonne demande de passer d'une ligne à la suivante et de faire des grands sauts en mémoire RAM, mais tous espacés par la même distance. Avec l'entrelacement simple, les accès en enjambée sont moins performants que les accès à des adresses consécutives, mais cela ne fonctionne pas trop mal. Le pire cas est celui où l'on a N banques et où les données sont justement placées toutes les N adresses. Des accès consécutifs vont tous tomber dans la même banque, on ne peut plus accéder à des banques différentes en parallèle. Mais en dehors de ce cas, on voit une amélioration par rapport à la situation sans entrelacement. Pour obtenir des performances maximales pour les accès en enjambées, il faut répartir les mots mémoires dans la mémoire autrement. L'organisation idéale est la suivante. : Dans les explications qui vont suivre, la variable N représente le nombre de banques, qui sont numérotées de 0 à N-1. On commence par organiser les N premières adresses comme une mémoire entrelacée simple : l'adresse 0 correspond à la banque 0, l'adresse 1 à la banque 1, etc. Pour le bloc suivant, on décale tout d'une adresse, à savoir qu'on commence à remplir les banques à partir de la seconde, non de la première. Une fois la fin du bloc atteinte, on finit de remplir le bloc en repartant du début du bloc. Le troisième bloc d'adresse subit le même traitement, sauf qu'on commence à remplir à partir de la seconde banque. Et on poursuit l’assignation des adresses en décalant d'un cran en plus à chaque bloc. Ainsi, chaque bloc verra ses adresses décalées d'un cran en plus comparé au bloc précédent. Si jamais le décalage dépasse la fin d'un bloc, alors on reprend au début. [[File:Mémoire interleaved par décalage.png|centre|vignette|upright=1.5|Mémoire entrelacée par décalage.]] En faisant cela, on remarque que les banques situées à N adresses d'intervalle sont différentes. Dans l'exemple du dessus, nous avons ajouté un décalage de 1 à chaque nouveau bloc à remplir. Mais on aurait tout aussi bien pu prendre un décalage de 2, 3, etc. Dans tous les cas, on obtient un entrelacement par décalage. Ce décalage est appelé le pas d'entrelacement, noté P. Le calcul de l'adresse à envoyer à la banque, ainsi que la banque à sélectionner se fait en utilisant les formules suivantes : * adresse à envoyer à la banque = adresse totale / N ; * numéro de la banque = (adresse + décalage) modulo N ; * décalage = (adresse totale * P) mod N. Avec cet entrelacement par décalage, on peut prouver que la bande passante maximale est atteinte si le nombre de banques est un nombre premier. Seulement, utiliser un nombre de banques premier peut créer des trous dans la mémoire, des mots mémoires inadressables. Malgré ce défaut, la technique a été utilisée sur quelques ordinateurs, avec l'exemple notable du superordinateur ''Burroughs Scientific Processor''. Pour éviter cela, il y a plusieurs solutions. Par exemple, on peut faire en sorte que N et la taille d'une banque soient premiers entre eux : ils ne doivent pas avoir de diviseur commun. Mais en pratique, elles n'ont pas vraiment été implémentées dans une vraie machine, et sont restées à l'état de recherche, aussi je les passe sous silence. ===L'entrelacement pseudo-aléatoire=== Une dernière méthode de répartition consiste à répartir les adresses dans les banques de manière "pseudo-aléatoire". L'idée exacte est de faire passer l'adresse dans une '''fonction de hachage''', plus ou moins complexe. Pour rappel, une fonction de hachage prend une entrée de grande taille et fournit en sortie un résultat de petite taille. Idéalement, elles doivent donner des résultats aussi différents que possible pour des entrées similaires, histoire de simuler une sorte de pseudo-aléatoire. Ici, une adresse est transformée en un numéro de banque. Une fonction de hachage simple ne fait que permuter des bits de l'adresse pour obtenir son résultat. Elle ne fait qu'échanger des bits de place avant de couper l'adresse en deux morceaux : un pour la sélection de la banque, et un autre pour la sélection de l'adresse dans la banque. Cette permutation est fixe, et ne change pas suivant l'adresse. Des fonctions de hachage plus complexes font des XOR bit à bit entre certains bits de l'adresse. ==Les contrôleurs SDRAM/DDR avec "exécution dans le désordre"== Après avoir vu le cas des mémoires RAM, nous allons nous concentrer sur le cas particulier des mémoires SDRAM. Les mémoires SDRAM et DDR modernes sont capables de gérer plusieurs accès simultanés à la mémoire RAM, et leurs contrôleurs mémoire en font tout autant. C'est une différence majeure avec les mémoires asynchrones FPM/EDO, qui n'acceptaient qu'un seul accès mémoire à la fois. Leur contrôleur mémoire n'acceptait qu'un seul accès mémoire à la fois, c'était un contrôleur mémoire bloquant. Les contrôleurs mémoires des SDRAM sont eux non-bloquants et peuvent encaisser une dizaine d'accès mémoire à la fois. Peu de choses sont connues sur les contrôleurs de SDRAM/DDR modernes, les fabricants ne donnant que peu de détails dessus. Les rares simulateurs qui tentent de décrire leur fonctionnement, comme DRAM SIM I et II, sont particulièrement simples et ne vont pas dans le détail. Néanmoins, le peu qu'on sait est tout de même instructif. ===Rappel sur les SDRAM : tampon de ligne et commandes=== Les mémoires SDRAM sont des mémoires à tampon de ligne. Elles font un accès mémoire en deux étapes. La première étape recopie une ligne de N * 64 bits dans un tampon interne à la SDRAM. La seconde étape sélectionne une colonne, à savoir une donnée de 64 bits, qui est soit envoyée sur le bus de données pour une lecture, soit modifiée par une écriture. [[File:Mémoire à tampon de ligne.png|centre|vignette|upright=2|Mémoire à tampon de ligne]] Les accès mémoire sont traduits par un séquenceur mémoire en une série de commandes mémoires, qui sont séparées par des délais mémoire de quelques cycles d'horloge. Les délais sont très précis, et sont à respecter à la lettre. Une lecture ou une écriture se fait en maximum trois commandes : une commande PRECHARGE qui ferme la ligne précédemment utilisée, une commande ACT qui précise l'adresse de la ligne, et une commande READ ou WRITE qui précise l'adresse de la colonne et éventuellement la donnée à écrire. : Pour être plus précis, la commande PRECHARGE précharge les lignes de bits du plan mémoire à une tension particulière, ce qui les vide de leur contenu. Mais c'est un détail sans importance pour ce qui va suivre. Les SDRAM permettent de se passer de la première étape si des accès consécutifs se font dans la même ligne. Une fois activée, la ligne reste ouverte et on peut accéder plusieurs fois de suite dedans. On a alors juste à préciser l'adresse de colonne dedans. Si un accès mémoire accède à une ligne déjà activée, on dit que c'est un '''succès de page'''. Si ce n'est pas le cas, on doit fermer la ligne courante, rouvrir la ligne voulue, et préciser la colonne. C'est alors un '''défaut de page'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | bgcolor="#FFA0FF" | PRECHARGE || bgcolor="#FFA0FF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#A0FFFF" | READ (2) || bgcolor="#A0FFFF" | READ (3) || || || bgcolor="#A0FFFF" | READ (4) || bgcolor="#A0FFFF" | READ (5) || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | Donnée READ 1 || ||bgcolor="#A0FFFF" | Donnée READ 2 | bgcolor="#A0FFFF" | Donnée READ 3 || || || bgcolor="#A0FFFF" | Donnée READ 4 || bgcolor="#A0FFFF" | Donnée READ 5 |} Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Mais le respect des délais mémoire est très limitant, ce qui fait qu'on ne peut pas parler de réel pipeline, comme c'est le cas sur les processeurs. Parlons plutôt de '''commandes anticipées'''. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Un dernier point est que les chips mémoires de SDRAM sont composés de plusieurs banques, chacune étant une sorte de mini-mémoire miniature. Chaque banque a son propre décodeur, son propre tampon de ligne, ses propres multiplexeurs de colonne, sa logique de rafraichissement mémoire, etc. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] ===La mise en attente des accès mémoire=== Un contrôleur de SDRAM peut accepter plusieurs accès mémoire en même temps. Mais cela ne signifie pas que le contrôleur sera prêt à les traiter immédiatement. Pour éviter tout problème de disponibilité, le contrôleur met en attente les accès mémoire que le processeur lui envoie, pour les exécuter dès que possible. Les accès mémoire sont mis en attente dans une mémoire FIFO, histoire de les exécuter dans leur ordre d'arrivée, notamment pour renvoyer les lectures dans l'ordre demandé. Il y a aussi une mémoire FIFO pour les données à écrire et une FIFO pour les données lues. Cette dernière sert au cas où le cache ne soit pas disponible quand on lui envoie la donnée lue. [[File:Module d'interface avec la mémoire.png|centre|vignette|upright=2.5|Contrôleur mémoire avec mise en attente des requêtes processeur et autres optimisations.]] ===Les lectures anticipées : une forme d'OOO mémoire=== La mise en attente des accès mémoire est une optimisation intéressante, mais pas mirifique. Elle permet surtout de ne pas bloquer le processeur si le contrôleur mémoire a du travail sur la planche. Cependant, elle peut être optimisée quand on se rend compte d'une chose : le processeur ne voit que les lectures, pas les écritures. Pour les écritures, il les envoie au contrôleur mémoire et ce dernier fait le travail demandé, le processeur n'est pas prévenu quand une écriture se termine. Mais pour les lectures, c'est différent, car il reçoit la donnée lue. En conséquence, il est possible d'optimiser les écritures sans que le processeur ne voie quoique ce soit. Une optimisation possible est alors de changer l'ordre des accès mémoire, histoire de retarder les écritures ou au contraire de les faire en avance. La raison est que les mémoires SDRAM n'aiment pas quand on alterne lectures et écritures. Les délais mémoire, les fameux ''timings'' mémoire, sont clairs : faire une suite de lecture ou une suite d'écriture est plus performant que d'alterner entre lectures et écritures. L'idée est alors de changer l'ordre des écritures de manière à les faire en bloc, idem pour les lectures. L’optimisation est possible, mais à condition que le processeur n'y voie que du feu. Or, vous l'avez deviné, il y a des cas où ces réorganisations ne sont pas possibles, et vous avez sans doute trouvé que la situation était familière. L'optimisation en question est une forme d'exécution dans le désordre des accès mémoire, réalisée par le contrôleur mémoire lui-même ! Et qui dit exécution dans le désordre dit : problèmes liés aux dépendances de données. Changer l'ordre des écritures n'est pas toujours possible, notamment en raison des dépendances RAW, WAR et WAW. Pour que le processeur n'y voie que du feu, il faut respecter plusieurs critères. Premièrement, les lectures doivent être renvoyées au processeur dans l'ordre. Et quand je dis dans l'ordre, cela veut dire : dans l'ordre d'envoi des lectures au contrôleur mémoire. Les écritures aussi doivent se faire dans l'ordre, histoire qu'une série d'écriture donne le bon résultat final. Le troisième critère est qu'une lecture doit donner le résultat de la dernière écriture ''à la même adresse''. Pour le dire autrement, il faut juste détecter les dépendances RAW. Concrètement, si on a une série de lectures et d'écritures alternées, on peut regrouper les lectures et les écritures dans deux paquets séparés, à condition qu'aucune lecture ne lise une adresse écrite par une écriture. Mais si une lecture est dépendante d'une écriture, alors la lecture doit attendre que l'écriture se termine, idem pour les lectures suivantes. Une implémentation basique remplace la mémoire FIFO vue au-dessus, par deux mémoires FIFOs : une pour les lectures, une pour les écritures. Lorsqu'un accès mémoire arrive au séquenceur, il regarde si c'est une lecture ou une écriture et place l'accès mémoire dans la file adéquate. Le fait que ce soit des FIFOs garantit que les lectures se font dans l'ordre, idem pour les écritures. En sortie des deux FIFOs, le séquenceur mémoire détecte les dépendances RAW. Précisément, quand une lecture sort de la mémoire FIFO, il consulte la file d'attente des écritures pour voir si la lecture est dépendante d'une écriture en attente. La lecture attend si c'est le cas, et les écritures sont exécutées à la place. Séparer lectures et écriture est une source d'optimisation. Il est par exemple possible d'utiliser le réacheminement lecture sur écriture (''Store to load forwarding''). Il s'agit d'un équivalent de l’optimisation du même nom, utilisée dans le cadre de la désambiguïsation mémoire. Imaginez qu'une lecture accède à une donnée pas encore écrite, en attente dans le contrôleur mémoire. C'est une dépendance RAW assez claire. Dans ce cas, le contrôleur mémoire peut renvoyer la donnée directement depuis ses mémoires FIFOs, sans faire d'accès mémoire en lecture. Le contrôleur mémoire a tendance à privilégier les lectures, car celles-ci sont cruciales pour l'exécution dans le désordre. Plus elles se font tôt, plus vite le processeur recevra les données et pourra démarrer les instructions dépendantes de cette donnée. Le séquenceur a donc tendance à piocher en priorité dans la file de lecture, plutôt que dans la file d'écriture. À vrai dire, dans le cas idéal, les écritures ne sont faites que quand la file d'écriture est pleine ou quasi pleine... Prenons l'exemple des coprocesseurs IO 81341 et 81342, qui étaient en réalité des ''chipsets'' intégrant un contrôleur SDRAM. Le ''chipset'' avait 5 ports : un pour les processeurs, un pour le pont sud (''southbridge'') et trois pour des canaux DMA. Pour le port processeur, il n'y avait pas de réordonnancement et ce port utilisait une seule mémoire FIFO. Les autres ports utilisaient l'optimisation qu'on vient de voir, et avaient vraisemblablement des files séparées pour les lectures et écritures. Le séquenceur mémoire vérifiait les dépendances mémoire de type RAW et autres. [[File:Double file d'attente pour les lectures et écritures.png|centre|vignette|upright=2.5|Double file d'attente pour les lectures et écritures]] ===Le ré-ordonnancement des commandes mémoires=== L'optimisation précédente est peu poussée, comparé aux formes d'exécution dans le désordre que les processeurs utilisent. Et on peut se demander si une exécution dans le désordre plus poussé est possible. La réponse est oui : un contrôleur mémoire peut faire des réorganisations bien plus poussées. Par contre, il faut faire une précision très importante : le contrôleur mémoire ne remet pas les accès mémoire dans l'ordre avant de les envoyer au processeur. C'est le processeur qui remet en ordre les accès mémoire, dans sa ''load queue''. En clair : le processeur voit les accès mémoire dans le désordre, c'est lui qui les remet en ordre. Pour cela, les requêtes mémoire sont "numérotées", à savoir qu'on leur attribue un identifiant binaire. Le contrôleur mémoire exécute les lectures/écritures dans le désordre, mais garde la trace de leur identifiant. Il sait dans quel ordre il exécute les accès mémoire et connait leur latence. Ce qui fait qu'il sait que la donnée lue à tel instant est associée à la requête mémoire numéro X. Pour les lectures, il renvoie la donnée lue avec l'identifiant. Le processeur sait alors à quelle lecture la donnée lue correspond et il se débrouille en interne pour gérer la situation. Maintenant que ces précisions sont faites, posons cette question : dans quelles situations est-il pertinent de faire des accès mémoire dans le désordre ? La réponse est : quand plusieurs accès à une même ligne ne sont pas consécutifs, qu'il y a des accès entre les deux. Après ré-ordonnancement, ces accès mémoire à une même ligne sont exécutés l'un à la suite de l'autre, ce qui est beaucoup plus rapide. Pour rendre le tout plus concret, voici un exemple. Imaginez que l'on sait les 3 accès mémoire suivants : * Une lecture ligne A ; * PRECHARGE + ACT ; * Une écriture ligne B ; * PRECHARGE + ACT ; * Une lecture ligne A. Sans réordonnancent, on doit émettre deux commandes PRECHARGE quand on passe d'une ligne à l'autre, et il faut ajouter les commandes ACT avec. Pour éviter cela, le contrôleur mémoire peut retarder l'écriture, ou au contraire avancer la seconde lecture. Le résultat est alors le suivant : * Lecture ligne A ; * Lecture ligne A * PRECHARGE + ACT ; * Une écriture ligne B. On a donc deux accès consécutifs à la même ligne, suivi par une écriture dans une autre ligne. La technique marche parce que l'on a un mix adéquat de lectures et d'écritures. Et encore une fois, il faut éviter d'intervertir lectures et écritures à une même adresse, sous peine de problèmes. Encore une fois, les dépendances RAW posent problème ! L'implémentation est assez simple : la ou les mémoires FIFOs précédentes sont remplacées par des mémoires similaires aux fenêtres d'instruction. Le contrôleur mémoire vérifie à chaque cycle les accès en attente, et vérifie à quelle ligne ils accèdent. Il priorise alors les accès qui tombent dans la ligne ouverte : ceux-là sont exécutés avant les autres. S'il n'y en a pas, il prend l'accès mémoire le plus ancien (ordre FIFO). Il teste aussi les dépendances mémoires RAW avant d'envoyer des commandes à la mémoire DDR/SDRAM. une telle solution est appelée l''''algorithme ''FR-FCFS''''' (''First Ready-First Come First Serve''). ===Les optimisations liées à la présence de plusieurs banques=== Les optimisations précédentes sont décuplées par la présence de plusieurs banques dans la mémoire SDRAM. Il est en effet possible de faire plusieurs accès mémoire en même temps, dans des banques différentes. Il est possible de lancer un accès mémoire dans deux banques en même temps, par exemple. La seule contrainte est que la SDRAM est limitée à 4 banques actives en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || colspan="3" bgcolor="#FFFFA0" | Accès mémoire || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || || colspan="3" bgcolor="#A0FFFF" | Accès mémoire || || |- ! Banque Numéro 3 | || || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || || colspan="3" bgcolor="#FFA0FF" | Accès mémoire || |} Les optimisations précédentes peuvent s'appliquer par banque. Il est par exemple possible d'utiliser une mémoire FIFO par banque. Ainsi, les accès dans une même banque se feront en série, dans l'ordre d'arrivée, mais des accès à des banques différentes se feront dans le désordre. Cela ne pose pas de problème, car les accès se font à des adresses différentes, ce qui fait qu'il n'y a pas de conflits majeurs. Il y a cependant un risque que les lectures se fassent dans le désordre si on n'y prend pas garde. [[File:Gestion parallèle des banques.png|centre|vignette|upright=2.5|Gestion parallèle des banques.]] Il est aussi possible d'utiliser une file séparée pour les lectures et les écritures, pour chaque banque. Les performances sont alors améliorées comparé à deux files globales pour toute la SDRAM. En idem avec la réorganisation des accès mémoire, pour regrouper les accès à une même ligne. Un problème avec ces optimisations est qu'il est rare que des accès mémoire se fassent dans des banques séparées. Les accès mémoire tendent à se faire avec une bonne localité spatiale, ce qui fait qu'ils tombent dans une même banque. Heureusement, les contrôleurs SDRAM/DDR modernes incorporent des optimisations pour corriger ce problème. Les optimisations en question sont une forme d'entrelacement adaptée aux mémoires SDRAM. L'entrelacement naïf ne marche pas à cause de la présence du tampon de ligne. Cependant, il peut y avoir un entrelacement entre banques SDRAM. Voyons ce que ça veut dire. L''''entrelacement de banques''' répartit deux lignes consécutives dans deux banques différentes. Pour comprendre l'idée, prenons un exemple. Imaginons une mémoire avec deux banques et 4 lignes. Imaginons qu'on parcoure/balaye la mémoire RAM en partant des adresses basses. Sans entrelacement de ligne, les accès se feront comme suit, de gauche à droite : {|class="wikitable" |+ Adresse mémoire |- ! colspan="4" | Banque numéro 1 !! colspan="4" | Banque numéro 2 |- | Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 || Ligne 1 || Ligne 2 || Ligne 3 || Ligne 4 |} Avec l'entrelacement de banques, les accès se feront comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 !! Banque n°1 !! Banque n°2 |- | Ligne 1 || Ligne 1 || Ligne 2 || Ligne 2 || Ligne 3 || Ligne 3 || Ligne 4 || Ligne 4 |} L'avantage est que passer d'une ligne à la suivante est plus rapide. Pas besoin de fermer la ligne pour passer à la suivante, on ouvre directement la ligne suivante dans une banque différente, ce qui sera plus rapide. La commande PRECHARGE pourra être envoyée à la seconde banque en avance. Pour gérer l'entrelacement, le contrôleur de SDRAM prend en entrée l'adresse envoyée par le processeur, et la découpe en plusieurs champs : un pour sélectionner la banque adéquate, un autre pour la ligne, un autre pour la colonne, un autre pour la rangée. Sans entrelacement, les adresses mémoire sont découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- | Adresse de banque || Adresse de ligne || Adresse de colonne |} Avec l'entrelacement de banques, l'adresse est découpée comme suit. {|class="wikitable" |+ Adresse mémoire |- | Adresse de ligne || Adresse de banque || Adresse de colonne (précise à l'octet) |} Il est aussi possible de faire la même chose, mais avec les rangées ou en utilisant du ''dual channel'', mais je vais passer cela sous silence. Toujours est-il que les méthodes d'entrelacement sont nombreuses et chaque contrôleur mémoire fait un peu à sa sauce. Ils permettent en général de choisir entre plusieurs entrelacements. Au minimum, ils permettent de désactiver l'entrelacement, d'activer un entrelacement de ligne, et d'autres entrelacements plus complexes, dont certains sont propriétaires et tenus secrets par le fabricant. L'entrelacement est géré juste avant le séquenceur mémoire, dans un '''circuit d'entrelacement'''. Ce dernier intervertit certains bits de l'adresse lors des accès mémoires. [[File:Controleur mémoire d'une SDRAM avec entrelacement.png|centre|vignette|upright=2.5|Contrôleur mémoire d'une SDRAM avec entrelacement.]] Les contrôleurs de SDRAM précédents sont assez basiques et ne représentent pas les contrôleurs les plus évolués. Ils étaient utilisés sur les anciens PC, à une époque où ils étaient encore sur la carte mère du processeur. Mais de nos jours, le contrôleur mémoire est intégré au processeur. Et il incorpore de nombreuses optimisations afin de gagner en performances. Malheureusement, ces optimisations sont elles-mêmes dépendantes des optimisations intégrées dans le processeur, ce qui fait qu'on ne peut pas en parler ici. Elles demandent que le contrôleur mémoire reçoive plusieurs accès mémoire simultanés, ce qui n'a aucun sens à ce stade du cours. Aussi, nous allons les passer sous silence pour le moment. Nous les verrons dans le chapitre sur le parallélisme mémoire. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=La désambiguïsation mémoire | prevText=La désambiguïsation mémoire | next=Les processeurs superscalaires | nextText=Les processeurs superscalaires }} </noinclude> iac9lh5f1edkiuebhirgbdlrj4vb74z Commentaire philosophique/Discours sur l'origine et les fondements de l'inégalité parmi les hommes 0 65921 765019 758706 2026-04-25T09:58:56Z PandaMystique 119061 765019 wikitext text/x-wiki [[Catégorie:Commentaire philosophique]] Ce livre s'adresse aux élèves de terminales, mais il peut étendre son public. On y trouve des exemples d'explications de textes. * Pour aller plus loin : [https://fr.wikipedia.org/wiki/Jean-Jacques_Rousseau| Jean-Jacques Rousseau] {|class="wikitable" | style="color:#8080ff;" | <strong>Commentaire : Jean-Jacques Rousseau, 1755 « Discours sur l'origine et les fondements de l'inégalité parmi les hommes ». Le temps de l'histoire et le mal</strong> | [[Fichier:Kscan 0002.jpeg|bordure|300px]] |} =Le temps de l'histoire et le mal= ==L'état de nature== Après avoir montré dans le ''Discours sur les sciences et les arts'' - qui lui valut le Prix de L'Académie de Dijon - que la civilisation a corrompu les hommes, Rousseau cherche à établir que l’inégalité des conditions provient du fait que l'humanité s’est éloignée de ses bienheureuses origines. De ce fait s'il ne saurait y avoir d'inégalités naturelles pour les raisons qu'il établit dans la première partie du discours, se pose à lui un problème. Que s'est-il passé pour que l'homme soit corrompu. La vraie cause est plus lointaine que celle de la civilisation. Ou plutôt, pour le dire autrement, qu'est-ce qui transforme la civilisation en fléau? Rousseau commence par dessiner les traits de l’homme originel : il mène une vie solitaire au cœur des forêts, il est robuste car il n'a pas encore développé la technique. Il a peu de besoins, et ses facultés intellectuelles sont peu développées. Il dort sous un chêne et se nourrit des fruits de l'arbre. Il est frugivore et n'est pas intéressé par la lutte avec l'animal sauvage, sauf pour se défendre. Le sentiment de pitié lui tient lieu de morale. Les différences naturelles sont sans conséquence car les hommes vivent dans un isolement relatif : « ''Je voudrais bien qu’on m’expliquât, précise Rousseau, quel peut-être le genre de misères d’un être libre dont le cœur est en paix et le corps en santé'' ». Dès lors ils ne sauraient se comparer entre eux. Ceci est d'autant plus impossible que les facultés de raison, imagination, volonté... ne sont pas développées même si elles sont latentes et que la "perfectibilité" - à ne pas confondre avec la perfection- est à ses débuts. *Pour résumer il ne dispose que de deux qualités : l'amour-de-soi et la pitié. {| class="sortable" |''"Laissant donc tous les livres scientifiques qui ne nous apprennent qu'à voir les hommes tels qu'ils se sont faits, et méditant sur les premières et plus simples opérations de l'âme humaine, j'y crois apercevoir deux principes antérieurs à la raison, dont l'un nous intéresse ardemment à notre bien-être et à la conservation de nous-mêmes, et l'autre nous inspire une répugnance naturelle à voir périr ou souffrir tout être sensible et principalement nos semblables. C'est du concours et de la combinaison que notre esprit est en état de faire de ces deux principes, sans qu'il soit nécessaire d'y faire entrer celui de la sociabilité, que me paraissent découler toutes les règles du droit naturel ; règles que la raison est ensuite forcée de rétablir sur d'autres fondements, quand par ses développements successifs elle est venue à bout d'étouffer la nature. "'' |} '''L'amour-de-soi''' n'est pas l'amour-propre puisque l'homme ne dispose pas de la raison qui lui permettrait de se comparer (compa-raison). N'ayant pas de conscience de soi dans cet état où autrui est ignoré, il n'a nulle conscience de ce qui lui est propre. Cela exclut dès lors de l'état de nature l'idée de propriété privée. En fait, rien ne destinait l’humanité à connaître les malheurs de l’inégalité qui sont devenus les siens. Comment en est-on arrivé là? Rousseau refuse l'explication du mal par la construction d'une théodicée. Il refuse l'explication religieuse par le péché de la même façon. Ce sera donc l'hypothèse de l'état de nature qui permettra de comprendre. Lorsque les hommes se rassemblent et deviennent sédentaires du fait des jeux de regard, de comparaison et de séduction, le langage se perfectionne, les familles se séparent du groupe, les passions et la jalousie se développent, mais surtout apparaît l'agriculture et la métallurgie. La culture des terres impose l'idée de propriété par la clôture mais c'est le langage qui l'intitue : « le premier qui, ayant enclos un terrain, s’avisa de dire « ceci est à moi », et trouva des gens assez simples pour le croire, fut le vrai fondateur de la société civile. » Dès lors l’inégalité des conditions se développe rapidement : les pauvres sont asservis aux riches, qui imposent des lois qui leur sont favorables. L’inégalité politique succède à l’inégalité économique : les magistrats d’abord élus deviennent des despotes. Pour Rousseau, l’homme moderne est victime du développement (perfectibilité<ref>Ne pas confondre avec perfection ou encore perfectionnement. La perfectibilité conduit au mal.</ref>) de ses facultés et des progrès de la vie en société. ==Explications de textes== === [[../L'état de nature selon Hobbes et Rousseau.|''Étude de texte sur l'état de nature'']] === === [[Étude de texte sur la différence entre l'homme et l'animal à l'état de nature|Étude de texte sur la différence entre l'homme et l'animal à l'état de nature]]=== === ''Étude de texte sur l'invention de l'agriculture'' === {{Boîte déroulante|titre=« Discours sur l'origine et les fondements de l'inégalité parmi les hommes »|contenu= Tant que les hommes se contentèrent de leurs cabanes rustiques, tant qu'ils se bornèrent à coudre leurs habits de peaux avec des épines ou des arêtes, à se parer de plumes et de coquillages, à se peindre le corps de diverses couleurs, à perfectionner ou à embellir leurs arcs et leurs flèches, à tailler avec des pierres tranchantes quelques canots de pêcheurs ou quelques grossiers instruments de musique, en un mot tant qu'ils ne s'appliquèrent qu'à des ouvrages qu'un seul pouvait faire, et à des arts qui n'avaient pas besoin du concours de plusieurs mains, ils vécurent libres, sains, bons et heureux autant qu'ils pouvaient l'être par leur nature, et continuèrent à jouir entre eux des douceurs d'un commerce indépendant: mais dès l'instant qu'un homme eut besoin du secours d'un autre ; dès qu'on s'aperçut qu'il était utile à un seul d'avoir des provisions pour deux, l'égalité disparut, la propriété s'introduisit, le travail devint nécessaire et les vastes forêts se changèrent en des campagnes riantes qu'il fallut arroser de la sueur des hommes, et dans lesquelles on vit bientôt l'esclavage et la misère germer et croître avec les moissons. La métallurgie et l'agriculture furent les deux arts dont l'invention produisit cette grande révolution. Pour le poète, c'est l'or et l'argent, mais pour la philosophie ce sont le fer et le blé qui ont civilisé les hommes et perdu le genre humain ; aussi l'un et l'autre étaient-ils inconnus aux sauvages de l'Amérique qui pour cela sont toujours demeurés tels ; les autres peuples semblent même être restés barbares tant qu'ils ont pratiqué l'un de ces arts sans l'autre ; et l'une des meilleures raisons peut-être pourquoi l'Europe a été, sinon plus tôt, du moins plus constamment et mieux policée que les autres parties du monde, c'est qu'elle est à la fois la plus abondante en fer et la plus fertile en blé. Il est très difficile de conjecturer comment les hommes sont parvenus à connaître et employer le fer : car il n'est pas croyable qu'ils aient imaginé d'eux-mêmes de tirer la matière de la mine et de lui donner les préparations nécessaires pour la mettre en fusion avant que de savoir ce qui en résulterait. D'un autre côté on peut d'autant moins attribuer cette découverte à quelque incendie accidentel que les mines ne se forment que dans des lieux arides et dénués d'arbres et de plantes, de sorte qu'on dirait que la nature avait pris des précautions pour nous dérober ce fatal secret. Il ne reste donc que la circonstance extraordinaire de quelque volcan qui, vomissant des matières métalliques en fusion, aura donné aux observateurs l'idée d'imiter cette opération de la nature ; encore faut-il leur supposer bien du courage et de la prévoyance pour entreprendre un travail aussi pénible et envisager d'aussi loin les avantages qu'ils en pouvaient retirer ; ce qui ne convient guère à des esprits déjà plus exercés que ceux-ci ne le devaient être. '''Jean-Jacques Rousseau''', « Discours sur l'origine et les fondements de l'inégalité parmi les hommes », 1755. }} *La question que pose le texte est de comprendre ce qui a fait sortir l'homme naturel de l'état de nature.Cet état n'appartient pas à l'histoire. Comme il l'explique dans la Préface, ce n'est qu'une hypothèse théorique. Comme Newton en physique, il construit un modèle. Ainsi l'homme à l'état de nature n'a jamais existé,il n'existe pas et n'existera jamais. Il est hors du temps. Si le temps est source du mal reste à comprendre pourquoi.C'est le but de ce texte de penser l'origine du mal, ce dernier n'ayant aucun fondement dans la nature de l'homme. == I. La perte de l'origine == Le premier paragraphe est une phrase unique. Longue période oratoire composée de plusieurs subordonnés et construite autour d'une articulation importante qui se situe à la ligne 10 : « mais ». Surgit la rupture. Une opposition est ainsi mise en place, soulignée chronologiquement par les locutions conjonctives « tant que, dès l'instant que ». Nous sommes dans le temps de l'histoire. Au début c'est comme il l'écrit "la véritable jeunesse du monde" où l'événement se fait rare. Le temps se donne dans la durée. La durée nous rapproche de l'état de nature. le temps en effet ne s'inscrit pas encore dans la succession. La technique n' a fait encore qu'une faible apparition : « cabanes rustiques », « coudre leurs habits de peaux avec des épines ou des arêtes », « se parer de plumes et de coquillages », « se peindre le corps de diverses couleurs », « perfectionner ou à embellir leurs arcs et leurs flèches », tailler avec des pierres ». Ce sont la des besoins modestes, limités : « se contentèrent, se bornèrent ». Les lignes « en un mot, tant qu'ils ne s'appliquèrent qu'à des ouvrages qu'un seul pouvait faire, et à des arts qui n'avaient pas besoin du concours de plusieurs mains, ils vécurent libres, sains, bons et heureux autant qu'ils pouvaient l'être » réservent les traits communs à ces activités.C'est l'époque des familles et le faible déploiement de la technique - il y a encore des forêts. L’énumération de quatre adjectifs : « libres, sains, bons et heureux » exprime de manière insistante une vie collective réussie. Le malheur n'est pas encore là. La présence de la conjonction « mais » attire l’attention sur un changement brutal et rapide exprimé par deux prépositions de temps : « Dès qu’on s’aperçut, dès l’instant qu’un homme eut besoin. » Cette présentation est aussitôt suivie de ces effets, tous néfastes, et qui symboliquement se manifestent par la disparition des forêts - on retrouve là la critique de la technique présente depuis le début du texte. On a perdu l'origine : apparition de la propriété et du travail, disparition de l’égalité. Il n'y a plus de rapport immédiat à la nature et aux hommes. Les obstacles se multiplient dans les relations humaines. == La question du temps dans le texte == L’extrait ne donne aucune date et ne mentionne pas les différents états de civilisation ; mais la notion de temps, dans son aspect d’évolution, est omniprésente dans le texte. Le premier paragraphe est constitué de deux étapes chronologiquement situées l’une après l’autre. *1<sup>ère</sup> étape : longue → « tant que » le suggère ; *2<sup>ème</sup> étape : aucune indication de durée mais « dès l’instant que, dès que ». Installation progressive → verbes « s’introduire, devint, croître… » le suggèrent. Le temps est également présent dans la suite du texte, et il souligne la nécessité d’une évolution par les termes : « sont parvenus, esprits déjà plus avancés, longtemps avant, devenus plus industrieux... ». du temps de l'histoire qui conduit les hommes au malheur. {|class=wikitable |+Exercice |Pourquoi Rousseau emploie-t-il le terme de "conjectures"? |Pourquoi la question de "l'origine" pose-t-elle problème? |} {{AutoCat}} gbribu5h9m3jaiyo9t8ur4e5f7e4c4p Fonctionnement d'un ordinateur/La cohérence des caches 0 65959 764833 764831 2026-04-24T12:06:52Z Mewtow 31375 /* L'espionnage du bus */ 764833 wikitext text/x-wiki Il est possible d'utiliser des caches avec la mémoire partagée, mais aussi sur les architectures distribuées et les architectures NUMA. Néanmoins, la gestion des caches peut poser des problèmes dits de '''cohérence des caches''' quand une donnée est présente dans plusieurs caches distincts. [[File:Cohérence des caches.png|vignette|upright=1|Cohérence des caches]] Introduisons la cohérence des caches par un exemple. Prenons deux cœurs/processeurs qui ont chacun une copie d'une donnée dans leur cache. Si un processeur modifie sa copie de la donnée, l'autre ne sera pas mise à jour. L'autre processeur manipule donc une donnée périmée : il n'y a pas '''cohérence des caches''', sous-entendu cohérence entre le contenu des différents caches. [[File:Non Coherent.gif|centre|vignette|upright=2.5|Caches non-cohérents.]] Or, il faut éviter cela sous peine d'avoir des problèmes. Mais avoir des caches cohérents demande d'avoir une valeur à jour de la donnée dans l'ensemble de ses caches, ce qui implique que les écritures dans un cache doivent être propagées dans les caches des autres processeurs. Il est possible de rendre des caches cohérents avec diverses méthodes qu'on va voir dans ce chapitre. Les deux animations ci-dessous montrent l'exemple de caches non-cohérents et de caches cohérents. [[File:Coherent.gif|centre|vignette|upright=2.5|Caches cohérents.]] Les problèmes de cohérence des caches se manifestent sur toutes les architectures multiprocesseur/multicœur, mais ils peuvent même se manifester avec un seul processeur ! Ils surviennent dès qu'un tiers peut écrire dans la RAM, peu importe que ce soit un autre processeur, un périphérique, un contrôleur DMA, ... Nous avions déjà vu de tels problèmes avec les transferts DMA et les TLBs, mais sans en dire le nom. Par exemple, un transfert DMA modifie des données en RAM, mais pas leurs copies dans le cache. Pareil pour les TLBs : modifier une entrée de la table des pages ne modifie pas sa copie dans la TLB. Et jusqu'ici, ces problèmes de cohérences étaient réglés en invalidant le cache, quand les circonstances l'exigent. Elle est simple à implémenter, pour un cout en performance qui dépend de la fréquence des invalidations. Pour les TLBs, modifier le contenu d'une table des pages est peu fréquent, ce qui fait qu'elles sont des candidats parfaits pour la cohérence par invalidation. La seule difficulté est que toute modification de la table des pages doit entrainer une invalidation des TLBs de tous les processeurs. Pour cela, le système d'exploitation envoie une interruption inter-processeurs spécifique, dont la routine invalide les TLBs. L'interruption est distribuée à tous les processeurs, sans exception, même au processeur envoyeur. Mais pour les caches de données, invalider les caches de données à chaque écriture aurait un cout en performance trop important, vu qu'elles sont écrites très souvent. Pour complémenter l'invalidation des caches, les ingénieurs ont inventé des méthodes alternatives spécifiques aux caches de données. Elles permettent de détecter les données périmées et les mettre à jour. Le tout a été formalisé dans des '''protocoles de cohérence des caches'''. Les protocoles de cohérence des caches marquent les lignes de cache comme invalides, si elles ont une donnée périmée. Les lignes de cache invalides ne peuvent pas être lues ou écrites. Toute lecture/écriture d'une ligne de cache invalide entraine un défaut de cache automatique. Les lignes de caches sont alors mises à jour avec une donnée valide. Le rôle d'un protocole de cohérence des caches est de détecter les copies périmées et de les mettre à jour automatiquement. Les problèmes de cohérence des caches surviennent dès qu'on a plusieurs caches dans une architecture parallèle, sauf pour quelques exceptions. Tout protocole de cohérence des caches doit répondre à plusieurs problèmes. * Premièrement : comment identifier les données invalides ? * Deuxièmement : comment les autres caches sont-ils au courant qu'ils ont une donnée invalide ? * Troisièmement : comment mettre à jour les données invalides ? Les deux derniers problèmes impliquent une forme de communication entre les caches du processeur. Et pour cela, voyons par quel intermédiaire ils communiquent. Pour rappel, les processeurs/cœurs sont connectés entre eux soit avec un bus partagé, soit avec un réseau d'interconnexion assez complexe. Les deux situations n'utilisent pas les mêmes protocoles de cohérence des caches. Par contre, le premier problème implique d'associer un état valide/invalide à chaque ligne de cache, et c'est quelque chose d'indépendant de la communication entre processeurs. Voyons le premier problème avant de passer aux deux autres problèmes. ==Les états d'une ligne de cache : identifier les données invalides== La cohérence des caches détecte les lignes de cache invalides. Pour cela, le protocole de cohérence des caches attribue à chaque ligne de cache un état, qui indique si la ligne de cache contient une donnée périmée, une donnée valide, ou autre. Le '''protocole SI''' est le protocole de cohérence des caches le plus simple qui soit. Il ne gère que deux états : ligne de cache valide, ligne de cache invalide. L'état est encodé avec un '''''bit valid''''', un par ligne de cache, qui indique si la donnée est invalide ou non. Il est vérifié lors de chaque lecture. Voici décrit en image le fonctionnement de ce protocole. Un processeur garde une donnée valide tant qu'aucun autre processeur n'écrit dedans. Si cela arrive, la donnée devient invalide et toute lecture/écriture dedans se fait rejeter, un défaut de cache survient. Le processeur envoie alors une transaction sur le bus pour récupérer une donnée valide. [[File:Diagramme d'état du protocole SI.png|centre|vignette|upright=2|Diagramme d'état du protocole SI.]] Les protocoles plus élaborés ajoutent d'autres états pour des raisons d'optimisation. Les états en question sont encodés sur quelques bits, ajoutés à chaque ligne de cache, dans les bits de contrôle. Voyons ces protocoles plus élaborés dans ce qui suit. ===Le protocole MSI=== La cohérence des caches est très simple quand on a des caches ''write-trough'', mais ces derniers sont à l'origine de beaucoup d'écritures en mémoire qui saturent le bus. Aussi, on a inventé les caches ''Write-back'', où le contenu de la mémoire n'est pas cohérent avec le contenu du cache. Si on écrit dans la mémoire cache, le contenu de la mémoire RAM n'est pas mis à jour. On doit attendre que la donnée sorte du cache pour l'enregistrer en mémoire ou dans les niveaux de caches inférieurs (s'ils existent), ce qui évite de nombreuses écritures mémoires inutiles. Divers protocoles de cohérence des caches existent pour les caches ''Write Back''. Le plus simple d'entre eux est le protocole MSI. Pour simplifier, il permet à des cœurs de réserver en lecture et écriture des lignes de cache, bien que la réservation soit temporaire. Elles utilise pour cela trois états : ''Modified'', ''Shared'' et ''Invalid''. L'état ''Shared'' change et correspond maintenant à une donnée à jour, présente dans plusieurs caches. L'état ''Modified'' correspond à une donnée à jour, mais dont les copies des autres caches sont périmées. L'état ''Invalid'' correspond encore une fois au cas où la donnée présente dans le cache est périmée. Le protocole permet à un cœur de réserver une ligne de cache/donnée temporairement. Tout part d'une ligne de cache en état ''Shared'', c'est à dire accesible en lecture. Elle n'est pas réservée en écriture, mais elle est consultable par un ou plusieurs cœurs. Soit un seul coeur a chargé la donnée dans son cache, soit d'autres coeurs ont une copie de la donnée dans leur cache, peu importe. La seule contrainte est que l'on sait que tous les coeurs ont la même copie de la donnée, la cohérence des caches est donc respectée. Le protocole de cohérence doit faire en sorte de repasser dans l'état ''Shared'' après la moindre violation de cohérence des caches. Le seul évènement capable de violer la cohérence des caches est la survenue d'une ou de plusieurs écritures. Pour qu'une écriture ait lieu, il faut qu'un cœur réserve la donnée en écriture. Pour cela, le ou les cœurs effectuent une écriture, ils tentent d'écrire dans la donnée voulue. S'il est le seul cœur à vouloir écrire à ce moment, il réservera la ligne de cache automatiquement. Mais si d'autres cœurs veulent modifier la donnée en même temps, une compétition avec les autres cœurs pour la réservation et un seul des cœurs gagnera la course. Quoiqu'il en soit, un cœur réservera la donnée et sa copie de la ligne de cache passe de l'état ''Shared'' à l'état ''Modified''. Les autres cœurs voient leur ligne de cache passer de l'état ''Shared'' à l'état ''Invalid''. L'état ''Modified'' signifie que le coeur a réussît à réserver la ligne de cache aussi bien en écriture qu'en lecture. Seul lui peut lire ou écrire la donnée à sa guise. L'état ''Invalid'', quant à lui, sert à deux choses. Premièrement, il prévint qu'un autre cœur a réservé la donnée en écriture, ce qui bloque l'écriture dans la ligne de cache par tout autre cœur. Deuxièmement, il bloque aussi les lectures. Il prévint qu'un autre coeur a modifié la donnée, que la ligne contient actuellement une donnée périmée. Tout accès mémoire à une ligne de cache ''Invalid'' déclenche alors des mesures correctives afin de rétablir la cohérence des caches. Le contenu de la ligne de cache en état ''Modified'' est alors envoyé à tous les autres caches, la cohérence est rétablie, et les lignes de cache passent toutes en état ''Shared'', jusqu’à la prochaine écriture. [[File:Diagramme d'état informel du protocole MSI.png|centre|vignette|upright=2|Diagramme d'état informel du protocole MSI.]] Il est possible de modifier le fonctionnement précédent pour tenir compte d'un cas très spécifique : une écriture dans une ligne de cache marquée ''Invalid''. L'écriture est bloquée pour une ligne de cache en état ''Invalid'', car un autre cœur l'a réservée, elle est bloquée en attendant de recevoir la donnée valide. Mais vu qu'elle sera écrasée de toute manière, autant faire passer la ligne de cache directement en état ''Modified''. L'optimisation est intéressante, mais il faut tenir compte du fait que dans ce cas, on a deux écritures qui se suivent dans le temps, réalisées par deux cœurs, appelons-les cœur 1 et cœur 2. La première écriture, faite par cœur 1, a marqué la ligne de cache comme invalide pour les autres, en ''Modified'' pour lui. La seconde, réalisée par le cœur 2, met sa ligne de cache en état ''Modified'' pour lui, ''Invalid'' pour les autres. Des problèmes de ''race condition'' peuvent survenir, le protocole doit gérer ce genre de cas où deux écritures se suivent de près. Dans ce cas, la dernière écriture doit fournir la donnée valide. La donnée qui était en état ''Modified'' dans le cœur 1 doit passer en état invalide, il perd la réservation en écriture. Le protocole précédent doit donc être adapté de manière à ajouter deux transitions : une de M vers I si un autre processeur écrit la donnée, et I vers M si le processeur écrit la donnée lui-même. [[File:Modified-Shared-Invalid Protokoll.png|centre|vignette|upright=2|Diagramme du protocole MESI. Les abréviations PrRd et PrWr correspondent à des accès mémoire initiés par le processeur associé au cache, respectivement aux lectures et écritures. Les abréviations BusRd et BusRdx et Flush correspondent aux lectures, lectures exclusives ou écritures initiées par d'autres processeurs sur la ligne de cache.]] Notons les trois état M, S et I, pour faire simple. Avec ce système, les lectures sont possibles seulement pour les lignes de cache en état M et S. Toute lecture d'une ligne de cache en état I se termine avec un défaut de cache. Le processeur envoie alors une requête GetS pour récupérer la donnée valide dans les caches d'un autre cœur, une donnée en étant S. L'état I force donc un défaut de cache lors des lectures. Pour les écritures, c'est différent. Les écritures dans une ligne de cache en état M sont automatiquement des succès de cache. Mais les lignes de cache en état S ou I sont traitées autrement. Une telle écriture envoie un signal GetM qui demande à réserver la ligne de cache en écriture. Si la requête est acceptée, la ligne de cache passe en état M, l'écriture est un succès de cache, les autres caches invalident leur copie de la donnée. ===Le protocole MESI=== [[File:Diagrama MESI.GIF|vignette|Diagramme du protocole MESI. Les abréviations PrRd et PrWr correspondent à des accès mémoire initiés par le processeur associé au cache, respectivement aux lectures et écritures. Les abréviations BusRd et BusRdx et Flush correspondent aux lectures, lectures exclusives ou écritures initiées par d'autres processeurs sur la ligne de cache.]] Le protocole MSI n'est pas parfait. Un de ses défauts est que l'état '''Shared'' ne fait pas la différence entre une donnée présente dans un seul cache, et une donnée partagée par plusieurs cœurs. C'est un défaut car toute écriture déclenche des opérations correctives pour gérer la cohérence des caches, qui sont inutiles si un seul cœur a une copie de la donnée. Elles préviennent les autres caches pour rien en cas d'écriture dans une donnée non-partagée. Et les communications sur le bus ne sont pas gratuites. Pour régler ce problème, on peut scinder l'état ''Shared'' en deux états : ''Exclusive'' si les autres processeurs ne possèdent pas de copie de la donnée, ''Shared'' si la donnée est partagée sur plusieurs cœurs. Le '''protocole MESI''' ainsi créé est identique au protocole MSI, avec quelques ajouts. Par exemple, si une donnée est lue la première fois par un cœur, la ligne de cache lue passe soit en ''Exclusive'' (les autres caches n'ont pas de copie de la donnée), soit en ''Shared'' (les autres caches en possèdent déjà une copie). Une donnée marquée ''Exclusive'' peut devenir ''Shared'' si la donnée est chargée dans le cache d'un autre processeur. Comment le processeur fait-il pour savoir si les autres caches ont une copie de la donnée ? Pour cela, il faut ajouter un fil Shared sur le bus, qui sert à dire si un autre cache a une copie de la donnée. Lors de chaque lecture, l'adresse à lire sera envoyée à tous les caches, qui vérifieront s'ils possèdent une copie de la donnée. Une fois le résultat connu, chaque cache fournit un bit qui indique s'il a une copie de la donnée. Le bit Shared est obtenu en effectuant un OU logique entre toutes les versions du bit envoyé par les caches. ===Les protocoles MOSI et MOESI=== Les protocoles MESI et MSI ne permettent pas de transférer des données entre caches sans passer par la mémoire. Si le processeur demande la copie valide d'une donnée, tous les caches ayant la bonne version de la donnée répondent en même temps et la donnée est envoyée en plusieurs exemplaires ! Pour éviter ce problème, on doit rajouter un état supplémentaire : l'état ''Owned''. Si un processeur écrit dans son cache, il mettra sa donnée en Owned, mais les autres caches passeront leur donnée en version Modified, voire Shared une fois la mémoire mise à jour. Ainsi, un seul processeur pourra avoir une donnée dans l'état Owned et c'est lui qui est chargé de répondre aux demandes de mise à jour. [[File:MOSI Processor Transactions.png|vignette|Protocole MOSI, transactions initiées par le processeur associé à la ligne de cache.]] [[File:MOSI Bus Transactions.png|vignette|Protocole MOSI, transactions initiées par les autres processeurs.]] Divers protocoles de cohérences des caches utilisent cet état Owned. Le premier d’entre eux est le '''protocole MOSI''', une variante du MESI où l'état exclusif est remplacé par l'état O. Lors d'une lecture, le cache vérifie si la lecture envoyée sur le bus correspond à une de ses données. Mais cette vérification va prendre du temps, et le processeur va devoir attendre un certain temps. Si au bout d'un certain temps, aucun cache n'a répondu, le processeur postule qu'aucun cache n'a la donnée demandée et va lire la donnée en mémoire. Ce temps est parfois fixé une fois pour toute lors de la création des processeurs, mais il peut aussi être variable, qui est géré comme suit : * pour savoir si un cache contient une copie de la donnée demandée, chaque cache devra répondre en fournissant un bit ; * quand le cache a terminé la vérification, il envoie un 1 sur une sortie spécifique, et un 0 sinon ; * un ET logique est effectué entre tous les bits fournis par les différents caches, et le résultat final indique si tous les caches ont effectué leur vérification. On peut aussi citer le '''protocole MOESI''', un protocole MESI auquel on a jouté l'état O. ==La cohérence des caches par espionnage du bus== L''''espionnage du bus''' est la technique de cohérence du cache la plus simple à comprendre, du moins sur le principe. Aussi, nous allons la voir en premier. Avec elle, les caches sont reliés à bus partagé, qui communique avec les niveaux de cache inférieurs ou avec la RAM. Faisons d'abord un rappel sur ce qu'est ce bus partagé. ===Les bus partagés : rappels et implémentation de la cohérence des caches=== Le premier cas est celui où plusieurs processeurs/cœurs sont connectés à la mémoire RAM à travers un bus partagé. Les processeurs disposent d'une mémoire cache chacun et ils sont tous reliés à la mémoire RAM à travers le bus mémoire. Dans ce cas, tous les caches ont connectés au bus mémoire, qui sert de point de ralliement. Sans cohérence des caches, les communications se font dans le sens ''cache -> mémoire'' ou ''mémoire -> cache''. L'idée est alors de rajouter les communications ''cache- -> cache'' sur le bus mémoire. La mémoire ne répond pas forcément à de telles communications. [[File:Architecture multicoeurs à bus partagé.png|centre|vignette|upright=2|Architecture multicoeurs à bus partagé]] L'idée marche très bien, mais il faut l'adapter sur les processeurs multicœurs, qui ont une hiérarchie de cache assez complexe. Les caches partagés entre tous les cœurs ne posent aucun problème de cohérence car, avec eux, la donnée n'est présente qu'une seule fois dans tout le cache. Par contre, il faut gérer la cohérence entre caches dédiés. [[File:Shared cache coherency.png|centre|vignette|upright=2|Cohérence et caches partagés. Vous remarquerez que sur le schéma, la mémoire RAM contient encore une autre version de la donnée car on utilise un cache ''Write Back'').]] Le cas le plus simple est celui à deux niveaux de caches, avec des caches L1 dédiés et un cache L2 partagé entre tous les cœurs. Les caches L1 sont reliés au cache L2 partagé par un bus, qui n'a souvent pas de nom. Nous désignerons le bus entre le cache L1 et le cache L2 : '''bus partagé''', sous-entendu partagé entre tous les caches. Sans cohérence des caches, les transferts sur ce bus se font des caches L1 vers le cache L2 partagé, ou dans l'autre sens. Là encore, l'idée est de faire communiquer les caches L1 via le bus partagé. [[File:Architecture multicoeurs à bus partagé entre caches L1 et L2.png|centre|vignette|upright=2|Architecture multicoeurs à bus partagé entre caches L1 et L2]] Dans ce qui va suivre, quand nous parlerons de bus partagé, cela voudra dire : soit on parle du bus entre le L1 et le L2 sur un processeur multicœur, soit on parle du bus mémoire sur une architecture multi-processeur/multicœurs avec des caches dédiés. L'idée est que ce bus partagé existe avec ou sans cohérence des caches. Sans cohérence, il permet d'échanger des données entre deux niveaux de la hiérarchie mémoire : cache L1 vers L2, caches vers mémoire. Avec cohérence, le bus partagé interconnecte les caches entre eux. ===L'espionnage du bus=== Les protocoles à '''espionnage du bus''' sont des protocoles où les transmissions entre caches se font sur le bus partagé. Le nom qui trahit l'idée qui se cache derrière cette technique : les caches interceptent les écritures sur le bus partagé, qu'elles proviennent ou non des autres processeurs. Quand un cœur/processeur écrit une donnée dans son cache L1, un signal est envoyé sur le bus partagé pour prévenir les autres caches, afin qu'ils invalident la ligne de cache concernée. De plus, il faut aussi mettre à jour les copies en question avec une donnée valide, ce qui passe là-encore par le bus partagé. L'implémentation la plus simple demande juste un bus partagé, les processeurs espionnent le bus eux-mêmes. Cependant, de nombreux processeurs multicœurs délèguent l'espionnage du bus au ''chipset'', ou au contrôleur mémoire. Un exemple est celui de l'Intel E8870, où l'espionnage du bus est géré par un circuit séparé, qui n'est pas connecté directement au bus partagé. Le circuit d'espionnage du bus est appelé le ''Scalability Port Switch'' (SPS). Il y en a deux dans le ''chipset'', qui communiquent entre eux, mais passons sur ce détail. Avec cette organisation, les accès mémoire passent par le contrôleur mémoire, qui les envoie au SPS, puis à la RAM si besoin. Le SPS gère alors la cohérence des caches, et détecte quand des invalidations doivent être propagées. Le ''chipset'' peut relier 16 processeurs entre eux. Les processeurs sont regroupés en groupes de 4 processeurs, avec un contrôleur mémoire partagé par groupe. Les contrôleurs mémoire sont appelés des ''Scalable Node Controller'' (SNC). Les SNC incorporent de nombreuses optimisations : ils sont capables de changer l'ordre des accès mémoire, peuvent mettre en attente des écritures pour 64 lignes de cache (jusqu'à 8 kibioctets d'écritures), les adresses mémoire sont entrelacées, etc. [[File:Intel E8870.png|centre|vignette|upright=2|Intel E8870.]] Ce système permet d'implémenter des optimisations pour les lectures. Normalement, le processeur envoie la lecture sur le bus partagé, et il attend de voir si un autre cache répond. Si aucun cache ne répond, c'est un défaut de cache total, et le contrôleur mémoire lit la donnée en RAM. L'intel E8870 démarre l'accès en RAM avant qu'un autre cache ne réponde. La vérification des autres caches se passe donc en même temps que l'accès mémoire. Si aucun cache ne répond, l'accès aura été lancé en avance. Si un cache répond, il a juste à annuler la lecture entamée. Si celle-ci a été mise en attente dans le contrôleur mémoire, l'annulation n'entrainera pas de lecture sur le bus mémoire. Sinon, la lecture en RAM s'exécutera, mais la donnée lue sera juste ignorée. ===La mise à jour et l'invalidation sur écriture=== Voyons d'abord comment la mise à jour des copies se fait. La solution la plus simple pour cela est de propager les écritures dans les niveaux de cache inférieurs, jusqu'à la mémoire. L'écriture est alors transmise sur le bus partagé, les autres caches ont juste à récupérer la donnée et l'adresse écrite. Si l'adresse match une ligne de cache, la ligne de cache est mise à jour immédiatement avec la donnée envoyée sur le bus partagé. Le cache est alors mis à jour immédiatement, la ligne de cache n'a même pas le temps d'être invalidée. On parle alors de '''mise à jour sur écriture'''. Avec elle, les caches sont mis à jour automatiquement le plus tôt possible, il n'y a pas d'invalidation proprement dit. La solution la plus simple pour cela est d'utiliser des caches ''write through'', qui propagent toute écriture dans les niveaux de cache inférieurs, jusqu'à la mémoire. Toute écriture dans une ligne de cache déclenche alors une mise à jour. Mais l'impact sur le débit binaire est alors très important. Aussi, la plupart des processeurs préfèrent utiliser des caches ''write back'' pour gagner en performance. Dans ce cas, les écritures qui sont propagées dépendent de l'état de la ligne de cache écrite. Écrire dans une ligne de cache en état ''Exclusive'' ne déclenchera pas de mise à jour, par exemple. Seules les écritures dans des lignes de cache en état ''Modified'' et ''Shared'' le feront. Mais il est aussi possible de ne pas mettre à jour les lignes de cache à chaque écriture, et de préférer attendre. À la place, l'écriture est remplacée par un ''signal d'invalidation'' qui transmet uniquement l'adresse écrite et n'est pas pris en compte par le cache L2/L3 partagé. Il prévient les autres caches que telle ligne de cache a été modifiée et qu'il faut en invalider les copies. Le cache se contente de marquer la ligne de cache fautive comme invalide, mais ne la met pas à jour. Il y a alors '''invalidation sur écriture'''. La ligne de cache est mise à jour lors d'une lecture/écriture. Tout accès à une ligne de cache invalide entraine un défaut de cache et la donnée est chargée depuis la RAM et/ou depuis un autre cache. Les deux techniques précédentes différent sur un point : la première met à jour la ligne de cache immédiatement, la seconde attend que la ligne de cache soit lue/écrite avant de mettre à jour, elle le fait au dernier moment. Le temps d'accès à une donnée est donc plus long avec ces derniers. Avec la mise à jour sur écriture, la donnée est mise à jour tout de suite, les accès ultérieurs ne déclenchent pas de défaut de cache, la donnée est accessible directement. Le temps d'accès moyen est donc plus faible. Par contre, une partie des mises à jour sont inutiles, car les autres processeurs ne liront pas la donnée ou alors pas tout de suite. Avec l'invalidation, on met à jour les lignes de cache quand la donnée est lue, quand elle est réellement utilisée. Vu qu'une mise à jour est plus gourmande en énergie qu'une simple invalidation, on n'est pas forcément gagnant. Une mise à jour demande un accès complet au cache, avec écriture dans le plan mémoire. Alors d'une invalidation demande simplement de modifier les bits de contrôle d'une ligne de cache. De nos jours, les caches utilisent l'invalidation sur écriture pour des raisons de complexité d'implémentation. Les protocoles à mise à jour sur écriture sont plus complexes à implémenter pour de sombres raisons de consistance mémoire. ===La mise à jour en cas d'invalidation sur écriture=== Avec l'invalidation sur écriture, la mise à jour des lignes de cache se fait séparément de l'invalidation. Et dans ce cas, il faut trouver où se trouve la donnée valide. La donnée valide est présente soit dans le cache d'un autre processeur, soit dans la mémoire RAM. La donnée valide est copiée depuis cette source, c'est une simple transaction mémoire. Voyons ce qu'il en est. Le cas le plus simple est celui où plusieurs processeurs ont un cache chacun et sont reliés à une mémoire partagée. L'implémentation la plus simple lit la donnée valide depuis la RAM. Elle utilise alors des caches de type ''write-through'', où les écritures sont propagées la mémoire RAM. Il est possible de faire la même chose avec un cache ''write-back'', cependant. Mais il doit se comporter comme un cache ''write-through'' en propageant des écritures dans certaines situations. Dès qu'il écrit une ligne de cache en état ''Modified'' ou ''Shared'', il propagera l'écriture dans la RAM. Par contre, s'il a une ligne de cache en état ''Exclusive'', il n'a pas à propager les écritures dans le niveau de cache inférieur, il n'a pas à générer de signal d'invalidation du tout. Une autre solution fait une copie depuis le cache qui contient la donnée valide, sans passer par la mémoire RAM. Les copies entre caches passent par le bus mémoire, la différence étant que la mémoire ne répond pas forcément à des transferts. Les caches étant plus rapides que la RAM, les copies entre caches sont plus rapides qu'un accès en mémoire RAM, même si les deux utilisent le même bus. L'état ''Owned'' permet d'optimiser cette situation : c'est le cache en état ''Owned'' qui répond alors à la requête mémoire. [[File:Cohérence des caches write-through.png|centre|vignette|upright=3|Cohérence des caches ''write-through''.]] Sur les architectures multicœurs, le cache partagé prend la place de la mémoire RAM et le bus partagé celui du bus mémoire. En général, les caches L2 sont inclusifs, à savoir que toute donnée écrite dans les caches L1 est présente dans le cache L2. La donnée valide est donc généralement lue depuis le cache partagé L2/L3. Quand un cache a besoin d'une donnée valide, il envoie une '''requête de mise à jour''', qui demande aux autres caches s'ils ont une donnée valide. La donnée valide est en état ''Modified'' ou ''Owned''. Si un cache a une donnée dans cet état, il répond aux requêtes de mise à jour en envoyant la donnée voulue, éventuellement avec l'adresse. Le cache demandeur reçoit la donnée et met à jour sa ligne de cache. Les autres caches ne tiennent pas forcément compte de cette mise à jour. Du moins, pas avec "invalidation sur écriture" pure, mais certains caches sont un peu plus opportunistes et en profitent pour mettre à jour la ligne de cache au cas où. On peut les voir comme des intermédiaires entre invalidation et mise à jour sur écriture. ==La cohérence des caches à base de répertoires== La cohérence des caches à base de répertoire utilise un '''répertoire''', qui mémorise l'état de chaque ligne de cache, mais aussi quel processeur dispose de telle ou telle ligne de cache. Les processeurs envoient des requêtes au répertoire avant chaque accès au cache. Le répertoire va alors soit répondre favorablement et autoriser l'accès au cache, soit l'interdire. Une réponse favorable signifie que le processeur a une donnée valide, une réponse défavorable signifie que la ligne de cache accédée doit être mise à jour. La cohérence des caches est donc gérée par le répertoire, qui est centralisé. L'usage d'un répertoire est la norme sur les architectures NUMA, avec plusieurs ordinateurs reliés entre eux. Avec l'arrivée des processeurs multicœurs avec une hiérarchie de cache, les architectures à mémoire partagée se sont mises à s'inspirer des protocoles à répertoire pour gagner en performance. L'usage de caches de répertoire a permis d'utiliser la technique sur les processeurs multicœurs normaux, en complément de l'espionnage du bus. ===L'usage des répertoires sur les architectures NUMA=== Plusieurs architectures différentes utilisent une cohérence des caches par répertoire. Leur usage le plus intuitif est celui des architectures NUMA, avec plusieurs ordinateurs reliés entre eux via réseau. Sur les architectures NUMA, une donnée lue depuis la RAM d'un autre ordinateur peut être mise en mémoire cache. Et la moindre modification d'une copie doit être propagée via réseau sur les autres ordinateurs. Autant dire que la cohérence des caches est assez compliquée sur de telles architectures. Avec elles, chaque ordinateur a une copie du répertoire, pour gérer les données provenant des mémoires des autres ordinateurs. [[File:Cohérence des cache à répertoire.jpg|centre|vignette|upright=2.5|Cohérence des caches - Répertoire décentralisé.]] Les répertoires sont utilisés sur les architectures NUMA. Rappelons que sur de telles architectures, chaque processeur a une mémoire dédiée, mais qu'il a accès à toutes les mémoires de l'architecture à travers un réseau local. La mémoire dédiée au processeur est appelée la ''mémoire locale'', alors que celles des autres processeurs sont appelées les ''mémoires distantes''. Une partie de l'espace d'adressage est associé à la mémoire locale, mais le reste de l'espace d'adressage est associé aux mémoires distantes. Quand le processeur veut lire/écrire dans sa mémoire locale, le répertoire n'est pas consulté. Mais quand il veut lire/écrire en dehors, le répertoire est consulté pour gérer la cohérence des caches. [[File:Espace d'adressage d'une architecture NUMA.png|centre|vignette|upright=2|Espace d'adressage d'une architecture NUMA.]] Voyons maintenant comment le tout fonctionne. Nous allons prendre l'architecture illustrée ci-dessous. Elle contient plusieurs ordinateurs, chacun avec une mémoire locale reliée à un ou plusieurs processeurs multicœur aux hiérarchies de caches complexes. Nous n'allons pas nous intéresser aux caches L1/L2/L3, mais allons nous concentrer sur la mémoire cache L4, partagée entre plusieurs processeurs. Il s'agit d'une mémoire cache spécialisée dans les accès aux mémoires distantes. Elle contient des données provenant des mémoires distantes, qui ont été chargées lors d'accès antérieurs. Nous allons l'appeler le '''cache distant''' pour simplifier les explications. Les accès aux mémoires distantes se font via le réseau local d'interconnexion, mais le résultat des lectures est mémorisé dans le cache distant, ce qui évite de faire un accès réseau à chaque lecture/écriture. Le répertoire est consulté pour tout accès au cache distant, mais n'est pas consulté pour l'accès aux caches L1/L2/L3 gérés par espionnage de bus. Il l'est seulement quand un ordinateur veut accéder aux données d'une mémoire distante, lors d'un accès en dehors de l'espace d'adressage de la mémoire locale. [[File:Cc-NUMA System.svg|centre|vignette|upright=3|Architecture Ccc-NUMA.]] Pour comprendre comment le répertoire et le cache L4 sont utilisés, partons du principe qu'un processeur veuille lire une donnée située dans une mémoire distante. Le cache L4 ne contient pas la donnée en question, ce qui déclenche un défaut de cache. Une transaction réseau est alors démarrée, pour rapatrier la donnée dans le cache L4. Le rapatriement peut simplement lire la donnée dans la mémoire principale si elle n'a pas été cachée, mais elle peut aussi aller la chercher dans les caches du processeur distant si nécessaire (comme illustré ci-dessous). Les répertoires sont alors mis à jour sur tous les ordinateurs. Le répertoire permet de désigner quel processeur a une copie de la donnée voulue, et d'aller la chercher sans demander à tous les processeurs. [[File:Cc-NUMA Remote Memory Read.svg|centre|vignette|upright=2|Architecture Ccc-NUMA, lecture dans une mémoire distante.]] Intuitivement, on se dit que les futurs accès à cette donnée rapatriée se font dans le cache L4. Mais dans les faits, la donnée peut être copiée dans le cache L3/L2, voire L1 du processeur local. Maintenant, imaginons que le processeur local modifie cette donnée distante. Les protocoles de cohérence des caches par espionnage de bus propagent un signal d'invalidation jusque dans le cache L4. Il faut ensuite propager le signal d'invalidation aux autres ordinateurs qui manipulent cette donnée. Pour cela, le répertoire est consulté pour récupérer la liste des processeurs qui ont cette donnée dans leur cache. Le signal d'invalidation est ensuite transmis par le réseau d'interconnexion, et arrive aux destinataires, qui invalident la donnée dans leurs caches. [[File:Cc-NUMA Local Memory Read.svg|centre|vignette|upright=2|Architecture Ccc-NUMA, invalidation dans une mémoire distante.]] ===L'usage de répertoire sur les architectures multiprocesseurs et multicœurs=== L'espionnage de bus est simple à implémenter. Mais il a un défaut assez flagrant : les signaux d'invalidation et les requêtes de mise à jour passent par le bus partagé, idem pour les réponses à des signaux/requêtes. Le trafic sur le bus partagé est donc augmenté, assez fortement. Et au-delà de quelques processeurs, le trafic est trop important. L'usage d'état ''Owned'' et ''Exclusive'' améliore la situation, mais pas de quoi faire des miracles. Le problème de l'espionnage de bus est que les signaux et requêtes sont envoyés à tout le monde, grâce à l'usage d'un bus partagé. Et un bus partagé est une forme assez rudimentaire d'interconnexion, qui devient inefficace dès que le nombre de composants à connecter dessus est trop important. De nos jours, les processeurs multicœurs récents remplacent partiellement le bus partagé par un '''réseau d'interconnexion intra-processeur''' plus complexe qu'un simple bus. De même, les cartes mères multi-processeurs incorporent un '''réseau d'interconnexion inter-processeur''', placé sur la carte mère, pour connecter les processeurs, la mémoire et les autres entrées-sorties. Le tout est illustré ci-dessous et vous remarquerez que le tout ressemble un peu à une architecture NUMA mais sans mémoire RAM, la RAM étant accédée via le réseau d'interconnexion comme l'est le GPU ou un cœur/processeur. Mais cela ne fait pas grande différence, car l'essentiel est que les mémoires caches soient là, de même que le réseau d'interconnexion. Les systèmes multicœurs/multiprocesseurs utilisent l'espionnage du bus à l'intérieur d'un cœur/processeur, mais utilisent la cohérence basée sur un répertoire entre les processeurs/cœurs. [[File:Cohérence des caches avec un répertoire centralisé.png|centre|vignette|upright=2|Cohérence des caches avec un répertoire sur une architecture multicœurs.]] Dans ce qui suit, le réseau d'interconnexions entre processeurs/cœurs sera volontairement laissé vague, car il peut être absolument n'importe quoi : un bus partagé, un réseau en anneau, un réseau ''crossbar'', etc. Par contre, il doit donner l'illusion que chaque cache est connecté à tous les autres via un ensemble de liaisons point-à-point. Il n'y a pas une transmission à la fois, plusieurs transmissions entre processeurs/cœurs peuvent avoir lieu en même temps. Les signaux d'invalidation sont envoyés uniquement aux processeurs/cœurs qui ont une copie de la donnée, pas à tous. Idem pour les requêtes de mise à jour, envoyées seulement au cache qui a une copie valide de la donnée. De fait, les transmissions pour la cohérence peuvent se faire en même temps que d'autres lectures/écritures normales, ce qui fait meilleur usage du débit mémoire. Prenons comme exemple la situation du schéma précédent, où chaque cœur dispose d'un seul cache dédié, et voyons comment est gérée la cohérence des caches sur un tel processeur. Tout écriture dans le cache dédié entraine l'émission d'un signal d'invalidation pour préciser que la ligne de cache a été modifiée. L'envoi du signal d'invalidation est cependant géré par le répertoire, qui décide quels cœurs prévenir. Le répertoire configure alors le réseau d'interconnexion pour connecter entre eux les caches qui doivent l'être, pour propager les signaux d'invalidation et les requêtes de mise à jour. Les autres caches sont laissés libres et sont disponibles pour des lectures et écritures. On économise alors du débit binaire, au prix d'une perte en temps d'accès liée à l'interrogation du répertoire. Prenons ensuite le cas d'une lecture dans un cache dédié, illustré ci-dessous. Si un défaut de cache a lieu, alors la ligne de cache n'est pas disponible dans le cache dédié. Elle doit alors être rappatriée depuis la mémoire RAM dans le pire des cas, ou depuis un autre cache. Pour savoir dans quel cas il est, le cœur interroge le répertoire. Il sait si la ligne mémoire est cachée ou non, et dans quel cache elle se trouve si elle l'est. Le répertoire démarre alors une requête de lecture au cache adéquat, via une transaction réseau. Le cache adéquat répond à la transaction par une autre transaction réseau, à destination du cœur qui a déclenché le défaut de cache. Là encore, les trois requêtes sont envoyées uniquement aux cœurs/caches qui en ont besoin. [[File:Directory Scheme.png|centre|vignette|upright=2.5|Cohérence des caches avec un répertoire centralisé.]] ===Le contenu du répertoire : les implémentations à base de RAM et de caches=== Avant de poursuivre, un point de terminologie. Imaginez que la mémoire est découpée en blocs qui font la même taille qu'une ligne de cache, et qui sont alignés sur cette taille. Un bloc peut être copié dans le cache, éventuellement écrit par le processeur, et rapatrié en mémoire RAM une fois évincé du cache. Le bloc de mémoire sera appelé dans ce qui suit une '''ligne mémoire''', par analogie avec une ligne de cache. Un répertoire mémorise, pour chaque ligne mémoire, la liste des processeurs dont le cache qui en a une copie. Il peut aussi mémoriser l'état de la ligne de cache associée, mais ce n'est pas obligatoire, l'état peut être stocké dans la ligne de cache elle-même. ====Les répertoires basés sur une mémoire RAM==== L'implémentation la plus simple mémorise, pour chaque ligne mémoire, quel processeur l'a copié dans son cache. Pour cela, elle utilise un '''bit de présence''' par processeur, qui indique si le cache du processeur a une copie de la ligne mémoire : le énième bit de présence indique si le énième processeur a la ligne mémoire dans son cache. Elle a pour défaut de rapidement faire grossir le répertoire, dont la taille est proportionnelle au nombre de processeurs et de ligne mémoire. [[File:Full bit vector format diagram.jpg|centre|vignette|upright=2|Full bit vector format diagram]] Une autre solution mémorise la liste des processeurs autrement. Au lieu d'utiliser un bit par processeur, elle mémorise une '''liste de pointeurs''' vers ces processeurs. Elle attribue un numéro à chaque processeur et mémorise une liste de plusieurs numéros. L'avantage est que les numéros sont assez courts. Au lieu d'utiliser N bits pour N processeurs, chaque numéro ne fait que <math>\log_2{N}</math>. On gagne en mémoire si on autorise C copies, et que <math>C \times \log_2{N} \leq N</math>. Un exemple sera sans doute plus parlant. Prenons 256 processeurs. Un répertoire complet demandera 256 bits. Une liste de pointeurs encodera un numéro de processeur sur 8 bits, on est gagnant tant qu'on a moins de 256/8 = 32 processeurs par ligne de cache. Par contre, la technique n'autorise qu'un nombre maximal de numéros par ligne mémoire. Si ce nombre est dépassé, le répertoire doit gérer la situation. Et il y a plusieurs solutions possibles pour cela. La première n'autorise réellement que N copies d'une même ligne de cache et invalide les copies en trop si le nombre est dépassé. Le cout en performance est cependant élevé. Les deux autres solutions autorisent à dépasser le nombre maximal de numéros. La première se débrouille en repassant en mode ''broadcast'' une fois le nombre de numéro maximal dépassé. Le répertoire envoie alors toute invalidation de la ligne mémoire concernée à tous les processeurs, vu que le répertoire n'a pas les moyens de savoir qui a une copie valide ou non. Une autre solution déclenche une exception matérielle qui gère la situation en logiciel. {|class="wikitable" |+ Répertoire complet et à liste de pointeur |- ! ! Adresse ! État ! Liste des processeurs |- ! Représentation complète | rowspan="2" | 0xFFF1244 | rowspan="2" | ''Shared'' | 0001 1000 0001 1100 |- ! Liste de pointeurs | 3, 4, 5 12, 13 |} Les deux méthodes précédentes posent problème quand le nombre de processeur est élevé. Aussi, quelques optimisations permettent de limiter la casse. La première consiste à ne pas encoder toutes les informations nécessaires. Une idée possible est par exemple de regrouper les caches/processeurs par groupes de 2/3/4. Le répertoire mémorise alors quel groupe de cache/processeur contient une copie de la donnée, mais pas exactement quel cache dans ce groupe. Par exemple, avec des groupes de 2, il se peut qu'un processeur du groupe ait une copie de donnée, ou les deux, le répertoire ne fait pas la différence. Si la donnée est invalidée, il envoie des signaux d'invalidation aux deux processeurs du groupe. [[File:Coarse bit vector format diagram.jpg|centre|vignette|upright=2|Coarse bit vector format diagram]] Les répertoires vus plus haut sont basés sur une mémoire RAM. Elle contiennent une adresse par le ligne mémoire, l'adresse contient l'état de la ligne de cache et la liste des processeurs. La consultation du répertoire demande juste d'adresser le répertoire avec l'adresse de la ligne mémoire, ce qui peut être fait avant ou en parallèle de l'accès au cache. Mais le problème est que le répertoire est alors une mémoire très grosse. Elle est d'autant plus grosse qu'il y a de lignes mémoires et elle devient rapidement impraticable dès que la mémoire est un peu grosse. ====Les répertoires basés sur une mémoire cache==== Le répertoire est donc une structure assez grosse, ce qui est un problème. En pratique, les répertoires précédents sont tellement gros qu'on ne peut pas leur dédier une mémoire RAM. des tables qui sont mémorisées en mémoire RAM. Quelques processeurs ont réussi à le faire, notamment les premiers SGI Origin, qui avaient une banque de mémoire dédiée au répertoire. Mais la majeure partie des implémentations devaient placer le répertoire dans la mémoire RAM principale de l'ordinateur, un peu au même titre que la table des pages. Mais quoi bon avoir des caches si leur accès demande de consulter un répertoire en mémoire RAM ? Et pourtant, nous avons déjà vu une situation similaire. Il est possible de faire une analogie avec la table des pages, encore que celle-ci soit grandement limitée. La table des pages est là aussi une structure très grosse, censée être consultée à chaque accès mémoire, qui mémorise des informations pour chaque page mémoire. Le répertoire est une structure similaire : remplacez ligne mémoire par page mémoire et vous aurez l'idée. Et vous vous souvenez certainement de la solution utilisée, à savoir l'usage de caches de traduction d'adresse, les fameuses TLBs. Les caches en question sont appelés des '''caches de répertoire'''. Ils ont plusieurs entrées, mais moins qu'il n'y a de lignes mémoire. Une entrée peut être vide ou occupée. Une entrée occupée mémorise de quoi gérer la cohérence pour une ligne mémoire. Elle mémorise l'adresse de la ligne mémoire, l'état de la ligne et la liste des processeurs. Le cache de répertoire mémorise une partie du répertoire, celle en cours d'utilisation. L'implémentation la plus simple conserve un répertoire en mémoire RAM, complété par un cache de répertoire par processeur. Les caches de répertoire sont consultés à chaque écriture, ce qui n'est pas un problème vu qu'ils sont très petits et ont un temps d'accès minuscule. Il y a plusieurs caches de répertoire, avec plusieurs niveaux de cache. Typiquement, il y a un cache de répertoire L1 associé au cache L1 de données, un cache de répertoire L2 pour le cache de données L2, etc. Il faut cependant remarquer que le répertoire est une structure dont la majorité des entrées sont vides. En effet, les seules entrées occupées correspondent aux lignes mémoires présentes dans le cache du processeur. Il n'y a pas besoin de mémoriser autant d'entrées qu'il y a de lignes mémoires, seulement une entrée par ligne de cache. Cette simplification donne un répertoire très petit, dans lequel on a éliminé les entrées vides. Il s'agit d'une optimisation évident à laquelle vous aviez peut-être déjà pensé. Le tout est nommé avec le nom de ''inclusive directory cache'', que nous traduirons par '''cache de répertoire inclusif'''. Il existe deux implémentations possibles de ce cache de répertoire inclusif. La première place le répertoire dans un cache dédié, séparé des autres caches, associé au contrôleur mémoire. Le fonctionnement est alors le suivant. Pour toutes les lignes mémoires dans le cache, le cache de répertoire possède une entrée associée, qui mémorise une copie ''tag'' de la ligne de cache et la liste des processeurs. Le ''tag'' en question n'est autre que le ''tag'' utilisé dans le cache L1 (si on suppose que le L2 est partagé). Si jamais la ligne mémoire n'est pas trouvée dans ce cache, alors on suppose qu'elle est en état ''Invalid'', ou qu'elle n'a pas été chargée depuis la mémoire. Les actions correctives sont les mêmes dans les deux cas. Un défaut est que lorsqu'une ligne de cache est évincée du cache L1, le répertoire doit être prévenu, ce qui ajoute de la complexité. En théorie, le cache devrait être un cache associatif par voie, avec un grand nombre de voies pour gérer des accès simultannés. Une autre implémentation utilise des caches L1/L2 inclusifs. Ainsi, le répertoire a juste à mémoriser les lignes mémoires dans le cache partagé L2/L3. Mieux : il a juste à mémoriser la liste des processeurs dans la ligne de cache elle-même ! L'implémentation précédente recopiait les ''tag'' dans le répertoire, ce qui les dupliquait. Mais on n'avait pas le choix, car il fallait regrouper les ''tags'' des différents L1 dans un répertoire unique, on ne pouvait pas avoir un répertoire dispersé dans plusieurs caches L1. Mais avec des caches inclusifs, faire pareil avec les lignes de cache du L3 serait de la duplication inutile. Alors on fusionne le cache partagé L2/L3 avec le cache de répertoire. La difficulté est alors de maintenir des caches inclusifs, ce qui est plus compliqué que prévu. Une autre solution consiste à mémoriser la liste des copies dans les caches eux-mêmes. Le répertoire n'identifie, pour chaque ligne de cache, qu'un seul processeur : plus précisément, il identifie la ligne de cache du processeur qui contient la copie. À l'intérieur d'une ligne de cache, la copie suivante (si elle existe) est indiquée dans les bits de contrôle. On parle de répertoires à base de caches. [[File:Répertoire à base de caches.jpg|centre|vignette|upright=2|Répertoire à base de caches]] ==Les avantages et inconvénients des deux méthodes== L'avantage de l'espionnage du bus est qu'il utilise peu de circuits et qu'il est facile à implémenter, car il réutilise un bus partagé qui est déjà là. Par contre, son désavantage majeur est que les écritures dans un cache sont propagées sur le bus partagé, au moins partiellement. Soit les écritures sont réellement propagées sur le bus partagée, soit un message d'invalidation est envoyé sur le bus partagé, peu importe : un message est envoyé aux autres caches pour dire qu'une écriture a eu lieu et qu'il faut potentiellement invalider des données. Le débit binaire du bus partagé est donc partiellement grignoté par les communications entre caches. Et le désavantage est d'autant plus grand qu'il y a de coeurs/processeurs, qui se partagent le bus partagé. L'usage d'un répertoire résout ces problèmes. Le débit binaire du bus partagé n'est pas grignoté, car la liaison entre caches et répertoires est séparée. Par contre, le temps d'accès au cache est augmenté, car tout accès mémoire demande l'autorisation au répertoire. En soi, le problème est compensé par l'économie en débit binaire. Sur les architectures avec beaucoup de processeurs, le gain en débit binaire sur-compense la hausse du temps d'accès. Mais sur les architectures avec peu de cœurs, c'est l'inverse. En général, les architectures distribuées/NUMA utilisent des répertoires, alors que les architectures à mémoire partagée utilisent l'espionnage du bus. Le tout est résumé ci-dessous. {|class="wikitable" style="text-align:center;" |- ! ! Mémoire partagée ! Architectures NUMA ! Architecture distribuée |- ! Invalidation du cache | colspan="3" | Caches d'instruction et TLB |- ! Espionnage du bus | X | | |- ! Répertoire de cohérence | X | X | X |} Remarquez que l'espionnage du bus n'a de sens que sur les architectures à mémoire partagée, alors que l'usage de répertoire est plus générale. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les architectures à parallélisme de données | next=Les sections critiques et le modèle mémoire }} </noinclude> o9tx4bdqjg1ul8idl22es5lcrym5fj5 Fonctionnement d'un ordinateur/Architectures multiprocesseurs et multicœurs 0 65962 764907 763973 2026-04-24T19:13:52Z Mewtow 31375 /* Le bus partagé entre plusieurs cœurs */ 764907 wikitext text/x-wiki Pour réellement tirer parti du parallélisme de taches, rien ne vaut l'utilisation de plusieurs processeurs et/ou de plusieurs cœurs, qui exécutent chacun un ou plusieurs programmes dans leur coin. Des solutions multiprocesseurs ont alors vu le jour pour rendre l'usage de plusieurs processeurs plus adéquat. Avant de poursuivre, nous allons voir les systèmes multiprocesseur à part des processeurs multicœurs. Il faut dire qu'utiliser plusieurs processeurs et avoir plusieurs cœurs sur la même puce, ce n'est pas la même chose. Particulièrement pour ce qui est de la mémoire cache. Les '''systèmes multiprocesseur''' placent plusieurs processeurs sur la même carte mère. Ils sont courants dans les serveurs ou les ''data centers'', mais sont beaucoup plus rares pour les ordinateurs grand public. Il y a eu quelques systèmes multiprocesseur vendus au grand public dans les années 2000, certaines cartes mères avaient deux sockets pour mettre deux processeurs. Mais les logiciels et les systèmes d'exploitation grand public n'étaient pas adaptés pour, ce qui fait que la technologie est restée confidentielle. Puis, en 2005, les '''processeurs multicœurs''' sont arrivés. Ils peuvent être vus comme un regroupement de plusieurs processeurs dans le même circuit intégré. Pour être plus précis, ils contiennent plusieurs ''cœurs'', chaque cœur pouvant exécuter un programme tout seul. Un cœur dispose de toute la machinerie électronique pour exécuter un programme, que ce soit un séquenceur d'instruction, des registres, une unité de calcul. Par contre, certains circuits du processeur sont partagés entre les cœurs, comme les circuits d’interfaçage avec la mémoire. Les processeurs multicœurs sont devenus la norme dans les ordinateurs grand public et les logiciels et systèmes d'exploitation se sont adaptés. Suivant le nombre de cœurs présents dans notre processeur, celui-ci sera appelé un processeur double-cœur (deux cœurs), quadruple-cœur (4 cœurs), octuple-cœur (8 cœurs), etc. Les processeurs grand public ont généralement entre 8 et 16 cœurs, à l'heure où j'écris ces lignes (2025), rarement au-delà. Par contre, les processeurs pour serveurs dépassent la vingtaine de cœurs. Les serveurs utilisent souvent des architectures dites '''''many core''''', qui ont un très grand nombre de cœurs, plus d'une cinquantaine, voire plusieurs centaines ou milliers. : Dans ce qui suit, nous utiliserons les termes "processeurs" et "cœurs" comme s'ils étaient synonymes. Tout ce qui vaut pour les systèmes multiprocesseur vaut aussi pour les systèmes multicœurs. ==Le partage des caches== Quand on conçoit un processeur multicœur, il ne faut pas oublier ce qui arrive à la pièce maîtresse de tout processeur actuel : le cache ! Pour le moment nous allons oublier le fait que les processeurs ont une hiérarchie de caches, avec des caches L1, L2, L3 et autres. Nous allons partir du principe qu'un processeur simple cœur a un seul cache, et voir comment adapter le cache à la présence de plusieurs cœurs. Nous allons rapidement lever cette hypothèse, pour étudier le cas où un processeur multicœur a une hiérarchie de caches, mais seulement après avoir vu le cas le plus simple à un seul cache. ===Le partage des caches sans hiérarchie de caches : caches dédiés et partagés=== Avec un seul niveau de cache, sans hiérarchie, deux solutions sont possibles. La première consiste à garder un seul cache, et de le partager entre les cœurs. L'autre solution est de dupliquer le cache et d'utiliser un cache par cœur. Les deux solutions sont appelées différemment. On parle de '''caches dédiés''' si chaque cœur possède son propre cache, et de '''cache partagé''' avec un cache partagé entre tous les cœurs. Ces deux méthodes ont des inconvénients et des avantages. {| |[[File:Caches dédiés.png|vignette|Caches dédiés]] |[[File:Caches partagés.png|vignette|Cache partagé]] |} Le premier point sur lequel comparer caches dédiés et partagés est celui de la capacité du cache. La quantité de mémoire cache que l'on peut placer dans un processeur est limitée, car le cache prend beaucoup de place, près de la moitié des circuits du processeur. Aussi, un processeur incorpore une certaine quantité de mémoire cache, qu'il faut répartir entre un ou plusieurs caches. Les caches dédiés et partagés ne donnent pas le même résultat. D'un côté, le cache partagé fait que toute la mémoire cache est dédiée au cache partagé, qui est très gros. De l'autre, on doit répartir la capacité du cache entre plusieurs caches séparés, individuellement plus petits. En conséquence, on a le choix entre un petit cache pour chaque processeur ou un gros cache partagé. Le choix entre les deux n'est pas simple, mais doit tenir compte du fait que les programmes exécutés sur les cœurs n'ont pas les mêmes besoins. Certains programmes sont plus gourmands et demandent beaucoup de cache, alors que d'autres utilisent peu la mémoire cache. Avec un cache dédié, tous les programmes ont accès à la même quantité de cache, car les caches des différents cœurs sont de la même taille. Les caches dédiés étant assez petits, les programmes plus gourmands devront se débrouiller avec un petit cache, alors que les autres programmes auront du cache en trop. À l'opposé, un cache partagé répartit le cache de manière optimale : un programme gourmand peut utiliser autant de cache qu'il veut, laissant juste ce qu'il faut aux programmes moins gourmands. le cache peut être répartit plus facilement selon les besoins des différents programmes. [[File:Cache partagé contre cache dédié.png|centre|vignette|upright=2.5|Cache partagé contre cache dédié]] Un autre avantage des caches partagés est quand plusieurs cœurs accèdent aux même données. C'est un cas très courant, souvent lié à l'usage de mémoire partagé ou de ''threads''. Avec des caches dédiés, chaque cœur a une copie des données partagées. Mais avec un cache partagé, il n'y a qu'une seule copie de chaque donnée, ce qui utilise moins de mémoire cache. Imaginons que l'on sait 8 caches dédiés de 8 Kibioctets, soit 64 kibioctets au total, comparé à un cache partagé de même capacité totale. Les doublons dans les caches dédiés réduiront la capacité mémoire utile, effective, comparé à un cache partagé. S'il y a 1 Kibioctet de mémoire partagé, 8 kibioctets seront utilisés pour stocker ces données en doublons, seulement 1 kibioctet sur un cache partagé. Ajoutons aussi que la cohérence des caches est grandement simplifiée avec l'usage d'un cache partagé, vu que les données ne sont pas dupliquées dans plusieurs caches. Mais le partage du cache peut se transformer en inconvénient si les programmes entrent en compétition pour le cache, que ce soit pour y placer des données ou pour les accès mémoire. Deux programmes peuvent vouloir accéder au cache en même temps, voire carrément se marcher sur les pieds. La résolution des conflits d'accès au cache est résolu soit en prenant un cache multiport, avec un port dédié par cœur, soit par des mécanismes d'arbitrages avec des circuits dédiés. Le revers de la médaille tient au temps de latence. Plus un cache est gros, plus il est lent. En conséquence, des caches dédiés seront plus rapides qu'un gros cache partagé plus lent. ===Le partage des caches adapté à une hiérarchie de caches=== Dans la réalité, un processeur multicœur ne contient pas qu'un seul cache, mais une hiérarchie de caches avec des caches L1, L2 et L3, parfois L4. Dans cette hiérarchie, certains caches sont partagés entre plusieurs cœurs, les autres sont dédiés. Le cache L1 n'est jamais partagé, car il doit avoir un temps d'accès très faible. Pour les autres caches, tout dépend du processeur. [[File:Dual Core Generic.svg|vignette|Cache L2 partagé.]] Les premiers processeurs multicœurs commerciaux utilisaient deux niveaux de cache : des caches L1 dédiés et un cache L2 partagé. Le cache L2 partagé était relié aux caches L1, grâce à un système assez complexe d'interconnexions. Le cache de niveau L2 était souvent simple port, car les caches L1 se chargent de filtrer les accès aux caches de niveau inférieurs. Les processeurs multicœurs modernes ont des caches L3 et même L4, de grande capacité, ce qui a modifié le partage des caches. Le cache de dernier niveau, à savoir le cache le plus proche de la mémoire, est systématiquement partagé, car son rôle est d'être un cache lent mais gros. Il s'agit le plus souvent d'un cache de L3, plus rarement L4. Sur certains processeurs multicœurs, le cache de dernier niveau n'est techniquement pas dans le cœur, mais fait partie d'un ensemble de circuits reliés, comme le contrôleur mémoire ou l'interface mémoire. Il fonctionne à une fréquence différente du processeur, n'a pas la même tension d'alimentation, etc. Le cas du cache L2 dépend des architectures : il est partagé sur certains processeurs, dédié sur d'autres. Mais sur les processeurs modernes, c'est un cache dédié soit par cœur, soit pour un groupe de cœurs. Dans le cas le plus courant, chaque cache L2 est partagé entre plusieurs cœurs mais pas à tous. En effet, on peut limiter le partage du cache à quelques cœurs particuliers pour des raisons de performances. [[File:Partage des caches sur un processeur multicoeurs.png|centre|vignette|upright=2.0|Partage des caches sur un processeur multicœur.]] D'autres processeurs ont des caches L2 dédiés. Il s'agit surtout des processeurs multicœurs anciens, parmi les premières générations de processeurs multicœurs. Un exemple est celui de la microarchitecture Nehalem d'Intel. Il avait des caches L1 et L2 dédiés, mais un cache L3 partagé. [[File:Nehalem EP.png|centre|vignette|upright=2.0|Partage des caches sur un processeur Intel d'architecture Nehalem.]] ===Les caches partagés centralisés et distribués=== Un point important est que quand on parle de cache partagé ou de cache dédié, on ne parle que de la manière dont les cœurs peuvent accéder au cache, pas de la manière dont le caches est réellement localisé sur la puce. En théorie, qui dit plusieurs caches dédiés signifie que l'on a vraiment plusieurs caches séparés sur la puce. Et chaque cache dédié est proche du cœur qui lui est attribué. Et pour les caches partagés unique, une portion de la puce de silicium contient le cache, que cette portion est un énorme bloc de transistors. Il est généralement placé au milieu de la puce ou sur un côté, histoire de facilement le connecter à tous les cœurs. Mais pour les caches séparés, ce n'est pas toujours le cas. Avoir un cache énorme poserait des problèmes sur les architectures avec beaucoup de cœurs. En réalité, le cache est souvent découpé en plusieurs banques, reliées à un contrôleur du cache par un système d'interconnexion assez complexe. Les banques sont physiquement séparées, et il arrive qu'elles soient placées proche d'un cœur chacune. L'organisation des banques ressemble beaucoup à l'organisation des caches dédiés, avec une banque étant l'équivalent d'un cache dédié. La différence est que les cœurs peuvent lire et écrire dans toutes les banques, grâce au système d'interconnexion et au contrôleur de cache. Tel était le cas sur les processeurs AMD Jaguar. Ils avaient un cache L2 de 2 mébioctets, partagés entre tous les cœurs, qui était composé de 4 banques de 512 Kibioctets. Les quatre banques du cache étaient reliées aux 4 cœurs par un réseaux d'interconnexion assez complexe. [[File:AMDJaguarModule.png|centre|vignette|upright=2|AMD Jaguar Module]] La différence entre les deux solutions pour les caches partagés porte le nom de cache centralisés versus distribués. Un gros cache unique sur la puce est un '''cache centralisé''', et c'est généralement un cache partagé. Mais un cache composé de plusieurs banques dispersées sur la puce est un '''cache distribué''', qui peut être aussi bien dédié que partagé. ===Les caches virtualisés=== Il faut noter que quelques processeurs utilisent cette technique pour fusionnent le cache L2 et le cache L3. Par exemple, les processeurs IBM Telum utilisent des caches L3 virtualisés, dans leurs versions récentes. Le processeur Telum 2 contient 10 caches L2 de 36 mébioctets chacun, soit 360 mébioctets de cache. L'idée est que ces 360 mébioctets sont partagés à la demande entre cache L2 dédié et cache L3. On parle alors de '''cache virtualisé'''. Un cache de 36 mébioctet est associé à un cœur, auquel il est directement relié. Les cœurs n'utilisent pas tous leur cache dédié à 100% Il arrive que des cœurs aient des caches partiellement vides, alors que d'autres on un cache qui déborde. L'idée est que si un cœur a un cache plein, les données évincées du cache L2 privé sont déplacées dans le cache L2 d'un autre cœur, qui lui est partiellement vide. Le cache L2 en question est alors partitionné en deux : une portion pour les données associée à son cœur, une portion pour les données des L2 des autres cœurs. Pour que la technique fonctionne, le processeur mesure le remplissage de chaque cache L2. De plus, il faut gérer la politique de remplacement des lignes de cache. Une ligne de cache évincée du cache doit être déplacé dans un autre L2, pas dans les niveaux de cache inférieur, ni dans la mémoire. Du moins, tant qu'il reste de la place dans le cache L3. De plus, une lecture/écriture dans le cache L3 demande de localiser le cache L2 contenant la donnée. Pour cela, les caches L2 sont tous consultés lors d'un accès au L3, c'est la solution la plus simple, elle marche très bien si le taux de défaut du cache L2 est faible. Une telle optimisation ressemble beaucoup à un cache L2/L3 distribué, mais il y a quelques différences qui sont décrites dans le paragraphe précédent. Avec un L2 distribué, tout accès au L2 déclencherait une consultation de toutes les banques du L2. Avec un cache L3 virtualisé, ce n'est pas le cas. Le cache L2 associé au cœur est consulté, et c'est seulement en cas de défaut de cache que les autres caches L2 sont consultés. De plus, avec un cache L2 distribué, il n'y a pas de déplacement d'une ligne de cache entre deux banques, entre deux caches L2 physiques. Alors qu'avec un cache L3 virtualisé, c'est le cas en cas de remplacement d'une ligne de cache dans le cache L2. Sur le processeur Telum 1, le partage du cache L2 est assez simple. Un cache L2 fait 32 mébioctets et est découpé en deux banques de 16 mébioctets. En temps normal, les premiers 16 mébioctets sont toujours associé au cache L2, au cœur associé. Les 16 mébioctets restants peuvent soit être attribués au cache L3, soit fusionnés avec les 16 premiers mébioctets. Dans le cas où le cœur associé est en veille, n'est absolument pas utilisé, les 32 mébioctets sont attribués au cache L3. Un partage assez simple, donc. Le partage du cache L2/L3 sur les processeurs Telum 2 n'est pas connu, il est supposé être plus flexible. ==Le réseau d'interconnexion entre cœurs== Les systèmes avec plusieurs processeurs incorporent un réseau d'interconnexion pour connecter les processeurs entre eux, ainsi qu'à la mémoire RAM. Il s'agit d'un '''réseau d'interconnexion inter-processeur''', placé sur la carte mère. Les CPU multicœurs ont aussi un tel réseau d'interconnexion, pour relier les cœurs entre eux. La différence est que le réseau d'interconnexion est placé dans le processeur, pas sur la carte mère. Les systèmes multi-cœurs modernes utilisent des réseaux d'interconnexion standardisés, les standards les plus communs étant l'HyperTransport, l'Intel QuickPath Interconnect, l'IBM Elastic Interface, le Intel Ultra Path Interconnect, l'Infinity Fabric, etc. Ils sont aussi utilisés pour faire communiquer entre eux plusieurs processeurs. [[File:Architecture multicoeurs et réseau sur puce.png|centre|vignette|upright=1.5|Architecture multicoeurs et réseau sur puce]] ===Le bus partagé entre plusieurs cœurs=== Pour un faible nombre de coeurs/processeurs, la solution utilisée relie les processeurs entre eux grâce au bus mémoire. Le bus mémoire est donc un '''bus partagé''', avec tout ce que cela implique. [[File:Architecture multicoeurs à bus partagé.png|centre|vignette|upright=2|Architecture multiprocesseurs à bus partagé]] Pour les systèmes multicœurs, l'usage d'un bus partagé doit être adaptée pour tenir compte des caches partagés. Voyons d'abord le cas d'un CPU avec deux niveaux de cache, dont un cache L2 est partagé entre tous les cœurs. Les caches L1 sont reliés au cache L2 partagé par un bus, qui n'a souvent pas de nom. Nous désignerons le bus entre le cache L1 et le cache L2 : '''bus partagé''', sous-entendu partagé entre tous les caches. C'est lui qui sert à connecter les cœurs entre eux. [[File:Architecture multicoeurs à bus partagé entre caches L1 et L2.png|centre|vignette|upright=2|Architecture multicoeurs à bus partagé entre caches L1 et L2]] Un processeur multicœur typique a une architecture avec trois niveaux de cache (L1, L2 et L3), avec un niveau L1 dédié par cœur, un niveau L2 partiellement partagé et un L3 totalement partagé. Le bus partagé est alors difficile à décrire, mais il correspond à l'ensemble des bus qui connectent les caches L1 aux caches L2, et les caches L2 au cache L3. Il s'agit alors d'un ensemble de bus, plus que d'un bus partagé unique. L'usage d'un bus partagé a cependant de nombreux défauts. Par exemple, les processeurs doivent se répartir l'accès au bus mémoire, il faut gérer le cas où deux processeurs accèdent au bus en même temps, etc. Pour cela, un composant dédié s'occupe de l'arbitrage entre processeurs. Il est généralement placé sur la carte mère de l'ordinateur, dans le ''chipset'', dans le pont nord, ou un endroit proche. Les processeurs doivent être conçus pour communiquer avec ce circuit d'arbitrage, ou du moins avoir un support minimal pour le multiprocesseur. [[File:Intel486 System Arbitration.png|centre|vignette|upright=2|Système avec deux Intel486 - Arbitrage du bus mémoire.]] D'autres défauts très importants seront abordés en détail dans le chapitre sur la cohérence des caches ===Le réseau d'interconnexion entre plusieurs cœurs=== Relier plusieurs cœurs avec des bus pose de nombreux problèmes techniques qui sont d'autant plus problématiques que le nombre de cœurs augmente. Le câblage est notamment très complexe, les contraintes électriques pour la transmission des signaux sont beaucoup plus fortes, les problèmes d'arbitrages se font plus fréquents, etc. Pour régler ces problèmes, les processeurs multicoeurs n'utilisent pas de bus partagé, mais un réseau d'interconnexion plus complexe. Un exemple est le réseau du processeur Celle, utilisé sur la PS3. Les transferts sur ce bus se font par paquets de 128 bits. Le réseau était composé de 12 intermédiaires appelés ''Ramps''. Chaque intermédiaire communiquait avec deux autres ''ramps'' ce qui formait un anneau de ''ramps''. Les paquets de 128 bits circulaient sur cet anneau en passant d'un ''ramp'' au suivant, soit dans le sens horaires, soit dans le sens anti-horaire. Avant d'entrer dans l'anneau, les processeurs envoient une requête à un circuit d'arbitrage, qui commande les transferts de données sur l'anneau. Si celui-ci accepte la requête, la donnée est envoyée au ''ramp'' et circule dans l'anneau. Il faut noter que le contrôleur mémoire a la priorité sur tout le reste. Le sens de transfert, horaire ou anti-horaire, est choisit de manière à prendre le chemin le plus court. Les paquets passent alors de ''ramp'' en ''ramp''. Chaque ''ramp'' reçoit le paquet, regarde l'adresse de destination du paquet, et décide de la suite. Soit le paquet lui est destiné, il le traite. Sinon, le il transmet au ''ramp'' suivant. Le bus permet de transférer 4 paquets de 128 bits par cycle. Pour cela, les ''ramps'' avaient quatre bus, chacun de 128 bits : deux bus pour le sens horaire, et deux autres bus pour le sens anti-horaire. Il peut y avoir 3 transferts simultanés, tant que les paquets ne se recouvrent pas, mais les transferts sont de taille arbitraire. Le réseau d'interconnexion avait une fréquence de 1,6 GHz. Si vous faites les calculs, vous tomberez cependant sur un débit binaire théorique d'environ 300 gibioctets par secondes, qui n'est cependant jamais atteint en pratique, pour des raisons techniques liées à la cohérence des caches. La limite théorique est en pratique plus proche des 200 gibioctets par secondes, en tenant compte de ces limitations théoriques. [[File:Réseau d'interconnexion du processeur CELL.png|centre|vignette|upright=2|Réseau d'interconnexion du processeur CELL]] Un autre xemple de réseau d'interconnexion est celui des architectures AMD EPYC, de microarchitecture Zen 1. Elles utilisaient des chiplets, à savoir que le processeur était composé de plusieurs puces interconnectées entre elles. Chaque puce contenait un processeur multicoeurs intégrant un cache L3, avec un réseau d'interconnexion interne au processeur sans doute basé sur un ensemble de bus. De plus, les puces étaient reliées à une puce d'interconnexion qui servait à la fois d'interface entre les processeurs, mais aussi d'interface avec la R1AM, le bus PCI-Express, etc. La puce d'interconnexion était gravée en 14 nm contre 7nm pour les chiplets des cœurs. {| |[[File:AMD Epyc 7702 delidded.jpg|centre|vignette|upright=2|AMD Epyc 7702.]] |[[File:AMD Epyc Rome Aufbau.png|centre|vignette|upright=2|Schéma fonctionnel de l'AMD Epyc.]] |} Le réseau d'interconnexion peut être très complexe, avec des connexions réseau, des commutateurs, et des protocoles d'échanges entre processeurs assez complexes basés sur du passage de messages. De telles puces utilisent un '''réseau sur puce''' (''network on chip''). Mais d'autres simplifient le réseau d'interconnexion, qui se résume à un réseau ''crossbar'', voire à des mémoires FIFO pour faire l'interface entre les cœurs. Le problème principal des réseaux sur puce est que les mémoires FIFOs sont difficiles à implémenter sur une puce de silicium. Elles prennent beaucoup de place, utilisent beaucoup de portes logiques, consomment beaucoup d'énergie, sont difficiles à concevoir pour diverses raisons (les accès concurrents/simultanés sont fréquents et font mauvais ménage avec les ''timings'' serrés de quelques cycles d'horloges requis). Il est donc impossible de placer beaucoup de mémoires FIFO dans un processeur, ce qui fait que les commutateur sont réduits à leur strict minimum : un réseau d'interconnexion, un système d'arbitrage simple parfois sans aucune FIFO, guère plus. ===Les architectures en ''tile''=== Un cas particulier de réseau sur puce est celui des '''architectures en ''tile''''', des architectures avec un grand nombre de cœurs, connectés les unes aux autres par un réseau d'interconnexion "rectangulaire". Chaque cœur est associé à un commutateur (''switch'') qui le connecte au réseau d'interconnexion, l'ensemble formant une ''tile''. [[File:Tile64-Tile.svg|centre|vignette|upright=1.5|''Tile'' de base du Tile64.]] Le réseau est souvent organisé en tableau, chaque ''tile'' étant connectée à plusieurs voisines. Dans le cas le plus fréquent, chaque ''tile'' est connectée à quatre voisines : celle du dessus, celle du dessous, celle de gauche et celle de droite. Précisons que cette architecture n'est pas une architecture distribuée dont tous les processeurs seraient placés sur la même puce de silicium. En effet, la comparaison ne marche pas pour ce qui est de la mémoire : tous les cœurs accèdent à une mémoire partagée située en dehors de la puce de silicium. Le réseau ne connecte pas plusieurs ordinateurs séparés avec chacun leur propre mémoire, mais plusieurs cœurs qui accèdent à une mémoire partagée. Un bon exemple d'architecture en ''tile'' serait les déclinaisons de l'architecture Tilera. Les schémas du-dessous montrent l'architecture du processeur Tile 64. Outre les ''tiles'', qui sont les éléments de calcul de l'architecture, on trouve plusieurs contrôleurs mémoire DDR, divers interfaces réseau, des interfaces série et parallèles, et d'autres entrées-sorties. [[File:Tile64.svg|centre|vignette|upright=2|Architecture Tile64 du Tilera.]] ==Les interruptions inter-processeurs== Les '''interruptions inter-processeurs''' sont des interruptions déclenchées sur un processeur et exécutées sur un autre. Elles sont très utiles pour le système d'exploitation, pour des raisons qu'on ne peut pas expliquer ici. Disons simplement qu'elles permettent de répartir des programmes/''threads'' sur plusieurs processeurs. Un programme/''thread'' est démarré par une interruption, et le système d'exploitation détermine sur quel processeur elle doit être exécutée. L'utilité des interruptions inter-processeur est assez variée. Autrefois, elles servaient aussi pour la cohérence des caches, mais nous détaillerons cela dans un futur chapitre. Une interruption inter-processeurs peut être envoyée soit à un cœur bien précis, soit à n'importe quel cœur, soit à tous les cœurs, voire même revenir à l'envoyeur. Tout dépend de ce que décide le système d'exploitation. Les trois situations ne sont pas identiques, sur un point : comment préciser quel est le processeur de destination ? Si on envoie une interruption à un cœur bien précis, il faut préciser quel est le cœur qui réceptionne l'interruption. Pour cela, il n'y a pas 36 solutions : on numérote les processeurs/cœurs avec un '''numéro de processeur'''. Ce numéro leur est soit attribué au démarrage par le BIOS, soit est gravé dans leur silicium pour les processeurs multicœurs. Pour le reste, les interruptions inter-processeurs sont identiques aux interruptions normales. Elles ont un système de priorités, certaines devant passer avant les autres, là encore défini par des ''Interrupt Request Levels'' (IRQLs) ou quelque chose de similaire. Il peut y avoir des interruptions inter-processeur de type logicielles, à savoir lancées par une instruction machine. Par exemple, sur les IBM System/360 et les ''mainframes'' z/Architecture, le processeur avait une instruction SIGNAL PROCESSOR pour déclencher des interruptions logicielles inter-processeur. Pour générer des interruptions inter-processeur, le contrôleur d'interruption doit pouvoir rediriger des interruptions déclenchées par un processeur vers un autre. Pour expliquer comment, nous allons étudier le cas des CPU x86, mais les implémentations ARM ou autres sont très similaires. L'ancien contrôleur d'interruption 8259A ne gérait pas les interruptions inter-processeurs, ce qui fait que les cartes mères multiprocesseurs devaient incorporer un contrôleur d'interruption spécial en complément. Par contre, son successeur, l'APIC, les gérait nativement. De nos jours, chaque cœur x86 possède son propre contrôleur d’interruption, le '''''local APIC''''', qui gère les interruptions en provenance ou arrivant vers ce processeur. On trouve aussi un '''''IO-APIC''''', qui gère les interruptions en provenance des périphériques et de les redistribuer vers les APIC locaux. L'IO-APIC gère aussi les interruptions inter-processeurs en faisant passer les interruptions d'un local APIC vers un autre. Tous les APIC locaux et l'IO-APIC sont reliés ensembles par un '''bus APIC''' spécialisé, par lequel ils vont pouvoir communiquer et s'échanger des demandes d'interruptions. [[File:Contrôleurs d'interrptions sur systèmes x86 multicoeurs.png|centre|vignette|upright=1.5|Contrôleurs d’interruptions sur systèmes x86 multicœurs.]] Le déclenchement d'une interruption inter-processeur se fait en écrivant dans un registre appelé l''''''Interrupt Command Register'''''. Un détail important est que l'écriture se fait dans le ''local APIC'' de l'envoyer, du processeur qui veut envoyer une interruption, pas dans le registre du processeur qui doit réceptionner l'interruption ! Le registre est composé de deux registres de 32 bits, et mémorise : le numéro du processeur de destination, le mode de transfert (à tous, à un cœur, etc), le numéro du vecteur d'interruption (pour préciser quelle interruption exécuter), et quelques informations supplémentaires. À charge de l'IO-APIC de faire ce qu'il faut en fonction du contenu de ce registre. ==Le multiprocesseur/multicœur asymétrique== Sur les processeurs grand public actuels, les cœurs d'un processeur multicœurs sont tous identiques. Mais ce n'est certainement pas une obligation. On peut très bien regrouper plusieurs cœurs très différents, par exemple un cœur principal avec des cœurs plus spécialisés autour. Il faut ainsi distinguer le '''multicœurs symétrique''', dans lequel on place des processeurs identiques sur la même puce de silicium, du '''multicœurs asymétrique''' où les cœurs ne sont pas identiques. Et il en est de même sur les systèmes avec plusieurs processeurs : on parle de '''multiprocesseur symétrique''' si les processeurs sont identiques, '''multiprocesseur asymétrique''' s'ils sont différents. Précisons ce que nous entendons par "cœurs différents" ou "identiques". Les processeurs Intel modernes utilisent deux types de cœurs différents : des cœurs P et des cœurs E. Le P est pour ''Performance'', le E est pour "Efficiency". Les deux ont le même jeu d'instruction : ce sont des processeurs x86. Par contre, ils ont des microarchitectures différentes. Et Intel n'est pas le seul à utiliser cette technique : ARM a fait pareil avec ses CPU d'architecture ''Big-little''. Il n'est pas clair si de telles organisation sont du multicœur symétrique ou asymétrique. Le jeu d'instruction est identique, sauf éventuellement pour certaines extension comme l'AVX. Les deux coeurs n'ont pas les mêmes performances, mais est-ce suffisant ? La terminologie n'est pas claire. Un exemple de multicoeurs asymétrique est celui du processeur CELL de la console de jeu PS3. Il était conçu spécifiquement pour cette console. Il intègre un cœur principal POWER PC v5 et 8 cœurs qui servent de processeurs auxiliaires. Le processeur principal est appelé le PPE et les processeurs auxiliaires sont les SPE. Les SPE sont reliés à une mémoire locale (''local store'') de 256 kibioctets qui communique avec le processeur principal via un bus spécial. Cette fois-ci, les coprocesseurs sont intégrés dans le même processeur. Les SPE communiquent avec la RAM principale via des contrôleurs DMA. Les SPE possèdent des instructions permettant de commander leur contrôleur DMA et c'est le seul moyen qu'ils ont pour récupérer des informations depuis la mémoire. Et c'est au programmeur de gérer tout ça ! C'est le processeur principal qui va envoyer aux SPE les programmes qu'ils doivent exécuter. Il délègue des calculs aux SPE en écrivant dans le local store du SPE et en lui ordonnant l’exécution du programme qu'il vient d'écrire. [[File:Schema Cell.png|centre|vignette|upright=2|Architecture du processeur CELL de la PS3. Le PPE est le processeur principal, les SPE sont des processeurs auxiliaires qui comprennent : un ''local store'' noté LS, un processeur noté SXU, et un contrôleur DMA pour échanger des informations avec la mémoire principale.]] ==Annexe : les architectures à cœurs conjoints== Sur certains processeurs multicœurs, certains circuits sont partagés entre plusieurs cœurs. Typiquement, l'unité de calcul flottante est partagée entre deux coeurs/''threads'', les unités SIMD qu'on verra dans quelques chapitres sont aussi dans ce cas. Le partage de circuits permet d'éviter de dupliquer trop de circuits et donc d'économiser des transistors. Le problème est que ce partage est source de dépendances structurelles, ce qui peut entraîner des pertes de performances. Cette technique consistant de partage d'unités de calcul entre coeurs s'appelle le '''cluster multithreading''', ou encore les '''architectures à cœurs conjoints''' (''Conjoined Core Architectures''). Elle est notamment utilisée sur les processeurs AMD de microarchitecture Bulldozer, incluant ses trois révisions ultérieures nommées Piledriver, Steamroller et Excavator. Un exemple est celui des processeurs AMD FX-8150 et FX-8120. Sur ces processeurs, les instructions sont chargées dans deux files d'instructions séparées, une par ''thread'' matériel. Les instructions sont ensuite décodées par un décodeur unique et renommées dans une unité de renommage unique. Par la suite, il y a deux voies entières séparées et une voie flottante partagée. Chaque voie entière a sa propre fenêtre d'instruction entière, son tampon de ré-ordonnancement, ses unités de calcul dédiées, ses registres, sa ''load-store queue'', son cache L1. Par contre, la voie flottante partage les unités de calcul flottantes et n'a qu'une seule fenêtre d'instruction partagée par les deux ''threads''. [[File:AMD Bulldozer microarchitecture.png|centre|vignette|upright=3|Microarchitecture Bulldozer d'AMD.]] La révision Steamroller sépara le ''front-end'' en deux voies distinctes, une par ''thread''. Concrètement, elle ajouta un second décodeur d'instruction, une seconde file de micro-opération et une seconde unité de renommage de registres, afin d'améliorer les performances. Niveaux optimisations mineures, les stations de réservation ont été augmentées, elles peuvent mémoriser plus de micro-opérations, idem pour les bancs de registre et les files de lecture/écriture. Un cache de micro-opérations a été ajouté, de même que des optimisations quant au renommage de registre. Des ALU ont aussi été ajoutées, des FPU retirées. [[File:AMD excavator microarchitecture.png|centre|vignette|upright=3|Microarchitecture Excavator d'AMD.]] <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les architectures parallèles | prevText=Les architectures parallèles | next=Architectures multithreadées et Hyperthreading | nextText=Architectures multithreadées et Hyperthreading }} </noinclude> ij10uiwxmm5qyr8bv6plb4u9cpxar2u Commentaire philosophique/L'état de nature selon Hobbes et Rousseau. 0 66625 765021 629333 2026-04-25T09:59:46Z PandaMystique 119061 765021 wikitext text/x-wiki [[Catégorie:Commentaire philosophique]] [[Catégorie:livres terminés]] [[Catégorie:Commentaire philosophique (livre)]] ==L'état de nature selon '''Rousseau'''== L'état de nature n'est pas un état historique comme le souligne Rousseau à maintes reprises, mais une pure hypothèse scientifique :<blockquote>Que mes lecteurs ne s'imaginent donc pas que j'ose me flatter d'avoir vu ce qui me paraît si difficile à voir. J'ai commencé quelques raisonnements; j'ai hasardé quelques conjectures, moins dans l'espoir de résoudre la question que dans l'intention de l'éclaircir et de la réduire à son véritable état. D'autres pourront aisément aller plus loin dans la même route, sans qu'il soit facile à personne d'arriver au terme. Car ce n'est pas une légère entreprise de démêler ce qu'il y a d'originaire et d'artificiel dans la nature actuelle de l'homme, et de bien connaître un état qui n'existe plus, qui n'a peut-être point existé, qui probablement n'existera jamais, et dont il est pourtant nécessaire d'avoir des notions justes pour bien juger de notre état présent. Il faudrait même plus de philosophie qu'on ne pense à celui qui entreprendrait de déterminer exactement les précautions à prendre pour faire sur ce sujet de solides observations; et une bonne solution du problème suivant ne me paraîtrait pas indigne des Aristote et des Pline de notre siècle. Quelles expériences seraient nécessaires pour parvenir à connaître l'homme naturel, et quels sont les moyens de faire ces expériences au sein de la société ? Loin d'entreprendre de résoudre ce problème, je crois en avoir assez médité le sujet, pour oser répondre d'avance que les plus grands philosophes ne seront pas trop bons pour diriger ces expériences, ni les plus puissants souverains pour les faire; concours auquel il n'est guère raisonnable de s'attendre surtout avec la persévérance ou plutôt la succession de lumières et de bonne volonté nécessaire de part et d'autre pour arriver au succès.</blockquote><blockquote>Discours sur l'origine et les fondements de l'inégalité parmi les hommes, Préface</blockquote> * Notons tout de suite à la lecture de cet extrait que pour Rousseau l'état de nature est hors temps, hors histoire..c'est l'entrée dans l'histoire qui sera cause du déclin, de la chute de l'homme dans le mal... ==L'état de nature selon Hobbes== * '''Hobbes''' postule aussi à titre d'hypothèse l'état de nature..une hypothèse fondée sur l'apport des lois de la physique, plus particulièrement la loi d'inertie..un corps poursuit sa course aussi longtemps qu'un obstacle ne surgit pas pour l'arrêter...<blockquote>"Aussi longtemps que les hommes vivent sans un pouvoir commun qui les tienne tous en respect, ils sont dans cette condition qui se nomme guerre, et cette guerre est guerre de chacun contre chacun. Car la guerre ne consiste pas seulement dans la bataille et dans les combats effectifs, mais dans un espace de temps où la volonté de s'affronter en des batailles est suffisamment avérée: on doit par conséquent tenir compte, relativement à la nature de la guerre, de la notion de durée, comme on en tient compte relativement à la nature du temps qu'il fait. De même en effet que la nature du mauvais temps ne réside pas dans une ou deux averses, mais dans une tendance qui va dans ce sens, pendant un grand nombre de jours consécutifs, de même la nature de la guerre ne réside pas dans un combat effectif, mais dans une disposition avérée, allant dans ce sens, aussi longtemps qu'il n'y a pas assurance du contraire. Tout autre temps se nomme Paix.</blockquote><blockquote>(...) Il peut sembler étrange à celui qui n'a pas bien pesé ces choses que la nature puisse ainsi dissocier les hommes et les rendre enclins à s'attaquer et à se détruire les uns les autres: c'est pourquoi peut-être, incrédule à l'égard de cette inférence tirée des passions, cet homme désirera la voir confirmée par l'expérience. Aussi, faisant un retour sur lui-même, alors que partant en voyage il s'arme et cherche à être bien accompagné, qu'allant se coucher il verrouille ses portes, que dans sa maison même il ferme ses coffres à clef, et tout cela sachant qu'il existe des lois et des fonctionnaires publics armés pour venger tous les torts qui peuvent lui être faits: qu'il se demande quelle opinion il a de ses compatriotes quand il voyage armé, de ses concitoyens quand il verrouille ses portes, de ses enfants et de ses domestiques quand il ferme ses coffres à clef. N'incrimine-t-il pas l'humanité par ses actes autant que je le fais par mes paroles? Mais ni lui, ni moi n'incriminons la nature humaine en cela. Les désirs et les autres passions de l'homme ne sont pas en eux-mêmes des péchés. Pas davantage ne le sont les actions qui procèdent de ces passions tant que les hommes ne connaissent pas de loi qui les interdise; et il ne peuvent connaître de loi tant qu'il n'en a pas été fait; or aucune loi ne peut être faite tant que les hommes ne se sont pas entendus sur la personne qui doit la faire".</blockquote><blockquote>Hobbes, Léviathan, chapitre 13</blockquote> {|class="wikitable" |+Questions sur le texte de Hobbes |*Qu'est-ce qui caractérise l'être humain et qu'on ne peut lui retirer? |*Que permet la loi selon Hobbes? |*Pourquoi les désirs ne se confondent-ils pas avec le péché? |} ==Ce qui distingue fondamentalement Hobbes et Rousseau est cependant la question de la pitié.== *Pour Hobbes l'état de nature est un état de guerre permanent... Il n'y a pas de pitié à l'état de nature. C'est un état de guerre où règne une égalité terrible qui fait que chacun n'est jamais assez fort pour demeurer longtemps le plus fort...Menacé en permanence l'homme n'est jamais assuré de rester en vie.A peine tourne-t-il le dos qu'il peut se retrouver poignardé .. Il faudra donc instituer un Etat fort qui assure cette sûreté des biens et des individus. Autre est l'état de nature de Rousseau. La pitié y garantit un état paisible. elle est le fondement d'une démocratie possible et d'une volonté générale soucieuse de l'intérêt commun. Les hommes par la présence en eux de la pitié sont destinés à la moralité. Mais il ne s'agit que des hommes, pas de l'Etat. ==Réfutation de la thèse de l'état de nature par '''Hegel'''== (remarque du §194 des '''Principes de la philosophie du droit''') C'est une opinion fausse de penser que l'homme vivrait libre par rapport au besoin dans l'état de nature où il n'éprouverait que des besoins naturels soi-disant simples et où il n'utiliserait pour les satisfaire que les moyens qu'une nature contingente lui procure. Elle est fausse, même si l'on ne considère pas l'élément de libération qui est dans le travail dont on parlera plus loin. En effet, le besoin naturel en tant que tel et sa satisfaction immédiate ne seraient que l'état de la spiritualité enfoncée dans la nature et, par conséquent, l'état de sauvagerie et de non-liberté, tandis que la liberté n'existe que dans la réflexion du spirituel en lui-même, dans sa distinction d'avec la nature et dans son action réfléchie sur elle. HEGEL Ce texte se présente comme polémique contre les partisans de l’ état de nature. C’est notamment à la thèse de Rousseau que s’en prend Hegel. Le ton est virulent comme le laissent voir des termes comme : « prétendu » état ; il transforme même ce que Rousseau présente comme une hypothèse théorique et scientifique, en un pur produit de l’imagination. Bref, pour Hegel, la liberté naturelle du Second Discours est le pur produit d’un « entendement en délire », comme il aurait pu l’écrire plagiant les propos de Rousseau lui-même. Si l’état de nature est purement et simplement aliénation, où trouver la liberté ? A cette question notre texte apporte deux réponses qui correspondent aux deux derniers moments du texte : dans le travail mais surtout dans l’acte de réflexion, c'est-à-dire dans la séparation de soi d’avec soi-même. Ainsi ce texte est-il à la fois un texte de réfutation (première partie du texte) et un texte de définition où Hegel donne à la liberté sa véritable dimension . Nous expliquerons ce texte en suivant la progression de son auteur, et tenterons toutefois d’en montrer les limites. Ainsi dès le début, l’emploi répété des conditionnels, le verbe imaginer et l’épithète « prétendu » montrent que Hegel s’oppose à l’idée d’une liberté d’indépendance à l’état de nature. L’homme y est prisonnier de ses besoins, d’un ordre naturel qu’il n’a pas choisi . Les besoins sont nécessaires et l’homme ne saurait s’y soustraire. Rousseau posait l’état de nature comme un état où l’homme ne souffrait nullement de ses besoins et cette indépendance faisait de lui un être innocent capable de pitié à l’égard de ceux qu’il croisait par le plus grand des hasards. Cela amenait d’ailleurs Rousseau à engager une critique très virulente contre la raison (qui trouve son origine dans l’acte de se comparer avec autrui) et à y déceler la trace de la perte morale de l’homme. La raison chez Rousseau était source d’aliénation et la nature dans son immédiateté expression de liberté humaine. C’est d’ailleurs cette valorisation de l’immédiat que conteste Hegel dans ce passage qui nous occupe. L’argument essentiel que retient ici Hegel est la contingence de la nature. La nature c’est l’imprévisible, ce qui échappe à la prévision..le hasard y est maître. Comment satisfaire ses besoins quand on a face à soi les intempéries naturelles par exemple ? Les besoins sont signes de la misère humaine, pour reprendre ici un concept de Pascal. Les besoins enferment l’homme dans sa fragilité, sa finitude. Il ne peut donc rien faire d’autre que de chercher à s’en libérer, et y consacrant toute son énergie, il s’y aliène, c'est-à-dire qu’il se perd dans la nécessité de se satisfaire. Cela le conduit dès lors à une attitude de violence à l’égard d’autrui qu’il voit plus comme un concurrent que comme un allié ou quelqu’un pour qui il pourrait avoir un semblant de pitié. Hegel est en cela proche de Hobbes qui voyait dans l’état de nature un pur état de violence et de guerre de tous contre tous. Ce texte remet ainsi en question tous les fondements de la philosophie de Rousseau qui voyait dans la pitié naturelle une des raisons fondamentales de la possibilité pour les hommes de fonder une démocratie réellement morale . Selon Hegel il n’en est rien. Pire, l’état de nature est foncièrement immoral. Le monde de la spontanéité, de l’immédiateté est ainsi dénoncé par notre auteur. Vivre dans l’instant immédiat, ne pas réfléchir, c'est-à-dire ne pas se séparer de soi-même, voilà les conditions requises pour faire de l’homme non pas un être humain mais un barbare. Privé de l’instinct animal, il n’a pas même le pouvoir de se hisser au niveau de la bête. Le barbare est inférieur à l’animal… Comment sortir de cette situation ? Le travail apparaît comme une possibilité que Hegel cependant ne retiendra pas dans ce passage. Mais expliquons toutefois cette paradoxale force libératrice qu’est le travail. Etymologiquement le travail renvoie à la douleur, à l’effort pénible..et on a du mal à concevoir qu’il puisse être libérateur comme l’écrit Hegel. Cependant si on tient compte de ce qu’il dit au début de ce texte le travail nous libère dans un premier temps du monde des besoins. A ce titre il nous libère des nécessités naturelles ce qui permet à l’homme de se détacher de l’état d’urgence dans lequel il se trouve et d’accéder ainsi à une condition plus digne que celle à laquelle le contraint la nature. Libéré des besoins l’homme peut développer son propre monde et ne pas subir la nature, sa propre nature violente en premier. Le travail permet à l’homme de construire son monde et de créer l’art, sa vision d’un monde auquel il donne du sens. Plutôt que d’en rester à la question de savoir comment survivre, l’homme peut se poser d’autres questions et construire du sens à une vie qui est plus qu’un acte de survie. Hegel rejoint ici Aristote qui définit la philosophie comme étonnement. L’étonnement devant le monde, le questionnement ne sont possibles qu’à partir du moment où les besoins vitaux sont satisfaits. Bien sûr une telle conception du travail n’est pas celle d’un travail aliéné. Comme va le montrer la suite de notre travail, seule la réflexion nous libère véritablement de la nature. Ainsi le travail n’est il libérateur qu’à partir du moment où il est rattaché à cette activité réfléchie qui nous permet de développer notre humanité. On trouve ici en germe ce que Marx développera à propos de l’aliénation. Le travail répétitif et monotone ne sert qu’à réduire l’homme à un statut inférieur à celui de l’animal, état morbide que la philosophe Simone Weil décrira aussi. Le travail se donne alors à comprendre comme action libératrice à partir du moment où il interroge le sens du monde dans lequel nous vivons et qu’il développe en nous des facultés exclusivement humaines comme la réflexion, la volonté ou encore le désir. Enfin, me retrouvant dans ce que je fais, le travail traduit aussi ce que je suis, c'est-à-dire un être de réflexion, dans la mesure où je retrouve ce que je suis dans ce que je fais. Le travail est certes libérateur mais il est ce qui manifeste cette liberté essentielle qui constitue l’homme dans son essence. C’est pourquoi notre texte met de côté la question du travail dans la mesure où la liberté de l’homme est rendue possible d’abord et surtout parce qu’il est un être de réflexion, capable de se séparer de la nature. La nature, rappelle-t-il ensuite, est fondamentalement ce lieu où la spiritualité de l’homme est enfouie. C’est bien pourquoi l’homme n’a rien à gagner à rester collé à cette dernière. De la même façon l’artiste ne devra pas adhérer naïvement à une représentation à l’identique de la nature. D’une part parce que cela n’aurait aucun sens, la nature ne pouvant pas être copiée, car comme l’écrira Hegel, dans l’Esthétique, c’est comme si un ver de terre cherchait à se mesurer à un éléphant….La Fontaine parlait de grenouille et de bœuf…même histoire..la grenouille enfla, enfla, enfla tellement…qu’elle en creva.. ! D’autre part copier la nature donne la nausée écrit-il encore. Copier c’est manquer la réflexion. L’homme qui copie ne manifeste en rien ses capacités créatrices. Voilà pourquoi il convient de se séparer de la nature et de manifester ainsi cette puissance de la réflexion qui fait de l’homme un être humain. Mais ce moment d’appartenance à la nature ne doit pas être négligé. C’est bien parce que l’homme est au départ un être sauvage et englué dans la nature qu’il va pouvoir manifester sa capacité à s’en séparer. La séparation enfin apparaît comme un moment nécessaire, mais pas une fin en soi non plus. C’est bien pourquoi le travail est rapidement évoqué par Hegel. Le but de cette séparation d’avec la nature n’est pas qu’un moment négatif de refus ou de mise sous tutelle de la nature. La fin poursuivie est de s’émanciper de la nature mais aussi de dépasser ce simple moment de la négation du naturel. Il s’agit de manifester ce que je suis après ces deux moments. Je suis quelqu’un capable de créer son monde et de se créer soi-même. Ainsi les trois parties de ce texte sont elles aussi les trois moments qui constituent la liberté effective de l’homme. Pour conclure, il est donc clair que l’homme n’est lui-même qu’au travers de ces trois moments qui médiatisent son accès à une réelle liberté. Rousseau en était resté au premier moment. Hobbes avait vu la nécessité de dépasser ce moment. Hegel dépasse à son tour cette perspective en montrant que l’homme ne peut se réaliser qu’en se créant une liberté effective dans ses propres réalisations, c'est-à-dire en travaillant. Le travail seul rend manifeste cette liberté humaine essentielle qui nous différencie de l’animal et du sauvage….à condition que le travail ne nous renvoie pas à nouveau à une aliénation…c’est ce que Marx dénoncera avec plus de virulence que Hegel. Complétons avec un texte de Lucrèce De Natura Rerum:V,224 L'enfant ressemble au matelot qu'ont rejeté des flots cruels ; il gît à terre, nu, incapable de parole, dépourvu de tout ce qui aide à la vie, depuis le moment où la nature l'a jeté sur les rivages de la lumière, après l'avoir péniblement arraché au ventre de sa mère. Il remplit l'espace de ses vagissements plaintifs, comme il est naturel à l'être qui a encore tant de maux à traverser. Pendant ce temps croissent heureusement les troupeaux de gros et petit bétail et les animaux sauvages, qui n'ont besoin ni du jeu de hochet ni d'entendre le doux et chuchotant babil d'une tendre nourrice ; il ne leur faut point de vêtements qui changent avec les saisons, point d'armes pour protéger leurs biens, points de hauts remparts, puisque à tous fournissent toutes choses abondamment la terre féconde et l'industrieuse nature. ou ce texte de Freud: C’est précisément à cause de ces dangers dont la nature nous menace que nous nous sommes rapprochés et avons créé la civilisation qui, entre autres raisons d’être, doit nous permettre de vivre en commun. À la vérité, la tâche principale de la civilisation, sa raison d’être essentielle est de nous protéger contre la nature. On le sait, elle s’acquitte, sur bien des chapitres, déjà fort bien de cette tâche et plus tard elle s’en acquittera évidemment un jour encore bien mieux. Mais personne ne nourrit l’illusion que la nature soit déjà domptée, et bien peu osent espérer qu’elle soit un jour tout entière soumise à l’homme. Voici les éléments, qui semblent se moquer de tout joug que chercherait à leur imposer l’homme : la terre, qui tremble, qui se fend, qui engloutit l’homme et son œuvre, l’eau, qui se soulève, et inonde et noie toute chose, la tempête, qui emporte tout devant soi ; voilà les maladies, que nous savons depuis peu seulement être dues aux attaques d’autres êtres vivants, et enfin l’énigme douloureuse de la mort, de la mort à laquelle aucun remède n’a jusqu’ici été trouvé et ne le sera sans doute jamais. Avec ces forces la nature se dresse contre nous, sublime, cruelle, inexorable ; ainsi elle nous rappelle notre faiblesse, notre détresse, auxquelles nous espérions nous soustraire grâce au labeur de notre civilisation. C’est un des rares spectacles nobles et exaltants que les hommes puissent offrir que de les voir, en présence d’une catastrophe due aux éléments, oublier leurs dissensions, les querelles et animosités qui les divisent pour se souvenir de leur grand tâche commune : le maintien de l’humanité face aux forces supérieurs de la nature. Freud 4r84vv4gqjkpxby59f62aloc6plsidz Catégorie:Commentaire philosophique (livre) 14 66628 765036 758688 2026-04-25T11:04:14Z PandaMystique 119061 765036 wikitext text/x-wiki Analyses de textes philosophiques avec des exercices. [[Catégorie:Livres par titre]] [[Catégorie:Histoire de la philosophie]] [[catégorie:Philosophie]] n9sb7nmp2osyinudxbrtqt8fcnwaus3 765037 765036 2026-04-25T11:04:53Z PandaMystique 119061 765037 wikitext text/x-wiki Analyses de textes philosophiques avec des exercices. [[Catégorie:Livres par titre]] [[Catégorie:Histoire de la philosophie]] [[catégorie:Philosophie]] [[Catégorie:Commentaire philosophique|*]] 0zc0mhdnhoy7mrvh69yti1zh4wmtjzv Commentaire philosophique/Étude de texte sur la différence entre l'homme et l'animal à l'état de nature 0 66646 765020 734954 2026-04-25T09:59:09Z PandaMystique 119061 765020 wikitext text/x-wiki [[Catégorie:Commentaire philosophique]] [[Catégorie:Commentaire philosophique (livre)]] {|class="wikitable" | style="color:#8080ff;" | <strong>Commentaire : Jean-Jacques Rousseau, 1755 « Discours sur l'origine et les fondements de l'inégalité parmi les hommes ». Distinction homme/animal</strong> |[[Fichier:Kscan 0002.jpeg|bordure|300px]] |} =La distinction entre l’homme et l’animal= {{BlocCitation|Je ne vois dans tout animal qu'une machine ingénieuse, à qui la nature a donné des sens pour se remonter elle-même, et pour se garantir, jusqu'à un certain point, de tout ce qui tend à la détruire, ou à la déranger. J'aperçois précisément les mêmes choses dans la machine humaine, avec cette différence que la nature seule fait tout dans les opérations de la bête, au lieu que l'homme concourt aux siennes, en qualité d'agent libre. L'un choisit ou rejette par instinct, et l'autre par un acte de liberté ; ce qui fait que la bête ne peut s'écarter de la règle qui lui est prescrite, même quand il lui serait avantageux de le faire, et que l'homme s'en écarte souvent à son préjudice. C'est ainsi qu'un pigeon mourrait de faim près d'un bassin rempli des meilleures viandes, et un chat sur des tas de fruits ou de grain, quoique l'un et l'autre pût très bien se nourrir de l'aliment qu'il dédaigne, s'il s'était avisé d'en essayer ; c'est ainsi que les hommes dissolus se livrent à des excès qui leur causent la fièvre et la mort ; parce que l'esprit déprave les sens, et que la volonté parle encore quand la nature se tait. | lang = fr | auteur = Jean-Jacques Rousseau (1712-1778), Discours sur l'origine et les fondements de l'inégalité entre les hommes (1755), première partie. }} Une lecture immédiate et trop rapide de ce texte donnerait à penser que Rousseau s’en tient à une simple distinction de l’homme et de l’animal. En fait, ce texte est beaucoup plus complexe qu’il ne le paraît. Rousseau cherche à fonder cette distinction sur la liberté dans le but de montrer que seul l’homme a une destination morale — même si bien souvent il fait le contraire. Le projet de Rousseau est donc de montrer que l’homme seul est responsable de son inhumanité : ni Dieu, ni la nature ne sont en cause. Ainsi si l’homme chute dans le mal, ce n’est qu’un effet pervers de sa liberté, de sa raison, de sa volonté. Le texte commence par une définition de l’animal, « une machine ingénieuse », une définition qui permet de mieux cerner ce qu’est l’homme, « une machine humaine ». Dans un deuxième temps, Rousseau montre en quoi consiste la liberté humaine : s’écarter de la nature, créer un espace de jeux qui permettra à l’homme de survivre dans toutes les circonstances à la différence de l’animal pris au piège de la nécessité de ses instincts. Ce texte s’achève sur les conséquences morales de cette liberté. L’homme seul peut engendrer l’inhumain, aucune solution individuelle à ce problème, la solution ne peut être que collective, ce sera le Contrat social. == I- L’animal, une machine ingénieuse, l’homme une machine humaine. == C’est avec Descartes que dialogue ce début de texte. Descartes rappelons-le, définissait le corps de l’homme comme une machine. Il faut comprendre par là que le corps est soumis à des lois nécessaires et ces lois relèvent de la mécanique, d’où le mot machine. À ces lois de la mécanique, nul ne peut échapper, elles sont nécessaires ; l’animal est qualifié de machine ingénieuse, dotée d'un certain esprit d'invention, même s'il est limité. Inventer n'est pas créer au sens où l'invention produit du neuf sans sortir de l'univers de la production mécanique qui est le sien, alors que la création sort de la logique des moyens. Notons ainsi que Rousseau ne reprend pas complètement Descartes dans la mesure aussi où n’y a chez lui aucune finalité à l’œuvre : la machine fonctionne en parfaite autonomie. Pas besoin de Dieu au point de départ. Rousseau met ainsi en place une première rupture avec Descartes. Ce texte ne sera d’ailleurs qu’une série de ruptures. Le libre-arbitre de Rousseau n’est pas le libre-arbitre de Descartes. L’homme n’est donc pas qu’une simple machine animale, il n’est pas simplement soumis à la nécessité des lois de la nature. Il est celui qui introduit de la contingence dans un monde gouverné par des lois nécessaires. Cette contingence prend ici le nom de liberté. C’est pourquoi la machine qu’est l’homme n’est pas ingénieuse mais humaine. Notons en passant que pour fonder ces propos Rousseau s’appuie exclusivement sur la vision : « je ne vois, « j’aperçois ». Méthode de la réhabilitation des sens qui éloigne un fois de plus Rousseau de Descartes. == II- Un homme libre == Qu'en est-il de cette liberté dont nous parle Rousseau ? Elle s’oppose d’abord au monde de l’instinct. L’instinct est donné à l’animal, il ne le choisit pas, il est inné. C’est une règle naturelle à laquelle il ne saurait se soustraire : l’animal est dans l’instinct, ne le réfléchit pas, ne s'en distancie pas, le vit. L’homme au contraire est agent libre. Il est intéressant de voir la définition que rousseau donne de la liberté. Il la définit comme écart vis-à-vis de la règle. La liberté est d’abord désobéissance, étonnante définition que celle-ci ! Moment finalement très négatif, liberté d’indépendance pourrait-on dire. L’homme poursuit d’abord ses intérêts, ce qui lui est « avantageux ». L’animal au contraire n’a nullement conscience de ce qui relève de l’utile puisque ce sont les instincts qui le guident. Cette liberté d’indépendance ouvre la voie à des mauvais choix. L’homme seul est capable de s’égarer et de commettre des actes préjudiciables aux autres. Seule la vie sociale humaine pose problème. Ce qui manque donc à la liberté d’indépendance- et cette question ne se pose pas pour l’animal - c’est une garantie morale. C’est cette liberté qui sera cause de conflits violents entre les hommes, ce que Hobbes appellera « la guerre de tous contre tous ». Pour approfondir son argumentation Rousseau s’appuie sur deux exemples : le pigeon, et le chat, deux espèces différentes selon la classification de Buffon, à laquelle Rousseau n’est pas étranger : le chat mange l’oiseau, mais la morale de l’histoire ici, comme dans les fables de La Fontaine, c’est que l’on soit faible ou puissant, dans le règne animal, l’instinct ramène tout les animaux à égalité dans leur incapacité à s’écarter de la règle ( une des conséquences de cette affirmation, c’est que l’art est impossible pour l’animal si l’on pose l’art comme écart vis-à-vis de la règle, ou vis-à-vis de la nature, comme le conceptualisera Diderot dans le Paradoxe sur le comédien.) == III- Une liberté dangereuse == C’est elle qui conduit les hommes à tous les excès, l’excès étant la figure du mal dans toute la tradition philosophique. La notion de MAL surgit à la fin du texte sous forme de maladie (la fièvre et la mort). Le mal moral c’est la chute dans la maladie, chute dont seuls les hommes sont responsables. Rousseau n’écrit pas une théodicée comme le fit Leibniz (le Pangloss de Voltaire). Si mal il y a, le responsable en est l’homme. Ce mal, cette maladie attend son remède. Ce dernier n’est pas dans la raison, ni dans un bon usage de la volonté ( la générosité de Descartes), le texte ne nous en dit rien. Ce que l’on comprend toutefois, c’est que l’individu seul ne peut trouver la solution, il va donc lui falloir composer avec les autres. On ne retrouvera la santé que collectivement dans un régime politique où la liberté aura sa place centrale puisqu’elle fonde notre différence avec l’animal. Opposition à Hobbes, mais aussi opposition à Machiavel. La politique doit sauver la liberté et la morale, ce sera le projet du Contrat social. hvy7zffmhamhdb2yonk0lwgov6bbov6 Les cartes graphiques/Les cartes d'affichage 0 67388 764858 755757 2026-04-24T17:39:40Z Mewtow 31375 /* Un historique simplifié des pipelines 2D/3D/vidéo */ 764858 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, mais pas en même temps. Le système d'exploitation, Windows ou linux, utilise soit la carte intégrée, soit la carte dédiée, suivant les besoins. La carte dédiée a de bonnes 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. ===La connexion des cartes graphiques à l'écran=== 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. Les deux cartes graphiques sont reliées au connecteur écran, 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. [[File:Commutation de GPU avec un MUX.png|centre|vignette|upright=2|Commutation de GPU avec un MUX]] Avec la seconde solution, 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. [[File:Commutation de GPU sans MUX.png|centre|vignette|upright=2|Commutation de GPU sans MUX]] ==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. À 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. <noinclude> {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} </noinclude> 2tsdn5k28btdj0omi8i3lmb4ca55tip 764861 764858 2026-04-24T17:40:39Z Mewtow 31375 /* Les cartes graphiques dédiées, intégrées et soudées */ 764861 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. <noinclude>[[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]]</noinclude> 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, mais pas en même temps. Le système d'exploitation, Windows ou linux, utilise soit la carte intégrée, soit la carte dédiée, suivant les besoins. La carte dédiée a de bonnes 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. ===La connexion des cartes graphiques à l'écran=== 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. Les deux cartes graphiques sont reliées au connecteur écran, 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. [[File:Commutation de GPU avec un MUX.png|centre|vignette|upright=2|Commutation de GPU avec un MUX]] Avec la seconde solution, 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. [[File:Commutation de GPU sans MUX.png|centre|vignette|upright=2|Commutation de GPU sans MUX]] ==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. À 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. <noinclude> {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} </noinclude> 4g7ph3853e1jka6x9onfdlonsud2yfq 764896 764861 2026-04-24T18:00:06Z Mewtow 31375 /* L'intérieur d'un GPU */ 764896 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. <noinclude>[[File:PX7800 GTX (557505323).jpg|centre|vignette|Carte graphique dédiée PX 7800 GTX I]]</noinclude> 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, mais pas en même temps. Le système d'exploitation, Windows ou linux, utilise soit la carte intégrée, soit la carte dédiée, suivant les besoins. La carte dédiée a de bonnes 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. ===La connexion des cartes graphiques à l'écran=== 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. Les deux cartes graphiques sont reliées au connecteur écran, 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. [[File:Commutation de GPU avec un MUX.png|centre|vignette|upright=2|Commutation de GPU avec un MUX]] Avec la seconde solution, 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. [[File:Commutation de GPU sans MUX.png|centre|vignette|upright=2|Commutation de GPU sans MUX]] ==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. À 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. <noinclude>[[File:Generic block diagram of a GPU.svg|centre|vignette|upright=3|Architecture d'une carte graphique moderne.]]</noinclude> ===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. <noinclude> {{NavChapitre | book=Les cartes graphiques | next=Le Video Display Controler | nextText=Le Video Display Controler }}{{autocat}} </noinclude> ovl58jmiicdk1tmf376jc3uivmg00im Les cartes graphiques/Les cartes accélératrices 2D 0 67390 764902 746592 2026-04-24T18:02:08Z Mewtow 31375 /* L'effet miroir ou flipping */ 764902 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu les CRTC. Il est maintenant temps de voir les '''''Video Interface Controlers''''', des VDC qui gèrent des fonctionnalités de rendu 2D avancées, voire plus. Avec l'arrivée des interfaces graphiques (celles des systèmes d'exploitation, notamment) et des jeux vidéo 2D, les cartes graphiques ont pu s'adapter. Les cartes graphiques 2D ont d'abord commencé par accélérer le tracé et coloriage de figures géométriques simples, tels les lignes, segments, cercles et ellipses, afin d’accélérer les premières interfaces graphiques. Par la suite, diverses techniques d'accélération de rendu 2D se sont fait jour. La base d'un rendu en 2D est de superposer des images 2D pré-calculées les unes au-dessus des autres. Par exemple, on peut avoir une image pour l’arrière-plan (le décor), une image pour le monstre qui vous fonce dessus, une image pour le dessin de votre personnage, etc. On distingue généralement l'image pour l'arrière-plan, qui prend tout l'écran, des images plus petites qu'on superpose dessus et qui sont appelées des '''sprites'''. Le rendu des ''sprites'' doit s'effectuer de l'image la plus profonde (l'arrière-plan), vers les plus proches (les ''sprites'' qui se superposent sur les autres) : on parle d''''algorithme du peintre'''. [[File:Painter's algorithm.svg|centre|vignette|upright=2.0|Exemple de rendu 2D utilisant l'algorithme du peintre.]] Il existe plusieurs techniques d'accélération graphique pour le rendu en 2D : * L'accélération des copies dans la mémoire vidéo grâce à un circuit dédié. Elle aide à implémenter de manière rapide le défilement ou les ''sprites'', ou encore le tracé de certaines figures géométriques. Mais elle est moins performante que les trois suivantes, bien qu'elle lui soit complémentaire. * L'accélération matérielle des ''sprites'', où les ''sprites'' sont stockés dans des registres dédiés et où la carte graphique les gère séparément de l'arrière-plan. * L'accélération matérielle du défilement, une opération très couteuse. * L'accélération matérielle du tracé de lignes/segments/figures géométriques simples. Les quatre techniques ne sont pas exclusives, mais complémentaires. Elles ne sont pas utiles que pour les jeux vidéo, mais peuvent aussi servir à accélérer le rendu d'une interface graphique. Après tout, les lettres, les fenêtres d'une application ou le curseur de souris sont techniquement du rendu 2D. C'est ainsi que les cartes graphiques actuelles supportent des techniques d’accélération du rendu des polices d'écriture, une accélération du défilement ou encore un support matériel du curseur de la souris, toutes dérivées des techniques d'accélération de rendu 2D. ==Le circuit de ''Blitter'' : les copies en mémoire== Les cartes 2D ont introduit un circuit pour accélérer les copies d'images en mémoire, appelé le '''blitter'''. Les copies de données en mémoire vidéo sont nécessaires pour ajouter les ''sprites'' sur l'arrière-plan, mais aussi lorsqu'un objet 2D se déplace sur l'écran. Déplacer une fenêtre sur votre bureau est un bon exemple : le contenu de ce qui était présent sur l'écran doit être déplacé vers le haut ou vers le bas. Dans la mémoire vidéo, cela correspond à une copie des pixels correspondant de leur ancienne position vers la nouvelle. Sans ''blitter'', les copies étaient donc à la charge du processeur, qui devait déplacer lui-même les données en mémoire. Le ''blitter'' est conçu pour ce genre de tâches, sauf qu'il n'utilise pas le processeur. Pour ceux qui ont quelques connaissances avancées en architecture des ordinateurs, on peut le voir comme une sorte de contrôleur DMA amélioré. D'ailleurs, il est souvent combiné à un contrôleur DMA, voire fusionné avec lui. Il pouvait non seulement faire des copies, mais aussi appliquer des opérations bit à bit sur les données copiées. ===La superposition des ''sprites'' sur l'arrière-plan=== Les cartes 2D sans ''sprites'' matériels effectuent leur rendu en deux étapes : elles copient l'image d'arrière-plan dans le ''framebuffer'', puis chaque ''sprite'' est copié à la bonne place en mémoire pour le placer au bon endroit sur l'écran. Les copies de ''sprites'' sont généralement prises en charge par le ''blitter'', qui est spécialement optimisé pour cela. L'optimisation principale est le fait que le ''blitter'' peut effectuer une opération bit à bit entre les données à copier et une donnée fournie par le programmeur appelé un masque. Pour voir à quoi cela peut servir, rappelons que les ''sprites'' sont souvent des images rectangulaires sans transparence ! Le sans transparence est très important pour ce qui va suivre. Idéalement, les ''sprites'' devraient contenir des zones transparentes pour laisser la place à l'arrière-plan, mais le hardware ne gère pas forcément des pixels transparents à l'intérieur des ''sprites''. La transparence peut s'émuler facilement en utilisant un '''masque''', une donnée qui indique quelles parties de l'image sont censées être transparentes. Par exemple, prenons l'image ci-dessous à gauche et son masque à droite. Les parties blanches du masque sont censées être transparentes et ne pas être copiées au-dessus de l'arrière-plan, il ne faut le faire que pour les pixels noirs. Le masque indique quels pixels sont à copier ou non, ce qui demande simplement 1 bit par pixel. Le pixel est associé dans le masque à une couleur noire ou blanche, pas de niveaux de gris permis. {| |[[File:Pacman--------2.gif|vignette|Image de Pacman.]] |[[File:Pacman mask.gif|vignette|Masque de Pacman.]] |} Le ''blitter'' combine le ''sprite'', l'arrière-plan et le masque. Pour chaque pixel, il effectue l'opération suivante : ((arrière-plan) AND (masque)) OR (image de pacman). [[File:Sprite rendering by binary image mask.png|centre|vignette|upright=2|Sprite rendering by binary image mask]] Imaginons qu'on veut placer l'image ci-dessus (le point vert), en plusieurs endroits de l'arrière-plan. [[File:XBlit dot.png|centre|vignette|upright=3|Image et masque.]] L'application d'un ET logique entre masque et arrière-plan met à zéro les pixels modifiés par le ''sprite'' et uniquement ceux-ci, ils sont mis à la couleur noire. Le OU copie le ''sprite'' dans le vide laissé, les parties noires sont ignorées. Au final, l'image finale est bel et bien celle qu'on attend. {| |[[File:Blit back.png|vignette|upright=3|Arrière-plan de l'exemple.]] |[[File:XBlit and.png|vignette|upright=3|Application du masque - ET.]] |[[File:XBlit final.png|vignette|upright=3|Application des ''sprites'' - OU.]] |} ==Les ''sprites'' matériels== Il existe des cartes 2D sur lesquelles les ''sprites'' sont gérés directement en matériel, sans passer par un ''blitter'', sans être copiés sur un arrière-plan préexistant. À la place, l'image est rendue pixel par pixel, à la volée. La carte graphique décide, à chaque envoi de pixel, s'il faut afficher les pixels de l’arrière-plan ou du ''sprite'' pendant l'accès au ''framebuffer'' par le CRTC. Il faut noter que les ''sprites'' matériel ont une taille assez petite. Ils sont typiquement des carrés de 8 pixels de côté, rarement plus. Par contre, les ''sprites'' utilisés dans les jeux vidéos sont souvent plus grands, certains font 16 pixels de côtés, parfois plus. Aussi, les ''sprites'' d'un jeu vidéo sont parfois composés de plusieurs ''sprites'' matériels placés les uns à côté des autres. Par exemple, un ''sprite'' de 16 pixels de hauteur et de 8 pixels de largeur est composé de deux ''sprites'' 8 par 8, placés l'un au-dessus de l'autre. Le support des ''sprites'' est parfois utilisé dans un cadre particulièrement spécialisé : la prise en charge du curseur de la souris, ou le rendu de certaines polices d'écritures ! Le curseur de souris est alors traité comme un ''sprite'' spécialisé, surimposé au-dessus de tout le reste. Les cartes graphiques modernes gèrent un ou plusieurs ''sprites'', qui représentent chacun un curseur de souris, et deux registres pour respectivement les coordonnées x et y du curseur. Ainsi, pas besoin de redessiner l'image à envoyer à l'écran à chaque fois que l'on bouge la souris : il suffit de modifier le contenu des deux registres, la carte graphique place le curseur sur l'écran automatiquement. Pour en avoir la preuve, testez une nouvelle machine sur laquelle les drivers ne sont pas installés, et bougez le curseur : ''lag'' garantit ! ===Les circuits d'accélération matérielle des ''sprites''=== Sur ces cartes 2D, les ''sprites'' sont stockés dans des registres, alors que l'image d'arrière-plan est stockée dans un ''framebuffer'', dans une mémoire RAM. La RAM pour l'arrière-plan est généralement assez grosse, car l'arrière-plan a la même résolution que l'écran. Pour les ''sprites'', la mémoire est généralement très petite, ce qui fait que les ''sprites'' ont une taille limitée. Pour chaque ''sprite'', on trouve deux registres permettant de mémoriser la position du sprite à l'écran : un pour sa coordonnée X, un autre pour sa coordonnée Y. Lorsque le CRTC demande à afficher le pixel à la position (X , Y), chaque triplet de registres de position est comparé à la position X,Y fournie par le CRTC. Si aucun ''sprite'' ne correspond, les mémoires des sprites sont déconnectées du bus et le pixel affiché est celui de l'arrière-plan. Dans le cas contraire, la RAM du ''sprite'' est connectée sur le bus et son contenu est envoyé au RAMDAC. [[File:Hardware sprites.png|centre|vignette|upright=2.0|Sprites matériels.]] Les ''sprites'' allaient presque toujours de pair avec une gestion de la transparence. Dans le cas le plus simple, la transparence permet de ne pas afficher certaines portions d'un ''sprite''. Certains pixels d'un ''sprite'' sont marqués comme transparents, et à ces endroits, c'est l'arrière-plan qui doit s'afficher. Cela permet d'afficher des personnages ou objets complexes alors que l'image du ''sprite'' est rectangulaire. Cette gestion basique de la transparence ne permet pas de gérer des effets trop complexe, où on mélange la couleur du ''sprite'' avec celle de l'arrière-plan. Les VDC avaient des limitations en termes de ''sprites'' matériels supportés. Notamment, ils géraient un nombre maximal de ''sprites'' par image. Cette limitation par image était secondée par une limitation du nombre de ''sprites'' par ligne. Par exemple, la NES et la Master Sytem géraient 64 ''sprites'' par image, avec maximum 8 ''sprites'' par ligne. Cependant, ces limitations pouvaient être contournées par l'usage de ''raster interrupts'', et précisément l'''horizontal blank interrupt'' qui précise quand l'affichage d'une ligne précise est terminée. L'idée est de changer les ''sprites'' d'une image et de les repositionner, pendant le tracé de l'image, entre l'affichage de deux lignes. Les ''sprites'' qui ont déjà été affichés en haut de l'écran sont remplacés par des ''sprites'' à afficher plus bas. Les programmeurs utilisaient ce genre de ruses pour afficher plus de ''sprites'' à l'écran que ne peut en supporter la console. Les cartes 2D les plus simples ne géraient que deux niveaux : soit l'arrière-plan, soit un ''sprite'' devant l'arrière-plan. Il n'est donc pas possible que deux ''sprites'' se superposent, partiellement ou totalement. Dans ce cas, l'image n'a que deux niveaux de profondeur. C'était le cas sur les consoles de seconde et troisième génération, comme la NES ou la Sega Saturn. Par la suite, une gestion des ''sprites'' superposés est apparue. Pour cela, il fallait stocker la profondeur de chaque ''sprite'', pour savoir celui qui est superposé au-dessus de tous les autres. Cela demandait d'ajouter un registre pour chaque ''sprite'', qui mémorisait la profondeur. Le circuit devait donc être modifié de manière à gérer la profondeur, en gérant la priorité des ''sprites''. Il faut noter que certaines consoles géraient des ''sprites'' situés sous l'arrière-plan. Quelques effets graphiques le requéraient. Par exemple, imaginez un personnage qui passe derrière un arbre. L'arbre est dessiné dans l'arrière-plan, afin d'économiser des ''sprites'', alors que le personage est composé de plusieurs ''sprites''. Avec des ''sprites'' pouvant passer derrière l'arrière-plan, on peut simuler cet effet de personnage qui passe derrière l'arbre, donc sous l'arrière-plan. ===La palette indicée des ''sprites''=== Certaines consoles de jeux utilisaient à la fois des ''sprites'' et une palette indicée. En soi, rien d'incompatible, les deux techniques sont totalement orthogonales. Mais il y a des consoles qui utilisaient deux palettes séparées : une pour les ''sprites'', l'autre pour l'arrière-plan. En général, les deux palettes ont une couleur commune : la couleur transparente. Elle est codée deux fois, une fois dans chaque palette. Mais les autres couleurs des palettes sont potentiellement différentes dans les deux palettes. L'usage de deux palettes indicées séparées est assez commun sur les consoles 8 bits. L'utilité de ce système est de gérer deux fois plus de couleurs, tout en réduisant les besoins en mémoire. En théorie, on pourrait gérer deux fois plus de couleurs en utilisant une palette unique deux fois plus grande, ce qui serait plus flexible. Mais en utilisant une palette deux fois plus grande, on doit ajouter un bit en plus par pixel, pour encoder deux fois plus de couleurs. Avec deux palettes séparées pour les ''sprites'' et l'arrière-plan, pas besoin : le bit est implicite, il vaut 0 pour les ''sprites'' et 1 pour l'arrière-plan. La Master System a deux palettes : une réservée à l'arrière-plan, l'autre servant à la fois pour les ''sprites'' et le décor. Les ''sprites'' ont à disposition 16 couleurs qu'ils peuvent configurer comme ils le souhaitent. La couleur de transparence n'est pas obligatoire. A l'inverse, la palette pour l'arrière-plan dispose de 15 couleurs configurables, et une couleur de transparence fixe. L'arrière-plan a donc à sa disposition 31 couleurs configurables : 16 provenant de la palette des ''sprites'', 15 provenant de l'autre palette, la 32ème couleur fixe étant la couleur de transparence. La NES utilise un système de palette indicé assez complexe pour réduire encore plus le nombre de bits utilisé pour encoder un ''sprite''. Pour simplifier, elle dispose de 4 palettes pour les ''sprites''. Chaque palette gère 4 couleurs chacune, dont l'une est la couleur transparente, ce qui fait 3 couleurs configurables. Chaque ''sprite'' précise quelle palette utiliser avec deux bits de configuration précisés dans le registre associé au ''sprite''. L'avantage est que cela réduit grandement la quantité de mémoire utilisée pour stocker un ''sprite'' : deux bits par pixel du motif, deux pixels pour préciser la palette utilisée pour le ''sprite''. Au total, cela fait maximum 13 couleurs différentes : 3 couleurs fois 4 palettes plus la couleur de transparence. Même principe pour la palette de l'arrière-plan, qui est elle aussi découpée en 4 sous-palettes avec chacune ayant sa propre copie de la couleur de transparence. De rares consoles 8 bits disposent de plus de deux palettes. Par exemple, la PC-Engine a 32 palettes indicées de 16 couleurs chacune. La première palette est toujours consacrée à l'arrière-plan, la dernière est toujours réservée aux ''sprites'', les 30 palettes restantes sont utilisables à volonté par le programmeur. L'avantage est que l'on peut utiliser une palette différente par ''sprite'', au lieu d'avoir une palette indicée partagée par tous les ''sprites''. Mine de rien, trouver un ensemble de couleur partagé par plus d'une dizaine de ''sprite'' est assez compliqué. Les graphismes sont donc plus colorés, sans que cela demande d'utiliser une palette trop large. Et quand on veut modifier la palette à la volée pour un seul ''sprite'', cette implémentation avec des palettes séparées est bien plus simple. Les consoles comme la NES n'avaient que 4 couleurs par ''sprite''. Mais il y avait moyen de contourner ces limitations en superposant plusieurs ''sprites'' de couleurs différentes. Par exemple, on peut simuler un ''sprite'' de 8 couleurs avec deux ''sprites'' de 4 couleurs chacun. Quelques consoles avaient même des fonctionnalités matérielles pour faciliter cette superposition. Par exemple, la MSX 2 fait automatiquement un OU entre deux ''sprites'' superposés. ===Le zoom et la rotation des ''sprites''=== Il a existé des VDC qui pouvaient zoomer sur des ''sprites'', voire les faire tourner. Le ZOOM des sprites permet de faire grossir ou de réduire la taille d'un sprite dynamiquement. L'effet de zoom pouvait servir pour générer des effets de profondeur. Par exemple, quand on veut simuler un personnage qui se rapproche de l'écran en marchant/courant, il suffit de prendre son sprite et de grossir le zoom progressivement pour donner l'illusion d'un personnage qui se rapproche. Idem pour n'importe quel sprite : plus le sprite est loin, plus on en réduit la taille. L'idée est de gérer la taille des sprites en fonction de la profondeur du sprite. L'effet donnait un rendu en pseudo-3D. On parle alors de '''''Sprite Scaling'''''. Les implémentations les plus simples permettaient de faire multiplier les dimensions d'un sprite par 2, 4, 8 fois. En clair, la largeur et la longueur du sprite étaient multipliés par 2, 4, 8, etc. Il y avait possibilité de séparer zoom vertical et horizontal. Quelques VDC ne supportaient que le zoom horizontal, d'autre que en vertical, mais la plupart de ceux qui supportaient le zoom supportaient les deux. [[File:IllustrationOfAPixelReplicationProcess.svg|centre|vignette|upright=2|ZOOM Entier sur un "sprite".]] Les implémentations plus complexes supportaient un zoom plus fluide, avec tous les intermédiaires possibles entre *1 et *X. Pour cela, le sprite devait subir des opérations d'interpolation pour avoir un rendu agréable à l'écran. Pour comprendre ce que cela veut dire : imaginez que vous souhaitez multiplier la taille d'un sprite par X. Pour multiplier par 2, 3, 4 ou tout autre entier, cela demande juste de dupliquer chaque pixel. Mais pour les valeurs fractionnaires, les choses sont plus compliquées. Vous devrez appliquer un filtre pour faire le zoom, filtre qui prend les valeurs des pixels et les mélange pour calculer les pixels finaux. Nous reviendrons sur les filtres possibles dans le chapitre sur le filtrage de texture. Vous avez bien lu : le zoom des sprites n'est pas si différent du filtrage de texture, les algorithmes utilisés pour zoomer sur les sprites et filtrer des textures sont d'ailleurs très similaires, voire identiques. ===L'effet miroir ou ''flipping''=== Une autre possibilité est de faire tourner les sprites. La technique la plus simple est un '''effet de miroir''', à savoir que le sprite est inversé horizontalement, il est tourné dans l'autre sens. Pour vous donner une idée de l'utilité de cette technique, imaginez que vous jouez à Mario : si vous allez à droite, Mario sera tourné vers la droite. Mais si vous allez à gauche, le sprite sera tourné à gauche. Mais il s'agit d'un seul sprite, qui est tourné dans un sens ou l'autre avec un effet de miroir. Il est aussi possible d'inverser le sprite verticalement, pour le retourner. Mais cette possibilité est plus rarement utilisée. La raison est que les rares jeux où cela pourrait être utile sont des jeux en vue de dessus, par exemple les Zelda, les Pokemon, et d'autres jeux dans le genre. Mais ils utilisent souvent un effet de perspective qui fait que la caméra n'est pas placée exactement à la verticale, ce qui fait qu'inverser un sprite verticalement ne respecte pas la perspective. Toutes les consoles 8 bits supportaient l'effet de miroir directement en matériel, celui-ci étant très utile. Une des rares exceptions était la Master System de Sega. Sur cette dernière, le GPU était un VDC TMS9918 de Texas Instrument qui ne gérait pas l'effet miroir. Deux autres consoles utilisaient ce VDC : la colevision et la Sega SG-1000. Elles avaient le même problème. Cependant, il était possible de gérer l'effet miroir en utilisant le CPU. L'avantage de la technique est qu'elle réduit le nombre de ''sprites'' nécessaires, ce qui entraine un gain en mémoire ROM. Les concepteurs peuvent ainsi faire rentrer un jeu sur une cartouche plus facilement, voire peuvent en profiter pour rajouter des ''sprites''. Mais un défaut de cette méthode est que les personnages donnent l'impression d'être ambidextres ! Au passage, sur la Master System, les concepteurs de jeu n'avaient pas d'autre choix que d'utiliser des ''sprites'' séparés pour les personnages/ennemis vus de gauche et vu de droite. Et on peut le remarquer au fait que les ennemis/personnages ne sont pas ambidextres, les artistes ayant souvent pris en compte de détail. <noinclude> Au passage, j'en profite pour vous renvoyer vers ce lien, qui détaille l'utilisation de l'effet de miroir dans plusieurs jeux : * [https://upsilandre.over-blog.com/2019/09/asymetrie-ou-ambidextrie-il-faut-choisir.html ASYMÉTRIE OU AMBIDEXTRIE, IL FAUT CHOISIR], du blog "Upsilandre Retrogaming". </noinclude> ===La rotation des ''sprites''=== La '''rotation des ''sprites''''' regroupe plusieurs techniques diverses, qui vont de simples effets de miroir à des techniques de rotation complexes. L'effet miroir est techniquement une rotation de ''sprite'' particulière, mais ce n'est pas la seule. Les techniques plus évoluées permettent de faire tourner un sprite, pour faire comme si on voyait un objet de biais. Un sprite rectangulaire représente un objet vu soit de profil, soit de face. Mais si on veut donner l'illusion d'un objet faisant un angle différent, il faut modifier la forme du sprite. Le sprite rectangulaire est transformé en trapèze, qui est d'autant moins proche d'un rectangle que l'angle est important. Déformer un sprite rectangulaire en trapèze est un effet de rotation général. Le tout donne un '''effet de perspective'''. [[File:Mode 7 Test-0000.png|centre|vignette|Mode 7, test.]] [[File:Mode 7 process.svg|vignette|upright=1|Mode 7.]] L'implémentation de la perspective est assez simple. Le sprite est une image formée de plusieurs lignes de pixels. L'idée est que la taille des lignes est d'autant plus réduite que la ligne est censée être loin. Les portions proches du sprite seront de taille normale, les autres sont réduites. Mais la technique demande cependant de multiplier la taille de chaque ligne par un coefficient, qui n'est pas forcément entier. Là encore, des algorithmes permettent de lisser les images des sprites pour les mettre à l'échelle. L'algorithme peut faire à la fois la gestion de la perspective et le zoom des sprites, et utiliser des algorithmes proches de ceux du filtrage de textures. Une implémentation complexe est celle du ''mode 7'' de la Super Nintendo. L'implémentation matérielle est paradoxalement assez simple. Mais la comprendre demande de faire la distinction entre les pixels du ''framebuffer'' et les pixels du ''sprite''. Le ''sprite'' est une image qui est composée de pixels. Pour faire la distinction avec les pixels du ''framebuffer'', nous allons appeler les pixels du ''sprite'' des '''texels'''. Terme qui est normalement utilisé pour les textures, mais il y a un lien qui sera fait dans quelques chapitres. Placer le ''sprite'' sur l'arrière-plan demande de prendre les coordonnées de chaque ''texel'' et de faire un calcul qui donne les coordonnées finales x,Y dans le ''framebuffer''. Sans rotation et sans zoom, le calcul est simple : on additionne la position x,y du sprite et la coordonnée du texel dans le sprite. Pour faire tourner les sprites, il faut faire des calculs impliquant des matrices (des objets mathématiques en forme de tableaux de nombre), que je ne détaillerais pas du tout. Pour le dire très rapidement, il faut juste multiplier les coordonnées du texel par une matrice qui encode à la fois la rotation et le zoom, mais aussi le placement au bon endroit sur l'écran (la translation). La matrice est calculée par le processeur, le VDC ne fait que faire la multiplication matricielle. ==L'accélération matérielle du défilement== [[File:Parallax scroll.gif|vignette|Exemple de ''scrolling''.]] Le défilement permet de faire défiler l'environnement sur l'écran, spécialement quand le joueur se déplace. Les jeux de plateforme rétro utilisaient énormément le défilement, le joueur se déplaçait généralement de gauche à droite, ce qui fait que l'on parle de défilement horizontal. Mais il y avait aussi le défilement vertical, utilisé dans d'autres situations. Peu utilisé dans les jeux de plateforme, le défilement vertical est absolument essentiel pour les ''Shoot 'em up'' ! Les cartes accélératrices intégraient souvent des techniques pour accélérer le défilement. La première optimisation est l'usage du ''blitter''. En effet, défiler ne demande pas de régénérer toute l'image à afficher à partir de zéro. L'idéal est de déplacer l'image de quelques pixels vers la gauche, puis de dessiner ce qui manque. Pour cela, on peut utiliser le ''blitter'' pour déplacer l'image dans le ''framebuffer''. L'optimisation est souvent très intéressante, mais elle est imparfaite et n'était pas suffisante sur les toutes premières consoles de jeu. Elle l'était sur les consoles plus récentes, ou disons plutôt : moins rétro. Les consoles moins rétros avaient des mémoires RAM plus rapides, ce qui rendait l'usage du ''blitter'' suffisante. Mais certains VDC implémentaient une forme de défilement accéléré en matériel totalement différent. Les implémentations sont multiples, mais elles ajoutaient toutes des registres de défilement dans le VDC, qui permettaient de défiler facilement l'écran. Il faut noter que l'implémentation du défilement vertical est bien plus simple que pour le défilement horizontal. En effet, les images sont stockées dans le ''framebuffer'' ligne par ligne ! Et le défilement vertical demande de déplacer l'écran d'une ou plusieurs lignes. Les deux vont donc bien ensemble. ===Le défilement vertical implémenté dans le CRTC=== Une technique utilise le fonctionnement d'un CRTC, couplé avec un ''framebuffer'' amélioré. Nous l’appellerons la technique du ''framebuffer'' étendu, terme de mon invention qui aide à comprendre en quoi consiste cette technique. Elle utilise cependant plus de mémoire vidéo qu'un ''framebuffer'' normal. Elle fonctionne très bien pour le défilement vertical, elle demande quelques adaptations pour le défilement horizontal. [[File:Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer.png|vignette|Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer]] La méthode demande d'utiliser un ''framebuffer'' beaucoup plus grand que l'image à afficher. Par exemple, imaginez qu'une console ait une résolution de 640*480, avec des couleurs sur 16 bits. L'image à afficher prend donc 640*480*2 = 600 Kilooctets. Maintenant, imaginez que la mémoire vidéo pour l'arrière-plan fasse 2 mégaoctets. On peut y stocker l’image à rendre, et ce qu'il y a hors de l'écran. Si une scène est assez petite, l'arrière-plan tient entièrement dans la mémoire vidéo, changer l'adresse de base permet de défiler l'écran sur une distance assez longue, voire pour toute la scène. L'idée est de tout simplement dire au CRTC de demander à afficher l'image à partir de la ligne numéro X ! Avec cette technique, il faut faire la différence entre le ''framebuffer'' et le '''''viewport'''''. Le ''viewport'' est la portion du ''framebuffer'' qui mémorise l'image à afficher à l'écran. Le ''framebuffer'', lui, mémorise plus que ce qu'il faut afficher à l'écran, il mémorise quelques lignes en plus, voire un niveau entier ! Le pointeur de ''framebuffer'' et la résolution indiquent la position du ''viewport'' dans le ''framebuffer'', qui monte ou descend en fonction du sens de défilement. Pour la comprendre, prenez le cas où on souhaite défiler d'un pixel, verticalement vers le bas. La première ligne de l'image disparait, une nouvelle apparait en bas de l'image. Cas simple, un peu irréaliste, mais qui permet de bien comprendre l'idée. Pour rappel, un CRTC incorpore deux compteurs de ligne et de colonne, ainsi qu'un registre pour l'adresse de départ de l'image dans le ''framebuffer''. L'idée est que l'adresse de départ de l'image est augmentée de manière à pointer sur la ligne suivante, en l'augmentant de la taille d'une ligne. Il ne reste plus qu'à remplir la ligne suivante, pas besoin de faire la moindre copie en mémoire vidéo ! Et défiler vers le haut demande au contraire de retrancher la taille d'une ligne de l'adresse. On peut généraliser le tout pour du défilement vertical. L'implémentation la plus complexe demande d'ajouter un '''registre de défilement vertical''', dans lequel on place le numéro de ligne à partir de laquelle il faut dessiner l'image. L'image en mémoire vidéo a plus de lignes que l'écran peut en afficher, le CRTC parcourt autant de ligne que ce que demande la résolution, le registre de défilement vertical indique à partir de quelle ligne commencer l'affichage. Le calcul de l'adresse prend en compte le contenu de ce registre pour parcourir le ''framebuffer''. ===Le défilement vertical infini : le ''warp-around'' des adresses=== La technique précédente fonctionne bien, mais elle ne permet pas d'avoir du défilement infini, à savoir avec des maps dont la longueur n'est pas limitée par la mémoire vidéo. Mais on peut l'adapter pour obtenir du défilement vertical, en utilisant un comportement particulier du calcul des adresses. Le comportement en question est le ''warp-around''. Pour le comprendre, prenons l'exemple suivant. La mémoire vidéo peut contenir 1000 lignes, la résolution verticale est de 300 lignes. Si on démarre l'affichage à la 700ème ligne, tout va bien, on n'a pas besoin de ''warp-around''. Mais maintenant, imaginons que le défilement vertical fasse démarrer l'affichage à partir de la 900ème ligne. L'affichage se fera normalement pour 100 lignes, mais la 101ème débordera hors du ''framebuffer'', il n'y aura pas d'adresse associée. Le ''warp-around'' fait repartir les adresses à zéro lors d'un tel débordement. Ainsi, la 101ème adresse sera en fait l'adresse 0, la 102ème sera l'adresse 1, etc. En clair, si on commence à afficher l'image à la 900ème ligne, les 100 premières seront prises dans les 100 lignes à la fin du ''framebuffer'', alors que les 200 suivantes seront les 200 lignes au début du ''framebuffer''. En faisant cela, on peut avoir un défilement vertical infini. Quand l'image affichée est démarrée assez loin, le début du ''framebuffer'' est libre, il contient des lignes qui ne seront sans doute pas affichées par la suite. Dans ce cas, on écrit dedans la suite du niveau, celle située après la ligne à la fin du ''framebuffer''. Il suffit que le programmeur se charge de modifier le ''framebuffer'' de cette manière et on garantit que tout va bien se passer. Avec cette technique, on peut avoir un défilement infini en utilisant seulement deux fois plus de mémoire vidéo que ce qui est nécessaire pour stocker une image à l'écran. Il est même possible de tricher pour utiliser moins de mémoire vidéo. Mais laissons cela de côté, tout cela est laissé à l’appréciation du programmeur. ===Le défilement horizontal et vertical implémenté par le CRTC=== Pour le défilement horizontal, il faut procéder de la même manière, mais en trichant un peu. Là encore, il y a une différence entre ''viewport'' et ''framebuffer'', et les deux n'ont pas la même résolution. Mais cette fois-ci, outre la résolution verticale qui est plus grande, la résolution horizontale l'est aussi. Par exemple, si je prends la console de jeux NES, elle a une résolution pour l'écran de 256 par 240, alors que l'arrière-plan a une résolution de 512 par 480. L'implémentation utilise des compteurs de ligne et de colonne séparés. L'idée est d'avoir des lignes plus longues dans le ''framebuffer'' que ce qui est indiqué dans le registre de résolution. On peut alors mémoriser une ligne plus longue que ce qui est affiché à l'écran, avec des portions non-affichées à l'écran. L'idée est là encore d'initialiser le compteur de colonne avec une valeur qui est incrémentée d'un pixel à chaque fois qu'on défile vers la droite, décrémentée quand on va vers la gauche. Le registre pour la résolution horizontale, qui vérifie si la fin de la ligne/colonne est atteinte, est lui aussi incrémenté. La même méthode peut être utilisée pour le défilement horizontal en faisant la même chose pour le compteur de ligne. L'implémentation demande d'ajouter un registre de défilement horizontal, en plus du registre de défilement vertical, le principe derrière est le même mais pour le numéro de colonne et non de ligne. [[File:Implémentation du défilement horizontal avec in viewport.png|centre|vignette|upright=2|Implémentation du défilement horizontal avec in viewport]] Notons que le comportement de ''warp-around'' peut aussi être implémenté pour les adresses et compteurs de colonne. Cela permet d'avoir du défilement horizontal infini. La fonctionnalité était disponible sur les cartes EGA, les toutes premières cartes d'affichage datant d'avant même le standard VGA. Tout était en place sur ces cartes graphiques pour implémenter la technique : une mémoire vidéo assez grande, un ''framebuffer'' potentiellement plus grand que ce qui est affiché à l'écran, une adresse de départ qu'on peut incrémenter ligne par ligne, par incréments de 1 pixel. Le logiciel devait cependant utiliser cette faculté adéquatement pour implémenter le défilement. Malheureusement, le BIOS des cartes VGA n'implémentait pas les optimisations du défilement, et les programmeurs devaient tout coder à la main dans leurs applications pour les utiliser. ==Les ''raster effects'' : défilement partiel et ''sprites'' supplémentaires== Les '''''raster effects''''' sont des effets graphiques qui sont implémentés en modifiant le VDC pendant l'affichage de l'image. Par exemple, il est possible de changer la couleur de l'arrière-plan à partir d'une certaine ligne, afin de séparer le ciel du sol. Un exemple classique est celui qui permet de contourner le nombre maximal de ''sprites'' à l'écran. ===La limite de ''sprites'' par écran=== Un VDC normal ne peut gérer qu'un nombre maximal de ''sprites'' par image/écran. Mais grâce aux ''raster effects'', il est possible de dépasser cette limite, en changeant les ''sprites'' à la volée, pendant que l'image s'affiche. Par exemple, les ''sprites'' déjà affichés sont recyclés et remplacés par d'autres ''sprites''. Leur coordonnée passe d'une portion affichée de l'image (typiquement en haut de l'écran) à une portion pas encore affichée (typiquement plus bas). En faisant cela, on peut afficher plus de ''sprites'' que ce que gére le VDC. Par contre, on ne peut pas dépasser la limite de ''sprite'' par ''scanline''. Par exemple, si un VDC gère maximum 64 ''sprites'' par imaeg et 8 ''sprites'' par ligne, la première limite est facilement contournée via les ''raster effects'', mais pas la seconde. Autant changer des ''sprites'' entre l'affichage de deux lignes est possible, autant le faire pendant l'affichage d'une ligne ne l'est pas. En effet, le VDC n'est souvent pas reconfigurable par le processeur pendant l'affichage d'une ligne. Il l'est entre l'affichage de deux lignes, pas pendant. ===Le défilement partiel=== De nombreux effets graphiques demandent de ne faire défiler qu'une partie de l'écran, le reste de l'écran reste en place. Dans ce cas, nous parlerons de '''défilement partiel''', le terme partiel indiquant qu'il ne touche qu'une portion de l'image. De tels effets sont généralement implémentés avec des ''raster effect'', mais il faut que le matériel le supporte pleinement. Pour donner un exemple, prenez les phases d’ascenseur dans les jeux de type ''beat'them up'', où votre personnage est sur une plateforme qui monte/descend, les ennemis arrivant dessus par vagues successives. Dans ce cas, la plateforme est immobile et le reste de l'image défile verticalement vers le haut (ascenseur descend) ou vers le bas (ascenseur monte). Un cas particulier de défilement partiel est celui utilisé pour le HUD : les compteurs de vie, score, et autres. Il arrive que le HUD soit dessiné avec des ''sprites'', mais ce n'est pas la majorité des cas. En réalité, le HUD est placé dans l'arrière-plan directement. Et il ne doit pas être défilé, pour rester en place. par exemple, si le HUD est placé au sommet de l'écran, il doit y rester et ne pas subir de défilement vertical ou horizontal. D'autres effets demandent de changer le défilement ligne par ligne : des effets de vagues, d'ondulation, ou autre. Par exemple, c'est ce qui permet de créer des virages sur les jeux de course ! Il n'y a qu'une seule image de route en ligne droite, qu'on décale à chaque ligne pour simuler un virage ! D'autres effets demandent un défilement partiel à la verticale. Il a été utilisé pour le HUD, les Boss de grande taille de certains jeux, des effets d'eau qui monte et bien d'autres encore. Voici un article qui explique le tout en détail : * [https://upsilandre.over-blog.com/2019/07/les-arcanes-du-scrolling-vertical.html LES ARCANES DU SCROLLING VERTICAL SUR NES] Un problème est que le défilement doit être reconfigurable lors de l'affichage de l'image. La quasi-totalité des consoles permettait cela, avec cependant quelques exceptions. Par exemple, la Master System permettait de changer les ''sprites'' à la volée, idem pour le défilement horizontal, mais ne permettait pas de changer le défilement vertical pendant l'affichage d'une image. Sur Master System, le registre de défilement vertical était pris en compte uniquement au début de l'affichage, le modifier en cours d'affichage n'avait pas le moindre effet sur l'affichage. On parle alors de '''''Vlock'''''. Il était possible de contourner le problème avec des solutions logicielles, avec un cout en performance et quelques limitations quant au résultat. ===L'implémentation des ''raster effects''=== Les VDC étaient souvent conçus avec les ''raster effects'' en tête. Ils supportent souvent des fonctionnalités qui facilitent l'implémentation des ''raster effects'' : compteurs de ligne, interruptions horizontales, et autres que nous allons voir dans ce qui suit. En théorie, les ''raster effects'' peuvent se faire même si le VDC ne supporte pas ces fonctionnalités. Mais cela demande de synchroniser le processeur et le VDC au cycle près, ou presque. Les programmeurs de l'Atari 2600 faisaient ainsi, mais il faut avouer que ce n'était pas pratique. La première fonctionnalité est le '''compteur de ligne'''. Le nom est assez transparent : il s'agit d'un registre qui contient le numéro de la dernière ligne affichée. Par exemple, si le VDC a affiché la 20ème ligne et se prépare à afficher la 21ème, alors ce compteur contient le numéro 20. Le compteur de ligne permet au processeur/logiciel de savoir où il en est lors de l'affichage de l'écran. Il peut regarder régulièrement ce compteur et changer le défilement et/ou les ''sprites'' quand un certain numéro apparait dans ce compteur de ligne. Le compteur de ligne en question existe déjà dans la plupart des VDC, vu qu'il s'agit de celui vu dans les chapitres précédents, qui sert pour l'adressage de la mémoire vidéo et quelques autres fonctionnalités. Mais il n'est pas forcément accesible par le processeur. Les VDC anciens ont un compteur de ligne interne, qui n'est accesible que par les circuits du VDC, mais le processeur n'y a pas accès. La fonctionnalité dont on parle ici rend ce registre visible par le processeur, un peu comme l'est le registre d'état. Une seconde fonctionnalité, très liée au compteur de ligne, est l''''''horizontal blank interrupt''''', une cousine de l'interruption de ''vertical blank interrupt'' qui indique qu'une image complète a été affichée à l'écran. L'''horizontal blank interrupt'' fait la même chose, mais au niveau des lignes et d'une manière configurable. L'idée est que l'on peut demander au VDC de déclencher une interruption quand il atteint la ligne numéro X, par exemple quand il a fini d'afficher la 20ème ligne, la 50ème, etc. Le programmeur peut précise à quelle ligne se déclenche l'interruption. Pour le dire autrement, cette interruption se déclenche quand le compteur de ligne atteint une valeur bien précise, configurable par le programmeur. Prenons l'exemple où programmeur veut afficher un HUD de 30 pixels de hauteur au-dessus d'un arrière-plan qui défile horizontalement. L'image ne défile pas initialement et le jeu affiche d'abord le HUD. Mais le programmeur a configuré l'interruption pour se déclencher à la 30ème ligne. L'interruption réactive le défilement de l'arrière-plan et change l'affichage pour basculer du HUD vers l'arrière-plan. Une autre fonctionnalité, spécifique à la SNES, est le '''HDMA''', une amélioration de la fonctionnalité DMA (''Direct Memory Access''). Le DMA normal permet de faire des copies de la RAM vers la RAM, parfois de la RAM vers la mémoire vidéo (et inversement). Le '''HDMA''' de la SNES étend le comportement du DMA. Elle permet de faire copies RAM -> VDC, pour reconfigurer le VDC. De plus, les copies sont programmées à l'avance, elles ne se font pas en réaction à une interruption de ''blanking'' horizontal. Précisément, le VDC est reconfiguré à chaque période de ''blanking'' horizontal, entre l'affichage de deux lignes. Pour cela, le processeur prépare une table HDMA qui précise comment configurer le VDC pour chaque ligne à l'écran. Pour simplifier, la table HDMA contient des entrées, chacune correspondant à une ligne de l'écran, qui indique quoi envoyer dans les registres de configuration du VDC. Le VDC lit les entrées de la première à la dernière, ligne par ligne. Le fonctionnement réel est un peu plus complexe. La table permet de conserver la même configuration pour N lignes consécutives, N allant de 1 à 128. Quand le VDC voit une de ces entrées, les données de configuration sont recopiées à l'identique pour N lignes consécutives. ==L'usage de plusieurs arrière-plans et d'avant-plans== Une carte graphique 2D basique gére un arrière-plan et un avant-plan contenant plusieurs ''sprites'', avec éventuellement un avant-plan pour le HUD ou une interface sur laquelle afficher les vies, et d'autres informations. En tout, cela fait trois plans aux usages bien précis. Mais il est possible d'ajouter plusieurs arrière-plans, voir plusieurs avant-plans. L'utilité n'est pas évidente, mais cela sert pour de nombreux effets graphiques. Voyons lesquels. ===Les décors à l'avant-plan=== Il faut noter que les cartes graphiques peuvent aussi gérer des avant-plans, à savoir des décors qui passent devant les ''sprites''. Une forme d'avant-plan très utile est celui pour le HUD, les compteurs de vie, mana, munitions et autres. Implémenter un HUD avec du défilement est compliqué, car le HUD ne doit pas défiler : il doit rester à la même place sur l'écran, alors que le reste de l'écran défile. Il faut noter que les avant-plans ne sont pas forcément séparés des arrière-plans. La seule différence entre les deux est la profondeur ! Et précisément la profondeur comparée à la couche pour les ''sprites''. Plus profond que les ''sprites'' : c'est un arrière-plan. Moins profond, c'est un avant-plan. Les cartes graphiques gèrent souvent des "couches" (''layers'') qui se superposent, avec une couche spécialisée pour les ''sprites'', et d'autres couches qu'on peut configurer à volonté comme arrière- ou avant-plan. Les avant-plans sont aussi utilisés dans quelques jeux pour un effet purement esthétique, pour mettre un décor ou des objets devant les ''sprites''. De plus, ils sont occasionnellement nécessaires pour rendre certains effets graphiques, ou pour ajouter de la profondeur à une scène. Les avant-plans défilent à une vitesse différente des arrière-plans, sans quoi le résultat est absolument affreux. Aussi, l'usage d'avant-plans est très fortement corrélé à l'usage du défilement à parallaxe qu'on va voir dans ce qui suit. ===Le défilement horizontal à parallaxe=== [[File:Parallax-scroll-example-2.png|vignette|Défilement avec parallaxe.]] [[File:Parallax-scroll-example.gif|vignette|Défilement avec parallaxe : illustration des plans.]] Le '''défilement à parallaxe''' donne une illusion de profondeur dans l'environnement? Pour cela, il utilise plusieurs arrière-plans superposés qui défilent à des vitesses différentes. Le défilement à parallaxe demande que les éléments à l'arrière-plan bougent à des vitesses différentes, mais pas les sprites à l'avant-plan. Le défilement sans parallaxe fait bouger le ''framebuffer'' en bloc, ce qui fait bouger tout l'arrière-plan tout d'un coup. Pour implémenter la technique, il est possible d'utiliser un défilement partiel basé sur des ''raster effects''. L'idée est de changer le défilement horizontal ou vertical pendant l'affichage. En général, l'écran est découpé en bandes qui défilent à des vitesses différentes, pour donner des effets parallaxe, parfois des effets de rouleau (le sol forme un tore) ou d'autres effets graphiques. Une autre solution utilise des arrière-plans partiellement transparents qui se superposent. Les différents arrière-plans ont chacun une profondeur qui dit quel arrière-plan passe devant les autres. Il s'agit de l'implémentation la plus simple, mais elle demande que la carte graphique gère la transparence. Ce n'est cependant pas la seule option et quelques consoles de jeu se débrouillaient pour mélanger plusieurs arrière-plans sans pour autant gérer directement la transparence. Mais nous verrons cela plus tard. ===L'émulation de la transparence, des ombres et lumières=== L'usage de plusieurs arrière-plans marche bien si la carte graphique gère la transparence. C’est-à-dire que chaque pixel indique s'il est totalement opaque, totalement transparent, ou partiellement opaque. En faisant cela, déterminer quel pixel afficher est simple : on prend en compte la profondeur de chaque arrière-plan, et on détermine quel est le premier pixel visible. Par un exemple, si un pixel transparent est situé devant un pixel opaque, c'est ce dernier qui s'affiche. Pour les pixels partiellement transparents, il faut mélanger les couleurs des pixels en faisant une simple moyenne. Mais cela implique que la carte graphique gère la transparence, que chaque pixel contienne une couleur alpha qui indique son niveau de transparence, couleur ajoutée aux couleurs RGB existantes. Des consoles comme la SNES utilisaient un système totalement différent. Elles utilisaient des arrière-plans dont les pixels étaient codés en RGB, sans composante de transparence alpha. Mais elles arrivaient à combiner plusieurs arrière-plans entre eux sans problèmes. Les arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. La combinaison pouvait utiliser plusieurs opérations, qui étaient appliquées pixel par pixel. Les opérations de combinaison sont : l'addition, la soustraction, la moyenne additive, et une soustraction suivie d'une division par deux. Pour résumer, on peut additionner/soustraire des pixels à la même place dans les différents arrière-plans, puis éventuellement diviser par deux le résultat. Précisons que les additions/soustractions sont dites saturées : elles n'ont pas de débordements d'entiers. Les différentes opérations permettaient surtout d'implémenter des effets d'éclairage, d'ombrage, de transparence, voire de masquage (n'afficher qu'une partie de l'écran). L'addition ne peut qu'augmenter la couleur du pixel final, en augmenter la luminosité, ce qui la rend idéale pour appliquer des effets de lumière. À l'inverse, la soustraction ne peut que réduire la couleur finale d'un pixel, ce qui permet d'appliquer des ombres. La moyenne mélange deux pixels entre eux, qui sont à la même place à l'écran, mais n'ont pas la même profondeur, vu qu'ils sont dans des arrière-plans différents. En clair, elle applique des effets de transparences assez limités. Les pixels de deux arrière-plans sont mélangés avec une proportion fixe de 50-50. Ce qui permet d'appliquer des effets de transparence très limités. Avec l'addition, il suffit de calculer les lumières à appliquer dans un arrière-plan, qui est additionné avec le reste de l'image. Pour appliquer des ombres, il faut faire la même chose mais avec la soustraction. Les ombres sont calculées dans un arrière-plan à part, qui est soustrait du résultat du reste. Pour être plus précis, l'arrière-plan contenait une image d'ombrage, qui indique quelles sont les parties de l'image dans l'ombre et l'intensité de l'ombre pour chaque pixel. Plus un pixel est dans l'ombre, plus sa couleur est proche du blanc (en RGB) : la palette de couleur est inversée. En soustrayant cette seconde image d'ombrage à l'image du ''framebuffer'' principal, on ombre les pixels. Il faut noter que certaines consoles, comme la NES, permettaient en plus d'additionner une couleur fixe pour tous les pixels de l'écran, voire de la soustraire, voire de soustraire le pixel à cette couleur fixe. Cela permettait de biaiser les couleurs de base avec une couleur de base. Là encore, l'utilité était une question d'ombrage, d'éclairage, de transparence, ou autre. Cela permettait d'affiner les couleurs finales. La couleur de base était mémorisée dans un registre. Notons que le registre pouvait être changé entre l'affichage de deux lignes, via des ''raster interrupts'', ce qui permettait d'appliquer des dégradés de lumière verticaux, d'appliquer un effet d'horizon, d'ajouter du brouillard de distance. ===L'implémentation matérielle et le cas particulier de la SNES=== Utiliser plusieurs arrière-plans demande que le matériel soit adapté. Il faut typiquement ajouter de quoi gérer et mémoriser plusieurs arrière-plans et ajouter des circuits pour les combiner entre eux. Le hardware pour faire cette combinaison détermine quel pixel passe devant les autres, il peut gérer de la transparence, etc. Les ''sprites'' sont souvent gérés par un système de ''sprite'' matériel, ce qui fait que le défilement n'est pas tellement un problème pour eux. Les arrières/avant-plans sont typiquement dans des mémoires séparées afin de faciliter la gestion du défilement . Avec plusieurs mémoires, la technique précédente (le ''framebuffer'' étendu et un viewport rectangulaire) peut s'appliquer à chaque arrière-plan. Et on peut les faire défiler à des vitesses différentes. Il est aussi possible d'utiliser une seule mémoire pour cela, qui mémorise plusieurs arrière-plans, c'est tout à fait possible. La console de jeu SNES gérait 4 arrière-plans différents, mais elle n'utilisait pas plusieurs mémoires. Les 4 arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. Il était possible d'activer ou de désactiver les arrière-plans si besoin. Il était par exemple possible de n'utiliser que 2 arrière-plans, ou 3 arrière-plans dont un soustrait de l'addition des deux autres, etc. Elle disposait de plusieurs modes, appelés mode 1, mode 2, ..., mode 7. Le mode 7 est un mode de rendu avec un seul arrière-plan, mais où les techniques des sections précédentes sont utilisables. Les optimisations pour le défilement horizontal et vertical sont présentes, et le ''viewport'' peut même être déformé, tourné, etc. Il peut utiliser un second arrière-plan très particulier, dérivé du premier. Il utilise les mêmes tiles, avec cependant la possibilité de se retrouver devant les ''sprites'' ou les autres arrière-plans. Il était utilisé pour gérer des tunnels vus de dessus, ou pour quelques effets graphiques où des élèments de décor se retrouvaient à l'avant-plan. {|class="wikitable" |- ! Mode vidéo ! BG 1 ! BG 2 ! BG 3 ! BG 4 |- ! 0 | 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) |- ! 1 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || 4 couleurs (2 bits) || |- ! 2 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || || |- ! 3 | 256 couleurs (8 bits) || 16 couleurs (4 bits) || || |- ! 4 | 256 couleurs (8 bits) || 4 couleurs (2 bits) || || |- ! 5 | 16 couleurs (4 bits) || 4 couleurs (2 bits) || || |- ! 6 | 16 couleurs (4 bits) || || || |- ! 7 | 256 couleurs (8 bits) || EXTBG || || |} ==L'accélération matérielle du tracé de ligne et de figures géométriques== [[File:Bresenham.svg|vignette|Tracé d'une ligne sur un écran.]] La dernière optimisation du rendu 2D est le '''tracé de lignes et de figures géométriques''' accéléré en matériel. Quelques VDC incorporent cette optimisation, dont le nom est assez clair sur ce qu'elle fait. Tracer une ligne, un segment, est l'opération la plus courante sur de tels VDC, le tracé de cercles est déjà plus rare. Tracer des polygones est entre les deux, : plus rare que le tracé de ligne pur, moins que le tracé de cercles. ===Les circuits de tracé de ligne=== L'algorithme le plus utilisé par le matériel pour tracer des lignes est l''''algorithme de Bresenham'''. Il est très simple et s'implémente très facilement dans un circuit électronique. Il fut dit que cet algorithme utilise seulement des additions, des soustractions et des décalages, opérations très simples à implémenter en hardware. Il est de plus un des tout premiers algorithmes découvert dans le domaine du graphisme sur ordinateur. Il existe de nombreuses modifications de cet algorithme, qui vont de mineures à assez profondes. Et certaines d'entre elles sont plus faciles à implémenter en hardware que d'autres. [[File:Bresenham line.png|vignette|Coordonnées du pixel de départ et d'arrivée.]] [[File:LineBresenham.gif|vignette|Tracé d'une ligne sur un écran, pixel par pixel.]] Le fonctionnement du circuit de tracé de ligne est le suivant. Premièrement, on précise le pixel de départ et le pixel d'arrivée en configurant des registres à l'intérieur du circuit, avec une paire de registre pour les coordonnées du pixel de départ, une autre parie pour les coordonnées du pixel d'arrivée. Le circuit dessine la ligne pixel par pixel, avec un pixel dessiné par cycle d'horloge. ===Le tracé de figures géométriques=== Passons maintenant au tracé de figures géométrique. Le tracé se fait là encore pixel par pixel, sur le principe. Généralement, le tracé est limité à des figures géométriques simples, que vous avez tous vu quand vous étiez au collège, en cours de maths. Tracer des carrés/rectangles/pentagones/trapèzes ou autres polygone est très simple : il suffit de tracer plusieurs lignes les unes à la suite des autres. La vraie utilité est l'implémentation de courbes, comme des cercles, des ellipses, ou autres. L'algorithme de Bressenham peut être modifié pour implémenter des cercles, ce qui donne le '''''Midpoint circle algorithm'''''. D'autres extensions permettent de dessiner des ellipses, et même des courbes plus complexes comme des courbes de Bezier ou d'autres courbes assez complexes à expliquer. ===Le tracé et le remplissage de figures géométriques par le ''blitter''=== Outre le tracé des figures géométriques, il est aussi possible de gérer en hardware les opérations de '''remplissage'''. Cela veut dire dessiner l'intérieur d'une figure géométrique, comme remplir un carré ou un rectangle, avec une couleur uniforme. Par exemple : dessiner un carré en rouge, remplir un rectangle existant de bleu clair, etc. Le remplissage est souvent disponible pour certaines formes géométriques simples, comme des carrés ou rectangles, rarement plus. Pour le remplissage des triangles ou d'autres figures géométriques, le support matériel est encore plus rare, ne parlons même pas des cercles. Le remplissage de rectangles est souvent réalisé par le ''blitter''. Pour faire une comparaison, la méthode utilisée est globalement la même que celle utilisée pour lire le ''viewport'' dans le ''framebuffer'', mais cette fois-ci réalisé par le ''blitter''. Le ''viewport'' est remplacé par le rectangle à remplir, et la lecture du pixel à envoyer à l'écran est remplacée par l'écriture d'une couleur précisée dans un registre. Pour cela, on précise la couleur, la coordonnée X,Y et la largeur et la hauteur du rectangle dans des registres dédiés. Le remplissage commence à la coordonnée X,Y. L'adresse mémoire est alors incrémentée jusqu'à ce que la largeur voulue soit atteinte. On incrémente alors le compteur de ligne pour passer à la suivante, le compteur de colonne est réinitialisé avec la coordonnée X de la première colonne. Le remplissage s’arrête une fois que la hauteur voulue est atteinte. Un exemple est le ''blitter'' des anciennes consoles Amiga, qui gère nativement des blocs en forme de rectangles, et de trapèzes dessinés à l'horizontale. Ils sont remplis en fournissant plusieurs informations : la position de leur premier pixel, une largeur qui est un multiple de 16 bits, une hauteur mesurée en nombre de lignes, un décalage qui indique de combien de pixels sont décalées deux lignes consécutives. Le décalage est ajouté une fois le compteur de colonne réinitialisé à sa valeur précédente (au démarrage de la ligne précédente). {{NavChapitre | book=Les cartes graphiques | prev=Les systèmes à framebuffer | prevText=Les systèmes à framebuffer | next=Le mode texte et le rendu en tiles | nextText=Le mode texte et le rendu en tiles }} {{autocat}} ie3gf1o02r8n8kjm55vxkq7db9jy8l8 764903 764902 2026-04-24T18:02:33Z Mewtow 31375 /* L'effet miroir ou flipping */ 764903 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu les CRTC. Il est maintenant temps de voir les '''''Video Interface Controlers''''', des VDC qui gèrent des fonctionnalités de rendu 2D avancées, voire plus. Avec l'arrivée des interfaces graphiques (celles des systèmes d'exploitation, notamment) et des jeux vidéo 2D, les cartes graphiques ont pu s'adapter. Les cartes graphiques 2D ont d'abord commencé par accélérer le tracé et coloriage de figures géométriques simples, tels les lignes, segments, cercles et ellipses, afin d’accélérer les premières interfaces graphiques. Par la suite, diverses techniques d'accélération de rendu 2D se sont fait jour. La base d'un rendu en 2D est de superposer des images 2D pré-calculées les unes au-dessus des autres. Par exemple, on peut avoir une image pour l’arrière-plan (le décor), une image pour le monstre qui vous fonce dessus, une image pour le dessin de votre personnage, etc. On distingue généralement l'image pour l'arrière-plan, qui prend tout l'écran, des images plus petites qu'on superpose dessus et qui sont appelées des '''sprites'''. Le rendu des ''sprites'' doit s'effectuer de l'image la plus profonde (l'arrière-plan), vers les plus proches (les ''sprites'' qui se superposent sur les autres) : on parle d''''algorithme du peintre'''. [[File:Painter's algorithm.svg|centre|vignette|upright=2.0|Exemple de rendu 2D utilisant l'algorithme du peintre.]] Il existe plusieurs techniques d'accélération graphique pour le rendu en 2D : * L'accélération des copies dans la mémoire vidéo grâce à un circuit dédié. Elle aide à implémenter de manière rapide le défilement ou les ''sprites'', ou encore le tracé de certaines figures géométriques. Mais elle est moins performante que les trois suivantes, bien qu'elle lui soit complémentaire. * L'accélération matérielle des ''sprites'', où les ''sprites'' sont stockés dans des registres dédiés et où la carte graphique les gère séparément de l'arrière-plan. * L'accélération matérielle du défilement, une opération très couteuse. * L'accélération matérielle du tracé de lignes/segments/figures géométriques simples. Les quatre techniques ne sont pas exclusives, mais complémentaires. Elles ne sont pas utiles que pour les jeux vidéo, mais peuvent aussi servir à accélérer le rendu d'une interface graphique. Après tout, les lettres, les fenêtres d'une application ou le curseur de souris sont techniquement du rendu 2D. C'est ainsi que les cartes graphiques actuelles supportent des techniques d’accélération du rendu des polices d'écriture, une accélération du défilement ou encore un support matériel du curseur de la souris, toutes dérivées des techniques d'accélération de rendu 2D. ==Le circuit de ''Blitter'' : les copies en mémoire== Les cartes 2D ont introduit un circuit pour accélérer les copies d'images en mémoire, appelé le '''blitter'''. Les copies de données en mémoire vidéo sont nécessaires pour ajouter les ''sprites'' sur l'arrière-plan, mais aussi lorsqu'un objet 2D se déplace sur l'écran. Déplacer une fenêtre sur votre bureau est un bon exemple : le contenu de ce qui était présent sur l'écran doit être déplacé vers le haut ou vers le bas. Dans la mémoire vidéo, cela correspond à une copie des pixels correspondant de leur ancienne position vers la nouvelle. Sans ''blitter'', les copies étaient donc à la charge du processeur, qui devait déplacer lui-même les données en mémoire. Le ''blitter'' est conçu pour ce genre de tâches, sauf qu'il n'utilise pas le processeur. Pour ceux qui ont quelques connaissances avancées en architecture des ordinateurs, on peut le voir comme une sorte de contrôleur DMA amélioré. D'ailleurs, il est souvent combiné à un contrôleur DMA, voire fusionné avec lui. Il pouvait non seulement faire des copies, mais aussi appliquer des opérations bit à bit sur les données copiées. ===La superposition des ''sprites'' sur l'arrière-plan=== Les cartes 2D sans ''sprites'' matériels effectuent leur rendu en deux étapes : elles copient l'image d'arrière-plan dans le ''framebuffer'', puis chaque ''sprite'' est copié à la bonne place en mémoire pour le placer au bon endroit sur l'écran. Les copies de ''sprites'' sont généralement prises en charge par le ''blitter'', qui est spécialement optimisé pour cela. L'optimisation principale est le fait que le ''blitter'' peut effectuer une opération bit à bit entre les données à copier et une donnée fournie par le programmeur appelé un masque. Pour voir à quoi cela peut servir, rappelons que les ''sprites'' sont souvent des images rectangulaires sans transparence ! Le sans transparence est très important pour ce qui va suivre. Idéalement, les ''sprites'' devraient contenir des zones transparentes pour laisser la place à l'arrière-plan, mais le hardware ne gère pas forcément des pixels transparents à l'intérieur des ''sprites''. La transparence peut s'émuler facilement en utilisant un '''masque''', une donnée qui indique quelles parties de l'image sont censées être transparentes. Par exemple, prenons l'image ci-dessous à gauche et son masque à droite. Les parties blanches du masque sont censées être transparentes et ne pas être copiées au-dessus de l'arrière-plan, il ne faut le faire que pour les pixels noirs. Le masque indique quels pixels sont à copier ou non, ce qui demande simplement 1 bit par pixel. Le pixel est associé dans le masque à une couleur noire ou blanche, pas de niveaux de gris permis. {| |[[File:Pacman--------2.gif|vignette|Image de Pacman.]] |[[File:Pacman mask.gif|vignette|Masque de Pacman.]] |} Le ''blitter'' combine le ''sprite'', l'arrière-plan et le masque. Pour chaque pixel, il effectue l'opération suivante : ((arrière-plan) AND (masque)) OR (image de pacman). [[File:Sprite rendering by binary image mask.png|centre|vignette|upright=2|Sprite rendering by binary image mask]] Imaginons qu'on veut placer l'image ci-dessus (le point vert), en plusieurs endroits de l'arrière-plan. [[File:XBlit dot.png|centre|vignette|upright=3|Image et masque.]] L'application d'un ET logique entre masque et arrière-plan met à zéro les pixels modifiés par le ''sprite'' et uniquement ceux-ci, ils sont mis à la couleur noire. Le OU copie le ''sprite'' dans le vide laissé, les parties noires sont ignorées. Au final, l'image finale est bel et bien celle qu'on attend. {| |[[File:Blit back.png|vignette|upright=3|Arrière-plan de l'exemple.]] |[[File:XBlit and.png|vignette|upright=3|Application du masque - ET.]] |[[File:XBlit final.png|vignette|upright=3|Application des ''sprites'' - OU.]] |} ==Les ''sprites'' matériels== Il existe des cartes 2D sur lesquelles les ''sprites'' sont gérés directement en matériel, sans passer par un ''blitter'', sans être copiés sur un arrière-plan préexistant. À la place, l'image est rendue pixel par pixel, à la volée. La carte graphique décide, à chaque envoi de pixel, s'il faut afficher les pixels de l’arrière-plan ou du ''sprite'' pendant l'accès au ''framebuffer'' par le CRTC. Il faut noter que les ''sprites'' matériel ont une taille assez petite. Ils sont typiquement des carrés de 8 pixels de côté, rarement plus. Par contre, les ''sprites'' utilisés dans les jeux vidéos sont souvent plus grands, certains font 16 pixels de côtés, parfois plus. Aussi, les ''sprites'' d'un jeu vidéo sont parfois composés de plusieurs ''sprites'' matériels placés les uns à côté des autres. Par exemple, un ''sprite'' de 16 pixels de hauteur et de 8 pixels de largeur est composé de deux ''sprites'' 8 par 8, placés l'un au-dessus de l'autre. Le support des ''sprites'' est parfois utilisé dans un cadre particulièrement spécialisé : la prise en charge du curseur de la souris, ou le rendu de certaines polices d'écritures ! Le curseur de souris est alors traité comme un ''sprite'' spécialisé, surimposé au-dessus de tout le reste. Les cartes graphiques modernes gèrent un ou plusieurs ''sprites'', qui représentent chacun un curseur de souris, et deux registres pour respectivement les coordonnées x et y du curseur. Ainsi, pas besoin de redessiner l'image à envoyer à l'écran à chaque fois que l'on bouge la souris : il suffit de modifier le contenu des deux registres, la carte graphique place le curseur sur l'écran automatiquement. Pour en avoir la preuve, testez une nouvelle machine sur laquelle les drivers ne sont pas installés, et bougez le curseur : ''lag'' garantit ! ===Les circuits d'accélération matérielle des ''sprites''=== Sur ces cartes 2D, les ''sprites'' sont stockés dans des registres, alors que l'image d'arrière-plan est stockée dans un ''framebuffer'', dans une mémoire RAM. La RAM pour l'arrière-plan est généralement assez grosse, car l'arrière-plan a la même résolution que l'écran. Pour les ''sprites'', la mémoire est généralement très petite, ce qui fait que les ''sprites'' ont une taille limitée. Pour chaque ''sprite'', on trouve deux registres permettant de mémoriser la position du sprite à l'écran : un pour sa coordonnée X, un autre pour sa coordonnée Y. Lorsque le CRTC demande à afficher le pixel à la position (X , Y), chaque triplet de registres de position est comparé à la position X,Y fournie par le CRTC. Si aucun ''sprite'' ne correspond, les mémoires des sprites sont déconnectées du bus et le pixel affiché est celui de l'arrière-plan. Dans le cas contraire, la RAM du ''sprite'' est connectée sur le bus et son contenu est envoyé au RAMDAC. [[File:Hardware sprites.png|centre|vignette|upright=2.0|Sprites matériels.]] Les ''sprites'' allaient presque toujours de pair avec une gestion de la transparence. Dans le cas le plus simple, la transparence permet de ne pas afficher certaines portions d'un ''sprite''. Certains pixels d'un ''sprite'' sont marqués comme transparents, et à ces endroits, c'est l'arrière-plan qui doit s'afficher. Cela permet d'afficher des personnages ou objets complexes alors que l'image du ''sprite'' est rectangulaire. Cette gestion basique de la transparence ne permet pas de gérer des effets trop complexe, où on mélange la couleur du ''sprite'' avec celle de l'arrière-plan. Les VDC avaient des limitations en termes de ''sprites'' matériels supportés. Notamment, ils géraient un nombre maximal de ''sprites'' par image. Cette limitation par image était secondée par une limitation du nombre de ''sprites'' par ligne. Par exemple, la NES et la Master Sytem géraient 64 ''sprites'' par image, avec maximum 8 ''sprites'' par ligne. Cependant, ces limitations pouvaient être contournées par l'usage de ''raster interrupts'', et précisément l'''horizontal blank interrupt'' qui précise quand l'affichage d'une ligne précise est terminée. L'idée est de changer les ''sprites'' d'une image et de les repositionner, pendant le tracé de l'image, entre l'affichage de deux lignes. Les ''sprites'' qui ont déjà été affichés en haut de l'écran sont remplacés par des ''sprites'' à afficher plus bas. Les programmeurs utilisaient ce genre de ruses pour afficher plus de ''sprites'' à l'écran que ne peut en supporter la console. Les cartes 2D les plus simples ne géraient que deux niveaux : soit l'arrière-plan, soit un ''sprite'' devant l'arrière-plan. Il n'est donc pas possible que deux ''sprites'' se superposent, partiellement ou totalement. Dans ce cas, l'image n'a que deux niveaux de profondeur. C'était le cas sur les consoles de seconde et troisième génération, comme la NES ou la Sega Saturn. Par la suite, une gestion des ''sprites'' superposés est apparue. Pour cela, il fallait stocker la profondeur de chaque ''sprite'', pour savoir celui qui est superposé au-dessus de tous les autres. Cela demandait d'ajouter un registre pour chaque ''sprite'', qui mémorisait la profondeur. Le circuit devait donc être modifié de manière à gérer la profondeur, en gérant la priorité des ''sprites''. Il faut noter que certaines consoles géraient des ''sprites'' situés sous l'arrière-plan. Quelques effets graphiques le requéraient. Par exemple, imaginez un personnage qui passe derrière un arbre. L'arbre est dessiné dans l'arrière-plan, afin d'économiser des ''sprites'', alors que le personage est composé de plusieurs ''sprites''. Avec des ''sprites'' pouvant passer derrière l'arrière-plan, on peut simuler cet effet de personnage qui passe derrière l'arbre, donc sous l'arrière-plan. ===La palette indicée des ''sprites''=== Certaines consoles de jeux utilisaient à la fois des ''sprites'' et une palette indicée. En soi, rien d'incompatible, les deux techniques sont totalement orthogonales. Mais il y a des consoles qui utilisaient deux palettes séparées : une pour les ''sprites'', l'autre pour l'arrière-plan. En général, les deux palettes ont une couleur commune : la couleur transparente. Elle est codée deux fois, une fois dans chaque palette. Mais les autres couleurs des palettes sont potentiellement différentes dans les deux palettes. L'usage de deux palettes indicées séparées est assez commun sur les consoles 8 bits. L'utilité de ce système est de gérer deux fois plus de couleurs, tout en réduisant les besoins en mémoire. En théorie, on pourrait gérer deux fois plus de couleurs en utilisant une palette unique deux fois plus grande, ce qui serait plus flexible. Mais en utilisant une palette deux fois plus grande, on doit ajouter un bit en plus par pixel, pour encoder deux fois plus de couleurs. Avec deux palettes séparées pour les ''sprites'' et l'arrière-plan, pas besoin : le bit est implicite, il vaut 0 pour les ''sprites'' et 1 pour l'arrière-plan. La Master System a deux palettes : une réservée à l'arrière-plan, l'autre servant à la fois pour les ''sprites'' et le décor. Les ''sprites'' ont à disposition 16 couleurs qu'ils peuvent configurer comme ils le souhaitent. La couleur de transparence n'est pas obligatoire. A l'inverse, la palette pour l'arrière-plan dispose de 15 couleurs configurables, et une couleur de transparence fixe. L'arrière-plan a donc à sa disposition 31 couleurs configurables : 16 provenant de la palette des ''sprites'', 15 provenant de l'autre palette, la 32ème couleur fixe étant la couleur de transparence. La NES utilise un système de palette indicé assez complexe pour réduire encore plus le nombre de bits utilisé pour encoder un ''sprite''. Pour simplifier, elle dispose de 4 palettes pour les ''sprites''. Chaque palette gère 4 couleurs chacune, dont l'une est la couleur transparente, ce qui fait 3 couleurs configurables. Chaque ''sprite'' précise quelle palette utiliser avec deux bits de configuration précisés dans le registre associé au ''sprite''. L'avantage est que cela réduit grandement la quantité de mémoire utilisée pour stocker un ''sprite'' : deux bits par pixel du motif, deux pixels pour préciser la palette utilisée pour le ''sprite''. Au total, cela fait maximum 13 couleurs différentes : 3 couleurs fois 4 palettes plus la couleur de transparence. Même principe pour la palette de l'arrière-plan, qui est elle aussi découpée en 4 sous-palettes avec chacune ayant sa propre copie de la couleur de transparence. De rares consoles 8 bits disposent de plus de deux palettes. Par exemple, la PC-Engine a 32 palettes indicées de 16 couleurs chacune. La première palette est toujours consacrée à l'arrière-plan, la dernière est toujours réservée aux ''sprites'', les 30 palettes restantes sont utilisables à volonté par le programmeur. L'avantage est que l'on peut utiliser une palette différente par ''sprite'', au lieu d'avoir une palette indicée partagée par tous les ''sprites''. Mine de rien, trouver un ensemble de couleur partagé par plus d'une dizaine de ''sprite'' est assez compliqué. Les graphismes sont donc plus colorés, sans que cela demande d'utiliser une palette trop large. Et quand on veut modifier la palette à la volée pour un seul ''sprite'', cette implémentation avec des palettes séparées est bien plus simple. Les consoles comme la NES n'avaient que 4 couleurs par ''sprite''. Mais il y avait moyen de contourner ces limitations en superposant plusieurs ''sprites'' de couleurs différentes. Par exemple, on peut simuler un ''sprite'' de 8 couleurs avec deux ''sprites'' de 4 couleurs chacun. Quelques consoles avaient même des fonctionnalités matérielles pour faciliter cette superposition. Par exemple, la MSX 2 fait automatiquement un OU entre deux ''sprites'' superposés. ===Le zoom et la rotation des ''sprites''=== Il a existé des VDC qui pouvaient zoomer sur des ''sprites'', voire les faire tourner. Le ZOOM des sprites permet de faire grossir ou de réduire la taille d'un sprite dynamiquement. L'effet de zoom pouvait servir pour générer des effets de profondeur. Par exemple, quand on veut simuler un personnage qui se rapproche de l'écran en marchant/courant, il suffit de prendre son sprite et de grossir le zoom progressivement pour donner l'illusion d'un personnage qui se rapproche. Idem pour n'importe quel sprite : plus le sprite est loin, plus on en réduit la taille. L'idée est de gérer la taille des sprites en fonction de la profondeur du sprite. L'effet donnait un rendu en pseudo-3D. On parle alors de '''''Sprite Scaling'''''. Les implémentations les plus simples permettaient de faire multiplier les dimensions d'un sprite par 2, 4, 8 fois. En clair, la largeur et la longueur du sprite étaient multipliés par 2, 4, 8, etc. Il y avait possibilité de séparer zoom vertical et horizontal. Quelques VDC ne supportaient que le zoom horizontal, d'autre que en vertical, mais la plupart de ceux qui supportaient le zoom supportaient les deux. [[File:IllustrationOfAPixelReplicationProcess.svg|centre|vignette|upright=2|ZOOM Entier sur un "sprite".]] Les implémentations plus complexes supportaient un zoom plus fluide, avec tous les intermédiaires possibles entre *1 et *X. Pour cela, le sprite devait subir des opérations d'interpolation pour avoir un rendu agréable à l'écran. Pour comprendre ce que cela veut dire : imaginez que vous souhaitez multiplier la taille d'un sprite par X. Pour multiplier par 2, 3, 4 ou tout autre entier, cela demande juste de dupliquer chaque pixel. Mais pour les valeurs fractionnaires, les choses sont plus compliquées. Vous devrez appliquer un filtre pour faire le zoom, filtre qui prend les valeurs des pixels et les mélange pour calculer les pixels finaux. Nous reviendrons sur les filtres possibles dans le chapitre sur le filtrage de texture. Vous avez bien lu : le zoom des sprites n'est pas si différent du filtrage de texture, les algorithmes utilisés pour zoomer sur les sprites et filtrer des textures sont d'ailleurs très similaires, voire identiques. ===L'effet miroir ou ''flipping''=== Une autre possibilité est de faire tourner les sprites. La technique la plus simple est un '''effet de miroir''', à savoir que le sprite est inversé horizontalement, il est tourné dans l'autre sens. Pour vous donner une idée de l'utilité de cette technique, imaginez que vous jouez à Mario : si vous allez à droite, Mario sera tourné vers la droite. Mais si vous allez à gauche, le sprite sera tourné à gauche. Mais il s'agit d'un seul sprite, qui est tourné dans un sens ou l'autre avec un effet de miroir. Il est aussi possible d'inverser le sprite verticalement, pour le retourner. Mais cette possibilité est plus rarement utilisée. La raison est que les rares jeux où cela pourrait être utile sont des jeux en vue de dessus, par exemple les Zelda, les Pokemon, et d'autres jeux dans le genre. Mais ils utilisent souvent un effet de perspective qui fait que la caméra n'est pas placée exactement à la verticale, ce qui fait qu'inverser un sprite verticalement ne respecte pas la perspective. Toutes les consoles 8 bits supportaient l'effet de miroir directement en matériel, celui-ci étant très utile. Une des rares exceptions était la Master System de Sega. Sur cette dernière, le GPU était un VDC TMS9918 de Texas Instrument qui ne gérait pas l'effet miroir. Deux autres consoles utilisaient ce VDC : la colevision et la Sega SG-1000. Elles avaient le même problème. Cependant, il était possible de gérer l'effet miroir en utilisant le CPU. L'avantage de la technique est qu'elle réduit le nombre de ''sprites'' nécessaires, ce qui entraine un gain en mémoire ROM. Les concepteurs peuvent ainsi faire rentrer un jeu sur une cartouche plus facilement, voire peuvent en profiter pour rajouter des ''sprites''. Mais un défaut de cette méthode est que les personnages donnent l'impression d'être ambidextres ! Au passage, sur la Master System, les concepteurs de jeu n'avaient pas d'autre choix que d'utiliser des ''sprites'' séparés pour les personnages/ennemis vus de gauche et vu de droite. Et on peut le remarquer au fait que les ennemis/personnages ne sont pas ambidextres, les artistes ayant souvent pris en compte de détail. <noinclude>Au passage, j'en profite pour vous renvoyer vers ce lien, qui détaille l'utilisation de l'effet de miroir dans plusieurs jeux : * [https://upsilandre.over-blog.com/2019/09/asymetrie-ou-ambidextrie-il-faut-choisir.html ASYMÉTRIE OU AMBIDEXTRIE, IL FAUT CHOISIR], du blog "Upsilandre Retrogaming".</noinclude> ===La rotation des ''sprites''=== La '''rotation des ''sprites''''' regroupe plusieurs techniques diverses, qui vont de simples effets de miroir à des techniques de rotation complexes. L'effet miroir est techniquement une rotation de ''sprite'' particulière, mais ce n'est pas la seule. Les techniques plus évoluées permettent de faire tourner un sprite, pour faire comme si on voyait un objet de biais. Un sprite rectangulaire représente un objet vu soit de profil, soit de face. Mais si on veut donner l'illusion d'un objet faisant un angle différent, il faut modifier la forme du sprite. Le sprite rectangulaire est transformé en trapèze, qui est d'autant moins proche d'un rectangle que l'angle est important. Déformer un sprite rectangulaire en trapèze est un effet de rotation général. Le tout donne un '''effet de perspective'''. [[File:Mode 7 Test-0000.png|centre|vignette|Mode 7, test.]] [[File:Mode 7 process.svg|vignette|upright=1|Mode 7.]] L'implémentation de la perspective est assez simple. Le sprite est une image formée de plusieurs lignes de pixels. L'idée est que la taille des lignes est d'autant plus réduite que la ligne est censée être loin. Les portions proches du sprite seront de taille normale, les autres sont réduites. Mais la technique demande cependant de multiplier la taille de chaque ligne par un coefficient, qui n'est pas forcément entier. Là encore, des algorithmes permettent de lisser les images des sprites pour les mettre à l'échelle. L'algorithme peut faire à la fois la gestion de la perspective et le zoom des sprites, et utiliser des algorithmes proches de ceux du filtrage de textures. Une implémentation complexe est celle du ''mode 7'' de la Super Nintendo. L'implémentation matérielle est paradoxalement assez simple. Mais la comprendre demande de faire la distinction entre les pixels du ''framebuffer'' et les pixels du ''sprite''. Le ''sprite'' est une image qui est composée de pixels. Pour faire la distinction avec les pixels du ''framebuffer'', nous allons appeler les pixels du ''sprite'' des '''texels'''. Terme qui est normalement utilisé pour les textures, mais il y a un lien qui sera fait dans quelques chapitres. Placer le ''sprite'' sur l'arrière-plan demande de prendre les coordonnées de chaque ''texel'' et de faire un calcul qui donne les coordonnées finales x,Y dans le ''framebuffer''. Sans rotation et sans zoom, le calcul est simple : on additionne la position x,y du sprite et la coordonnée du texel dans le sprite. Pour faire tourner les sprites, il faut faire des calculs impliquant des matrices (des objets mathématiques en forme de tableaux de nombre), que je ne détaillerais pas du tout. Pour le dire très rapidement, il faut juste multiplier les coordonnées du texel par une matrice qui encode à la fois la rotation et le zoom, mais aussi le placement au bon endroit sur l'écran (la translation). La matrice est calculée par le processeur, le VDC ne fait que faire la multiplication matricielle. ==L'accélération matérielle du défilement== [[File:Parallax scroll.gif|vignette|Exemple de ''scrolling''.]] Le défilement permet de faire défiler l'environnement sur l'écran, spécialement quand le joueur se déplace. Les jeux de plateforme rétro utilisaient énormément le défilement, le joueur se déplaçait généralement de gauche à droite, ce qui fait que l'on parle de défilement horizontal. Mais il y avait aussi le défilement vertical, utilisé dans d'autres situations. Peu utilisé dans les jeux de plateforme, le défilement vertical est absolument essentiel pour les ''Shoot 'em up'' ! Les cartes accélératrices intégraient souvent des techniques pour accélérer le défilement. La première optimisation est l'usage du ''blitter''. En effet, défiler ne demande pas de régénérer toute l'image à afficher à partir de zéro. L'idéal est de déplacer l'image de quelques pixels vers la gauche, puis de dessiner ce qui manque. Pour cela, on peut utiliser le ''blitter'' pour déplacer l'image dans le ''framebuffer''. L'optimisation est souvent très intéressante, mais elle est imparfaite et n'était pas suffisante sur les toutes premières consoles de jeu. Elle l'était sur les consoles plus récentes, ou disons plutôt : moins rétro. Les consoles moins rétros avaient des mémoires RAM plus rapides, ce qui rendait l'usage du ''blitter'' suffisante. Mais certains VDC implémentaient une forme de défilement accéléré en matériel totalement différent. Les implémentations sont multiples, mais elles ajoutaient toutes des registres de défilement dans le VDC, qui permettaient de défiler facilement l'écran. Il faut noter que l'implémentation du défilement vertical est bien plus simple que pour le défilement horizontal. En effet, les images sont stockées dans le ''framebuffer'' ligne par ligne ! Et le défilement vertical demande de déplacer l'écran d'une ou plusieurs lignes. Les deux vont donc bien ensemble. ===Le défilement vertical implémenté dans le CRTC=== Une technique utilise le fonctionnement d'un CRTC, couplé avec un ''framebuffer'' amélioré. Nous l’appellerons la technique du ''framebuffer'' étendu, terme de mon invention qui aide à comprendre en quoi consiste cette technique. Elle utilise cependant plus de mémoire vidéo qu'un ''framebuffer'' normal. Elle fonctionne très bien pour le défilement vertical, elle demande quelques adaptations pour le défilement horizontal. [[File:Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer.png|vignette|Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer]] La méthode demande d'utiliser un ''framebuffer'' beaucoup plus grand que l'image à afficher. Par exemple, imaginez qu'une console ait une résolution de 640*480, avec des couleurs sur 16 bits. L'image à afficher prend donc 640*480*2 = 600 Kilooctets. Maintenant, imaginez que la mémoire vidéo pour l'arrière-plan fasse 2 mégaoctets. On peut y stocker l’image à rendre, et ce qu'il y a hors de l'écran. Si une scène est assez petite, l'arrière-plan tient entièrement dans la mémoire vidéo, changer l'adresse de base permet de défiler l'écran sur une distance assez longue, voire pour toute la scène. L'idée est de tout simplement dire au CRTC de demander à afficher l'image à partir de la ligne numéro X ! Avec cette technique, il faut faire la différence entre le ''framebuffer'' et le '''''viewport'''''. Le ''viewport'' est la portion du ''framebuffer'' qui mémorise l'image à afficher à l'écran. Le ''framebuffer'', lui, mémorise plus que ce qu'il faut afficher à l'écran, il mémorise quelques lignes en plus, voire un niveau entier ! Le pointeur de ''framebuffer'' et la résolution indiquent la position du ''viewport'' dans le ''framebuffer'', qui monte ou descend en fonction du sens de défilement. Pour la comprendre, prenez le cas où on souhaite défiler d'un pixel, verticalement vers le bas. La première ligne de l'image disparait, une nouvelle apparait en bas de l'image. Cas simple, un peu irréaliste, mais qui permet de bien comprendre l'idée. Pour rappel, un CRTC incorpore deux compteurs de ligne et de colonne, ainsi qu'un registre pour l'adresse de départ de l'image dans le ''framebuffer''. L'idée est que l'adresse de départ de l'image est augmentée de manière à pointer sur la ligne suivante, en l'augmentant de la taille d'une ligne. Il ne reste plus qu'à remplir la ligne suivante, pas besoin de faire la moindre copie en mémoire vidéo ! Et défiler vers le haut demande au contraire de retrancher la taille d'une ligne de l'adresse. On peut généraliser le tout pour du défilement vertical. L'implémentation la plus complexe demande d'ajouter un '''registre de défilement vertical''', dans lequel on place le numéro de ligne à partir de laquelle il faut dessiner l'image. L'image en mémoire vidéo a plus de lignes que l'écran peut en afficher, le CRTC parcourt autant de ligne que ce que demande la résolution, le registre de défilement vertical indique à partir de quelle ligne commencer l'affichage. Le calcul de l'adresse prend en compte le contenu de ce registre pour parcourir le ''framebuffer''. ===Le défilement vertical infini : le ''warp-around'' des adresses=== La technique précédente fonctionne bien, mais elle ne permet pas d'avoir du défilement infini, à savoir avec des maps dont la longueur n'est pas limitée par la mémoire vidéo. Mais on peut l'adapter pour obtenir du défilement vertical, en utilisant un comportement particulier du calcul des adresses. Le comportement en question est le ''warp-around''. Pour le comprendre, prenons l'exemple suivant. La mémoire vidéo peut contenir 1000 lignes, la résolution verticale est de 300 lignes. Si on démarre l'affichage à la 700ème ligne, tout va bien, on n'a pas besoin de ''warp-around''. Mais maintenant, imaginons que le défilement vertical fasse démarrer l'affichage à partir de la 900ème ligne. L'affichage se fera normalement pour 100 lignes, mais la 101ème débordera hors du ''framebuffer'', il n'y aura pas d'adresse associée. Le ''warp-around'' fait repartir les adresses à zéro lors d'un tel débordement. Ainsi, la 101ème adresse sera en fait l'adresse 0, la 102ème sera l'adresse 1, etc. En clair, si on commence à afficher l'image à la 900ème ligne, les 100 premières seront prises dans les 100 lignes à la fin du ''framebuffer'', alors que les 200 suivantes seront les 200 lignes au début du ''framebuffer''. En faisant cela, on peut avoir un défilement vertical infini. Quand l'image affichée est démarrée assez loin, le début du ''framebuffer'' est libre, il contient des lignes qui ne seront sans doute pas affichées par la suite. Dans ce cas, on écrit dedans la suite du niveau, celle située après la ligne à la fin du ''framebuffer''. Il suffit que le programmeur se charge de modifier le ''framebuffer'' de cette manière et on garantit que tout va bien se passer. Avec cette technique, on peut avoir un défilement infini en utilisant seulement deux fois plus de mémoire vidéo que ce qui est nécessaire pour stocker une image à l'écran. Il est même possible de tricher pour utiliser moins de mémoire vidéo. Mais laissons cela de côté, tout cela est laissé à l’appréciation du programmeur. ===Le défilement horizontal et vertical implémenté par le CRTC=== Pour le défilement horizontal, il faut procéder de la même manière, mais en trichant un peu. Là encore, il y a une différence entre ''viewport'' et ''framebuffer'', et les deux n'ont pas la même résolution. Mais cette fois-ci, outre la résolution verticale qui est plus grande, la résolution horizontale l'est aussi. Par exemple, si je prends la console de jeux NES, elle a une résolution pour l'écran de 256 par 240, alors que l'arrière-plan a une résolution de 512 par 480. L'implémentation utilise des compteurs de ligne et de colonne séparés. L'idée est d'avoir des lignes plus longues dans le ''framebuffer'' que ce qui est indiqué dans le registre de résolution. On peut alors mémoriser une ligne plus longue que ce qui est affiché à l'écran, avec des portions non-affichées à l'écran. L'idée est là encore d'initialiser le compteur de colonne avec une valeur qui est incrémentée d'un pixel à chaque fois qu'on défile vers la droite, décrémentée quand on va vers la gauche. Le registre pour la résolution horizontale, qui vérifie si la fin de la ligne/colonne est atteinte, est lui aussi incrémenté. La même méthode peut être utilisée pour le défilement horizontal en faisant la même chose pour le compteur de ligne. L'implémentation demande d'ajouter un registre de défilement horizontal, en plus du registre de défilement vertical, le principe derrière est le même mais pour le numéro de colonne et non de ligne. [[File:Implémentation du défilement horizontal avec in viewport.png|centre|vignette|upright=2|Implémentation du défilement horizontal avec in viewport]] Notons que le comportement de ''warp-around'' peut aussi être implémenté pour les adresses et compteurs de colonne. Cela permet d'avoir du défilement horizontal infini. La fonctionnalité était disponible sur les cartes EGA, les toutes premières cartes d'affichage datant d'avant même le standard VGA. Tout était en place sur ces cartes graphiques pour implémenter la technique : une mémoire vidéo assez grande, un ''framebuffer'' potentiellement plus grand que ce qui est affiché à l'écran, une adresse de départ qu'on peut incrémenter ligne par ligne, par incréments de 1 pixel. Le logiciel devait cependant utiliser cette faculté adéquatement pour implémenter le défilement. Malheureusement, le BIOS des cartes VGA n'implémentait pas les optimisations du défilement, et les programmeurs devaient tout coder à la main dans leurs applications pour les utiliser. ==Les ''raster effects'' : défilement partiel et ''sprites'' supplémentaires== Les '''''raster effects''''' sont des effets graphiques qui sont implémentés en modifiant le VDC pendant l'affichage de l'image. Par exemple, il est possible de changer la couleur de l'arrière-plan à partir d'une certaine ligne, afin de séparer le ciel du sol. Un exemple classique est celui qui permet de contourner le nombre maximal de ''sprites'' à l'écran. ===La limite de ''sprites'' par écran=== Un VDC normal ne peut gérer qu'un nombre maximal de ''sprites'' par image/écran. Mais grâce aux ''raster effects'', il est possible de dépasser cette limite, en changeant les ''sprites'' à la volée, pendant que l'image s'affiche. Par exemple, les ''sprites'' déjà affichés sont recyclés et remplacés par d'autres ''sprites''. Leur coordonnée passe d'une portion affichée de l'image (typiquement en haut de l'écran) à une portion pas encore affichée (typiquement plus bas). En faisant cela, on peut afficher plus de ''sprites'' que ce que gére le VDC. Par contre, on ne peut pas dépasser la limite de ''sprite'' par ''scanline''. Par exemple, si un VDC gère maximum 64 ''sprites'' par imaeg et 8 ''sprites'' par ligne, la première limite est facilement contournée via les ''raster effects'', mais pas la seconde. Autant changer des ''sprites'' entre l'affichage de deux lignes est possible, autant le faire pendant l'affichage d'une ligne ne l'est pas. En effet, le VDC n'est souvent pas reconfigurable par le processeur pendant l'affichage d'une ligne. Il l'est entre l'affichage de deux lignes, pas pendant. ===Le défilement partiel=== De nombreux effets graphiques demandent de ne faire défiler qu'une partie de l'écran, le reste de l'écran reste en place. Dans ce cas, nous parlerons de '''défilement partiel''', le terme partiel indiquant qu'il ne touche qu'une portion de l'image. De tels effets sont généralement implémentés avec des ''raster effect'', mais il faut que le matériel le supporte pleinement. Pour donner un exemple, prenez les phases d’ascenseur dans les jeux de type ''beat'them up'', où votre personnage est sur une plateforme qui monte/descend, les ennemis arrivant dessus par vagues successives. Dans ce cas, la plateforme est immobile et le reste de l'image défile verticalement vers le haut (ascenseur descend) ou vers le bas (ascenseur monte). Un cas particulier de défilement partiel est celui utilisé pour le HUD : les compteurs de vie, score, et autres. Il arrive que le HUD soit dessiné avec des ''sprites'', mais ce n'est pas la majorité des cas. En réalité, le HUD est placé dans l'arrière-plan directement. Et il ne doit pas être défilé, pour rester en place. par exemple, si le HUD est placé au sommet de l'écran, il doit y rester et ne pas subir de défilement vertical ou horizontal. D'autres effets demandent de changer le défilement ligne par ligne : des effets de vagues, d'ondulation, ou autre. Par exemple, c'est ce qui permet de créer des virages sur les jeux de course ! Il n'y a qu'une seule image de route en ligne droite, qu'on décale à chaque ligne pour simuler un virage ! D'autres effets demandent un défilement partiel à la verticale. Il a été utilisé pour le HUD, les Boss de grande taille de certains jeux, des effets d'eau qui monte et bien d'autres encore. Voici un article qui explique le tout en détail : * [https://upsilandre.over-blog.com/2019/07/les-arcanes-du-scrolling-vertical.html LES ARCANES DU SCROLLING VERTICAL SUR NES] Un problème est que le défilement doit être reconfigurable lors de l'affichage de l'image. La quasi-totalité des consoles permettait cela, avec cependant quelques exceptions. Par exemple, la Master System permettait de changer les ''sprites'' à la volée, idem pour le défilement horizontal, mais ne permettait pas de changer le défilement vertical pendant l'affichage d'une image. Sur Master System, le registre de défilement vertical était pris en compte uniquement au début de l'affichage, le modifier en cours d'affichage n'avait pas le moindre effet sur l'affichage. On parle alors de '''''Vlock'''''. Il était possible de contourner le problème avec des solutions logicielles, avec un cout en performance et quelques limitations quant au résultat. ===L'implémentation des ''raster effects''=== Les VDC étaient souvent conçus avec les ''raster effects'' en tête. Ils supportent souvent des fonctionnalités qui facilitent l'implémentation des ''raster effects'' : compteurs de ligne, interruptions horizontales, et autres que nous allons voir dans ce qui suit. En théorie, les ''raster effects'' peuvent se faire même si le VDC ne supporte pas ces fonctionnalités. Mais cela demande de synchroniser le processeur et le VDC au cycle près, ou presque. Les programmeurs de l'Atari 2600 faisaient ainsi, mais il faut avouer que ce n'était pas pratique. La première fonctionnalité est le '''compteur de ligne'''. Le nom est assez transparent : il s'agit d'un registre qui contient le numéro de la dernière ligne affichée. Par exemple, si le VDC a affiché la 20ème ligne et se prépare à afficher la 21ème, alors ce compteur contient le numéro 20. Le compteur de ligne permet au processeur/logiciel de savoir où il en est lors de l'affichage de l'écran. Il peut regarder régulièrement ce compteur et changer le défilement et/ou les ''sprites'' quand un certain numéro apparait dans ce compteur de ligne. Le compteur de ligne en question existe déjà dans la plupart des VDC, vu qu'il s'agit de celui vu dans les chapitres précédents, qui sert pour l'adressage de la mémoire vidéo et quelques autres fonctionnalités. Mais il n'est pas forcément accesible par le processeur. Les VDC anciens ont un compteur de ligne interne, qui n'est accesible que par les circuits du VDC, mais le processeur n'y a pas accès. La fonctionnalité dont on parle ici rend ce registre visible par le processeur, un peu comme l'est le registre d'état. Une seconde fonctionnalité, très liée au compteur de ligne, est l''''''horizontal blank interrupt''''', une cousine de l'interruption de ''vertical blank interrupt'' qui indique qu'une image complète a été affichée à l'écran. L'''horizontal blank interrupt'' fait la même chose, mais au niveau des lignes et d'une manière configurable. L'idée est que l'on peut demander au VDC de déclencher une interruption quand il atteint la ligne numéro X, par exemple quand il a fini d'afficher la 20ème ligne, la 50ème, etc. Le programmeur peut précise à quelle ligne se déclenche l'interruption. Pour le dire autrement, cette interruption se déclenche quand le compteur de ligne atteint une valeur bien précise, configurable par le programmeur. Prenons l'exemple où programmeur veut afficher un HUD de 30 pixels de hauteur au-dessus d'un arrière-plan qui défile horizontalement. L'image ne défile pas initialement et le jeu affiche d'abord le HUD. Mais le programmeur a configuré l'interruption pour se déclencher à la 30ème ligne. L'interruption réactive le défilement de l'arrière-plan et change l'affichage pour basculer du HUD vers l'arrière-plan. Une autre fonctionnalité, spécifique à la SNES, est le '''HDMA''', une amélioration de la fonctionnalité DMA (''Direct Memory Access''). Le DMA normal permet de faire des copies de la RAM vers la RAM, parfois de la RAM vers la mémoire vidéo (et inversement). Le '''HDMA''' de la SNES étend le comportement du DMA. Elle permet de faire copies RAM -> VDC, pour reconfigurer le VDC. De plus, les copies sont programmées à l'avance, elles ne se font pas en réaction à une interruption de ''blanking'' horizontal. Précisément, le VDC est reconfiguré à chaque période de ''blanking'' horizontal, entre l'affichage de deux lignes. Pour cela, le processeur prépare une table HDMA qui précise comment configurer le VDC pour chaque ligne à l'écran. Pour simplifier, la table HDMA contient des entrées, chacune correspondant à une ligne de l'écran, qui indique quoi envoyer dans les registres de configuration du VDC. Le VDC lit les entrées de la première à la dernière, ligne par ligne. Le fonctionnement réel est un peu plus complexe. La table permet de conserver la même configuration pour N lignes consécutives, N allant de 1 à 128. Quand le VDC voit une de ces entrées, les données de configuration sont recopiées à l'identique pour N lignes consécutives. ==L'usage de plusieurs arrière-plans et d'avant-plans== Une carte graphique 2D basique gére un arrière-plan et un avant-plan contenant plusieurs ''sprites'', avec éventuellement un avant-plan pour le HUD ou une interface sur laquelle afficher les vies, et d'autres informations. En tout, cela fait trois plans aux usages bien précis. Mais il est possible d'ajouter plusieurs arrière-plans, voir plusieurs avant-plans. L'utilité n'est pas évidente, mais cela sert pour de nombreux effets graphiques. Voyons lesquels. ===Les décors à l'avant-plan=== Il faut noter que les cartes graphiques peuvent aussi gérer des avant-plans, à savoir des décors qui passent devant les ''sprites''. Une forme d'avant-plan très utile est celui pour le HUD, les compteurs de vie, mana, munitions et autres. Implémenter un HUD avec du défilement est compliqué, car le HUD ne doit pas défiler : il doit rester à la même place sur l'écran, alors que le reste de l'écran défile. Il faut noter que les avant-plans ne sont pas forcément séparés des arrière-plans. La seule différence entre les deux est la profondeur ! Et précisément la profondeur comparée à la couche pour les ''sprites''. Plus profond que les ''sprites'' : c'est un arrière-plan. Moins profond, c'est un avant-plan. Les cartes graphiques gèrent souvent des "couches" (''layers'') qui se superposent, avec une couche spécialisée pour les ''sprites'', et d'autres couches qu'on peut configurer à volonté comme arrière- ou avant-plan. Les avant-plans sont aussi utilisés dans quelques jeux pour un effet purement esthétique, pour mettre un décor ou des objets devant les ''sprites''. De plus, ils sont occasionnellement nécessaires pour rendre certains effets graphiques, ou pour ajouter de la profondeur à une scène. Les avant-plans défilent à une vitesse différente des arrière-plans, sans quoi le résultat est absolument affreux. Aussi, l'usage d'avant-plans est très fortement corrélé à l'usage du défilement à parallaxe qu'on va voir dans ce qui suit. ===Le défilement horizontal à parallaxe=== [[File:Parallax-scroll-example-2.png|vignette|Défilement avec parallaxe.]] [[File:Parallax-scroll-example.gif|vignette|Défilement avec parallaxe : illustration des plans.]] Le '''défilement à parallaxe''' donne une illusion de profondeur dans l'environnement? Pour cela, il utilise plusieurs arrière-plans superposés qui défilent à des vitesses différentes. Le défilement à parallaxe demande que les éléments à l'arrière-plan bougent à des vitesses différentes, mais pas les sprites à l'avant-plan. Le défilement sans parallaxe fait bouger le ''framebuffer'' en bloc, ce qui fait bouger tout l'arrière-plan tout d'un coup. Pour implémenter la technique, il est possible d'utiliser un défilement partiel basé sur des ''raster effects''. L'idée est de changer le défilement horizontal ou vertical pendant l'affichage. En général, l'écran est découpé en bandes qui défilent à des vitesses différentes, pour donner des effets parallaxe, parfois des effets de rouleau (le sol forme un tore) ou d'autres effets graphiques. Une autre solution utilise des arrière-plans partiellement transparents qui se superposent. Les différents arrière-plans ont chacun une profondeur qui dit quel arrière-plan passe devant les autres. Il s'agit de l'implémentation la plus simple, mais elle demande que la carte graphique gère la transparence. Ce n'est cependant pas la seule option et quelques consoles de jeu se débrouillaient pour mélanger plusieurs arrière-plans sans pour autant gérer directement la transparence. Mais nous verrons cela plus tard. ===L'émulation de la transparence, des ombres et lumières=== L'usage de plusieurs arrière-plans marche bien si la carte graphique gère la transparence. C’est-à-dire que chaque pixel indique s'il est totalement opaque, totalement transparent, ou partiellement opaque. En faisant cela, déterminer quel pixel afficher est simple : on prend en compte la profondeur de chaque arrière-plan, et on détermine quel est le premier pixel visible. Par un exemple, si un pixel transparent est situé devant un pixel opaque, c'est ce dernier qui s'affiche. Pour les pixels partiellement transparents, il faut mélanger les couleurs des pixels en faisant une simple moyenne. Mais cela implique que la carte graphique gère la transparence, que chaque pixel contienne une couleur alpha qui indique son niveau de transparence, couleur ajoutée aux couleurs RGB existantes. Des consoles comme la SNES utilisaient un système totalement différent. Elles utilisaient des arrière-plans dont les pixels étaient codés en RGB, sans composante de transparence alpha. Mais elles arrivaient à combiner plusieurs arrière-plans entre eux sans problèmes. Les arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. La combinaison pouvait utiliser plusieurs opérations, qui étaient appliquées pixel par pixel. Les opérations de combinaison sont : l'addition, la soustraction, la moyenne additive, et une soustraction suivie d'une division par deux. Pour résumer, on peut additionner/soustraire des pixels à la même place dans les différents arrière-plans, puis éventuellement diviser par deux le résultat. Précisons que les additions/soustractions sont dites saturées : elles n'ont pas de débordements d'entiers. Les différentes opérations permettaient surtout d'implémenter des effets d'éclairage, d'ombrage, de transparence, voire de masquage (n'afficher qu'une partie de l'écran). L'addition ne peut qu'augmenter la couleur du pixel final, en augmenter la luminosité, ce qui la rend idéale pour appliquer des effets de lumière. À l'inverse, la soustraction ne peut que réduire la couleur finale d'un pixel, ce qui permet d'appliquer des ombres. La moyenne mélange deux pixels entre eux, qui sont à la même place à l'écran, mais n'ont pas la même profondeur, vu qu'ils sont dans des arrière-plans différents. En clair, elle applique des effets de transparences assez limités. Les pixels de deux arrière-plans sont mélangés avec une proportion fixe de 50-50. Ce qui permet d'appliquer des effets de transparence très limités. Avec l'addition, il suffit de calculer les lumières à appliquer dans un arrière-plan, qui est additionné avec le reste de l'image. Pour appliquer des ombres, il faut faire la même chose mais avec la soustraction. Les ombres sont calculées dans un arrière-plan à part, qui est soustrait du résultat du reste. Pour être plus précis, l'arrière-plan contenait une image d'ombrage, qui indique quelles sont les parties de l'image dans l'ombre et l'intensité de l'ombre pour chaque pixel. Plus un pixel est dans l'ombre, plus sa couleur est proche du blanc (en RGB) : la palette de couleur est inversée. En soustrayant cette seconde image d'ombrage à l'image du ''framebuffer'' principal, on ombre les pixels. Il faut noter que certaines consoles, comme la NES, permettaient en plus d'additionner une couleur fixe pour tous les pixels de l'écran, voire de la soustraire, voire de soustraire le pixel à cette couleur fixe. Cela permettait de biaiser les couleurs de base avec une couleur de base. Là encore, l'utilité était une question d'ombrage, d'éclairage, de transparence, ou autre. Cela permettait d'affiner les couleurs finales. La couleur de base était mémorisée dans un registre. Notons que le registre pouvait être changé entre l'affichage de deux lignes, via des ''raster interrupts'', ce qui permettait d'appliquer des dégradés de lumière verticaux, d'appliquer un effet d'horizon, d'ajouter du brouillard de distance. ===L'implémentation matérielle et le cas particulier de la SNES=== Utiliser plusieurs arrière-plans demande que le matériel soit adapté. Il faut typiquement ajouter de quoi gérer et mémoriser plusieurs arrière-plans et ajouter des circuits pour les combiner entre eux. Le hardware pour faire cette combinaison détermine quel pixel passe devant les autres, il peut gérer de la transparence, etc. Les ''sprites'' sont souvent gérés par un système de ''sprite'' matériel, ce qui fait que le défilement n'est pas tellement un problème pour eux. Les arrières/avant-plans sont typiquement dans des mémoires séparées afin de faciliter la gestion du défilement . Avec plusieurs mémoires, la technique précédente (le ''framebuffer'' étendu et un viewport rectangulaire) peut s'appliquer à chaque arrière-plan. Et on peut les faire défiler à des vitesses différentes. Il est aussi possible d'utiliser une seule mémoire pour cela, qui mémorise plusieurs arrière-plans, c'est tout à fait possible. La console de jeu SNES gérait 4 arrière-plans différents, mais elle n'utilisait pas plusieurs mémoires. Les 4 arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. Il était possible d'activer ou de désactiver les arrière-plans si besoin. Il était par exemple possible de n'utiliser que 2 arrière-plans, ou 3 arrière-plans dont un soustrait de l'addition des deux autres, etc. Elle disposait de plusieurs modes, appelés mode 1, mode 2, ..., mode 7. Le mode 7 est un mode de rendu avec un seul arrière-plan, mais où les techniques des sections précédentes sont utilisables. Les optimisations pour le défilement horizontal et vertical sont présentes, et le ''viewport'' peut même être déformé, tourné, etc. Il peut utiliser un second arrière-plan très particulier, dérivé du premier. Il utilise les mêmes tiles, avec cependant la possibilité de se retrouver devant les ''sprites'' ou les autres arrière-plans. Il était utilisé pour gérer des tunnels vus de dessus, ou pour quelques effets graphiques où des élèments de décor se retrouvaient à l'avant-plan. {|class="wikitable" |- ! Mode vidéo ! BG 1 ! BG 2 ! BG 3 ! BG 4 |- ! 0 | 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) |- ! 1 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || 4 couleurs (2 bits) || |- ! 2 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || || |- ! 3 | 256 couleurs (8 bits) || 16 couleurs (4 bits) || || |- ! 4 | 256 couleurs (8 bits) || 4 couleurs (2 bits) || || |- ! 5 | 16 couleurs (4 bits) || 4 couleurs (2 bits) || || |- ! 6 | 16 couleurs (4 bits) || || || |- ! 7 | 256 couleurs (8 bits) || EXTBG || || |} ==L'accélération matérielle du tracé de ligne et de figures géométriques== [[File:Bresenham.svg|vignette|Tracé d'une ligne sur un écran.]] La dernière optimisation du rendu 2D est le '''tracé de lignes et de figures géométriques''' accéléré en matériel. Quelques VDC incorporent cette optimisation, dont le nom est assez clair sur ce qu'elle fait. Tracer une ligne, un segment, est l'opération la plus courante sur de tels VDC, le tracé de cercles est déjà plus rare. Tracer des polygones est entre les deux, : plus rare que le tracé de ligne pur, moins que le tracé de cercles. ===Les circuits de tracé de ligne=== L'algorithme le plus utilisé par le matériel pour tracer des lignes est l''''algorithme de Bresenham'''. Il est très simple et s'implémente très facilement dans un circuit électronique. Il fut dit que cet algorithme utilise seulement des additions, des soustractions et des décalages, opérations très simples à implémenter en hardware. Il est de plus un des tout premiers algorithmes découvert dans le domaine du graphisme sur ordinateur. Il existe de nombreuses modifications de cet algorithme, qui vont de mineures à assez profondes. Et certaines d'entre elles sont plus faciles à implémenter en hardware que d'autres. [[File:Bresenham line.png|vignette|Coordonnées du pixel de départ et d'arrivée.]] [[File:LineBresenham.gif|vignette|Tracé d'une ligne sur un écran, pixel par pixel.]] Le fonctionnement du circuit de tracé de ligne est le suivant. Premièrement, on précise le pixel de départ et le pixel d'arrivée en configurant des registres à l'intérieur du circuit, avec une paire de registre pour les coordonnées du pixel de départ, une autre parie pour les coordonnées du pixel d'arrivée. Le circuit dessine la ligne pixel par pixel, avec un pixel dessiné par cycle d'horloge. ===Le tracé de figures géométriques=== Passons maintenant au tracé de figures géométrique. Le tracé se fait là encore pixel par pixel, sur le principe. Généralement, le tracé est limité à des figures géométriques simples, que vous avez tous vu quand vous étiez au collège, en cours de maths. Tracer des carrés/rectangles/pentagones/trapèzes ou autres polygone est très simple : il suffit de tracer plusieurs lignes les unes à la suite des autres. La vraie utilité est l'implémentation de courbes, comme des cercles, des ellipses, ou autres. L'algorithme de Bressenham peut être modifié pour implémenter des cercles, ce qui donne le '''''Midpoint circle algorithm'''''. D'autres extensions permettent de dessiner des ellipses, et même des courbes plus complexes comme des courbes de Bezier ou d'autres courbes assez complexes à expliquer. ===Le tracé et le remplissage de figures géométriques par le ''blitter''=== Outre le tracé des figures géométriques, il est aussi possible de gérer en hardware les opérations de '''remplissage'''. Cela veut dire dessiner l'intérieur d'une figure géométrique, comme remplir un carré ou un rectangle, avec une couleur uniforme. Par exemple : dessiner un carré en rouge, remplir un rectangle existant de bleu clair, etc. Le remplissage est souvent disponible pour certaines formes géométriques simples, comme des carrés ou rectangles, rarement plus. Pour le remplissage des triangles ou d'autres figures géométriques, le support matériel est encore plus rare, ne parlons même pas des cercles. Le remplissage de rectangles est souvent réalisé par le ''blitter''. Pour faire une comparaison, la méthode utilisée est globalement la même que celle utilisée pour lire le ''viewport'' dans le ''framebuffer'', mais cette fois-ci réalisé par le ''blitter''. Le ''viewport'' est remplacé par le rectangle à remplir, et la lecture du pixel à envoyer à l'écran est remplacée par l'écriture d'une couleur précisée dans un registre. Pour cela, on précise la couleur, la coordonnée X,Y et la largeur et la hauteur du rectangle dans des registres dédiés. Le remplissage commence à la coordonnée X,Y. L'adresse mémoire est alors incrémentée jusqu'à ce que la largeur voulue soit atteinte. On incrémente alors le compteur de ligne pour passer à la suivante, le compteur de colonne est réinitialisé avec la coordonnée X de la première colonne. Le remplissage s’arrête une fois que la hauteur voulue est atteinte. Un exemple est le ''blitter'' des anciennes consoles Amiga, qui gère nativement des blocs en forme de rectangles, et de trapèzes dessinés à l'horizontale. Ils sont remplis en fournissant plusieurs informations : la position de leur premier pixel, une largeur qui est un multiple de 16 bits, une hauteur mesurée en nombre de lignes, un décalage qui indique de combien de pixels sont décalées deux lignes consécutives. Le décalage est ajouté une fois le compteur de colonne réinitialisé à sa valeur précédente (au démarrage de la ligne précédente). {{NavChapitre | book=Les cartes graphiques | prev=Les systèmes à framebuffer | prevText=Les systèmes à framebuffer | next=Le mode texte et le rendu en tiles | nextText=Le mode texte et le rendu en tiles }} {{autocat}} mcb6ay2fi50rdiqw3dmzf7ceqtcuowo 764904 764903 2026-04-24T18:03:17Z Mewtow 31375 /* L'accélération matérielle du tracé de ligne et de figures géométriques */ 764904 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu les CRTC. Il est maintenant temps de voir les '''''Video Interface Controlers''''', des VDC qui gèrent des fonctionnalités de rendu 2D avancées, voire plus. Avec l'arrivée des interfaces graphiques (celles des systèmes d'exploitation, notamment) et des jeux vidéo 2D, les cartes graphiques ont pu s'adapter. Les cartes graphiques 2D ont d'abord commencé par accélérer le tracé et coloriage de figures géométriques simples, tels les lignes, segments, cercles et ellipses, afin d’accélérer les premières interfaces graphiques. Par la suite, diverses techniques d'accélération de rendu 2D se sont fait jour. La base d'un rendu en 2D est de superposer des images 2D pré-calculées les unes au-dessus des autres. Par exemple, on peut avoir une image pour l’arrière-plan (le décor), une image pour le monstre qui vous fonce dessus, une image pour le dessin de votre personnage, etc. On distingue généralement l'image pour l'arrière-plan, qui prend tout l'écran, des images plus petites qu'on superpose dessus et qui sont appelées des '''sprites'''. Le rendu des ''sprites'' doit s'effectuer de l'image la plus profonde (l'arrière-plan), vers les plus proches (les ''sprites'' qui se superposent sur les autres) : on parle d''''algorithme du peintre'''. [[File:Painter's algorithm.svg|centre|vignette|upright=2.0|Exemple de rendu 2D utilisant l'algorithme du peintre.]] Il existe plusieurs techniques d'accélération graphique pour le rendu en 2D : * L'accélération des copies dans la mémoire vidéo grâce à un circuit dédié. Elle aide à implémenter de manière rapide le défilement ou les ''sprites'', ou encore le tracé de certaines figures géométriques. Mais elle est moins performante que les trois suivantes, bien qu'elle lui soit complémentaire. * L'accélération matérielle des ''sprites'', où les ''sprites'' sont stockés dans des registres dédiés et où la carte graphique les gère séparément de l'arrière-plan. * L'accélération matérielle du défilement, une opération très couteuse. * L'accélération matérielle du tracé de lignes/segments/figures géométriques simples. Les quatre techniques ne sont pas exclusives, mais complémentaires. Elles ne sont pas utiles que pour les jeux vidéo, mais peuvent aussi servir à accélérer le rendu d'une interface graphique. Après tout, les lettres, les fenêtres d'une application ou le curseur de souris sont techniquement du rendu 2D. C'est ainsi que les cartes graphiques actuelles supportent des techniques d’accélération du rendu des polices d'écriture, une accélération du défilement ou encore un support matériel du curseur de la souris, toutes dérivées des techniques d'accélération de rendu 2D. ==Le circuit de ''Blitter'' : les copies en mémoire== Les cartes 2D ont introduit un circuit pour accélérer les copies d'images en mémoire, appelé le '''blitter'''. Les copies de données en mémoire vidéo sont nécessaires pour ajouter les ''sprites'' sur l'arrière-plan, mais aussi lorsqu'un objet 2D se déplace sur l'écran. Déplacer une fenêtre sur votre bureau est un bon exemple : le contenu de ce qui était présent sur l'écran doit être déplacé vers le haut ou vers le bas. Dans la mémoire vidéo, cela correspond à une copie des pixels correspondant de leur ancienne position vers la nouvelle. Sans ''blitter'', les copies étaient donc à la charge du processeur, qui devait déplacer lui-même les données en mémoire. Le ''blitter'' est conçu pour ce genre de tâches, sauf qu'il n'utilise pas le processeur. Pour ceux qui ont quelques connaissances avancées en architecture des ordinateurs, on peut le voir comme une sorte de contrôleur DMA amélioré. D'ailleurs, il est souvent combiné à un contrôleur DMA, voire fusionné avec lui. Il pouvait non seulement faire des copies, mais aussi appliquer des opérations bit à bit sur les données copiées. ===La superposition des ''sprites'' sur l'arrière-plan=== Les cartes 2D sans ''sprites'' matériels effectuent leur rendu en deux étapes : elles copient l'image d'arrière-plan dans le ''framebuffer'', puis chaque ''sprite'' est copié à la bonne place en mémoire pour le placer au bon endroit sur l'écran. Les copies de ''sprites'' sont généralement prises en charge par le ''blitter'', qui est spécialement optimisé pour cela. L'optimisation principale est le fait que le ''blitter'' peut effectuer une opération bit à bit entre les données à copier et une donnée fournie par le programmeur appelé un masque. Pour voir à quoi cela peut servir, rappelons que les ''sprites'' sont souvent des images rectangulaires sans transparence ! Le sans transparence est très important pour ce qui va suivre. Idéalement, les ''sprites'' devraient contenir des zones transparentes pour laisser la place à l'arrière-plan, mais le hardware ne gère pas forcément des pixels transparents à l'intérieur des ''sprites''. La transparence peut s'émuler facilement en utilisant un '''masque''', une donnée qui indique quelles parties de l'image sont censées être transparentes. Par exemple, prenons l'image ci-dessous à gauche et son masque à droite. Les parties blanches du masque sont censées être transparentes et ne pas être copiées au-dessus de l'arrière-plan, il ne faut le faire que pour les pixels noirs. Le masque indique quels pixels sont à copier ou non, ce qui demande simplement 1 bit par pixel. Le pixel est associé dans le masque à une couleur noire ou blanche, pas de niveaux de gris permis. {| |[[File:Pacman--------2.gif|vignette|Image de Pacman.]] |[[File:Pacman mask.gif|vignette|Masque de Pacman.]] |} Le ''blitter'' combine le ''sprite'', l'arrière-plan et le masque. Pour chaque pixel, il effectue l'opération suivante : ((arrière-plan) AND (masque)) OR (image de pacman). [[File:Sprite rendering by binary image mask.png|centre|vignette|upright=2|Sprite rendering by binary image mask]] Imaginons qu'on veut placer l'image ci-dessus (le point vert), en plusieurs endroits de l'arrière-plan. [[File:XBlit dot.png|centre|vignette|upright=3|Image et masque.]] L'application d'un ET logique entre masque et arrière-plan met à zéro les pixels modifiés par le ''sprite'' et uniquement ceux-ci, ils sont mis à la couleur noire. Le OU copie le ''sprite'' dans le vide laissé, les parties noires sont ignorées. Au final, l'image finale est bel et bien celle qu'on attend. {| |[[File:Blit back.png|vignette|upright=3|Arrière-plan de l'exemple.]] |[[File:XBlit and.png|vignette|upright=3|Application du masque - ET.]] |[[File:XBlit final.png|vignette|upright=3|Application des ''sprites'' - OU.]] |} ==Les ''sprites'' matériels== Il existe des cartes 2D sur lesquelles les ''sprites'' sont gérés directement en matériel, sans passer par un ''blitter'', sans être copiés sur un arrière-plan préexistant. À la place, l'image est rendue pixel par pixel, à la volée. La carte graphique décide, à chaque envoi de pixel, s'il faut afficher les pixels de l’arrière-plan ou du ''sprite'' pendant l'accès au ''framebuffer'' par le CRTC. Il faut noter que les ''sprites'' matériel ont une taille assez petite. Ils sont typiquement des carrés de 8 pixels de côté, rarement plus. Par contre, les ''sprites'' utilisés dans les jeux vidéos sont souvent plus grands, certains font 16 pixels de côtés, parfois plus. Aussi, les ''sprites'' d'un jeu vidéo sont parfois composés de plusieurs ''sprites'' matériels placés les uns à côté des autres. Par exemple, un ''sprite'' de 16 pixels de hauteur et de 8 pixels de largeur est composé de deux ''sprites'' 8 par 8, placés l'un au-dessus de l'autre. Le support des ''sprites'' est parfois utilisé dans un cadre particulièrement spécialisé : la prise en charge du curseur de la souris, ou le rendu de certaines polices d'écritures ! Le curseur de souris est alors traité comme un ''sprite'' spécialisé, surimposé au-dessus de tout le reste. Les cartes graphiques modernes gèrent un ou plusieurs ''sprites'', qui représentent chacun un curseur de souris, et deux registres pour respectivement les coordonnées x et y du curseur. Ainsi, pas besoin de redessiner l'image à envoyer à l'écran à chaque fois que l'on bouge la souris : il suffit de modifier le contenu des deux registres, la carte graphique place le curseur sur l'écran automatiquement. Pour en avoir la preuve, testez une nouvelle machine sur laquelle les drivers ne sont pas installés, et bougez le curseur : ''lag'' garantit ! ===Les circuits d'accélération matérielle des ''sprites''=== Sur ces cartes 2D, les ''sprites'' sont stockés dans des registres, alors que l'image d'arrière-plan est stockée dans un ''framebuffer'', dans une mémoire RAM. La RAM pour l'arrière-plan est généralement assez grosse, car l'arrière-plan a la même résolution que l'écran. Pour les ''sprites'', la mémoire est généralement très petite, ce qui fait que les ''sprites'' ont une taille limitée. Pour chaque ''sprite'', on trouve deux registres permettant de mémoriser la position du sprite à l'écran : un pour sa coordonnée X, un autre pour sa coordonnée Y. Lorsque le CRTC demande à afficher le pixel à la position (X , Y), chaque triplet de registres de position est comparé à la position X,Y fournie par le CRTC. Si aucun ''sprite'' ne correspond, les mémoires des sprites sont déconnectées du bus et le pixel affiché est celui de l'arrière-plan. Dans le cas contraire, la RAM du ''sprite'' est connectée sur le bus et son contenu est envoyé au RAMDAC. [[File:Hardware sprites.png|centre|vignette|upright=2.0|Sprites matériels.]] Les ''sprites'' allaient presque toujours de pair avec une gestion de la transparence. Dans le cas le plus simple, la transparence permet de ne pas afficher certaines portions d'un ''sprite''. Certains pixels d'un ''sprite'' sont marqués comme transparents, et à ces endroits, c'est l'arrière-plan qui doit s'afficher. Cela permet d'afficher des personnages ou objets complexes alors que l'image du ''sprite'' est rectangulaire. Cette gestion basique de la transparence ne permet pas de gérer des effets trop complexe, où on mélange la couleur du ''sprite'' avec celle de l'arrière-plan. Les VDC avaient des limitations en termes de ''sprites'' matériels supportés. Notamment, ils géraient un nombre maximal de ''sprites'' par image. Cette limitation par image était secondée par une limitation du nombre de ''sprites'' par ligne. Par exemple, la NES et la Master Sytem géraient 64 ''sprites'' par image, avec maximum 8 ''sprites'' par ligne. Cependant, ces limitations pouvaient être contournées par l'usage de ''raster interrupts'', et précisément l'''horizontal blank interrupt'' qui précise quand l'affichage d'une ligne précise est terminée. L'idée est de changer les ''sprites'' d'une image et de les repositionner, pendant le tracé de l'image, entre l'affichage de deux lignes. Les ''sprites'' qui ont déjà été affichés en haut de l'écran sont remplacés par des ''sprites'' à afficher plus bas. Les programmeurs utilisaient ce genre de ruses pour afficher plus de ''sprites'' à l'écran que ne peut en supporter la console. Les cartes 2D les plus simples ne géraient que deux niveaux : soit l'arrière-plan, soit un ''sprite'' devant l'arrière-plan. Il n'est donc pas possible que deux ''sprites'' se superposent, partiellement ou totalement. Dans ce cas, l'image n'a que deux niveaux de profondeur. C'était le cas sur les consoles de seconde et troisième génération, comme la NES ou la Sega Saturn. Par la suite, une gestion des ''sprites'' superposés est apparue. Pour cela, il fallait stocker la profondeur de chaque ''sprite'', pour savoir celui qui est superposé au-dessus de tous les autres. Cela demandait d'ajouter un registre pour chaque ''sprite'', qui mémorisait la profondeur. Le circuit devait donc être modifié de manière à gérer la profondeur, en gérant la priorité des ''sprites''. Il faut noter que certaines consoles géraient des ''sprites'' situés sous l'arrière-plan. Quelques effets graphiques le requéraient. Par exemple, imaginez un personnage qui passe derrière un arbre. L'arbre est dessiné dans l'arrière-plan, afin d'économiser des ''sprites'', alors que le personage est composé de plusieurs ''sprites''. Avec des ''sprites'' pouvant passer derrière l'arrière-plan, on peut simuler cet effet de personnage qui passe derrière l'arbre, donc sous l'arrière-plan. ===La palette indicée des ''sprites''=== Certaines consoles de jeux utilisaient à la fois des ''sprites'' et une palette indicée. En soi, rien d'incompatible, les deux techniques sont totalement orthogonales. Mais il y a des consoles qui utilisaient deux palettes séparées : une pour les ''sprites'', l'autre pour l'arrière-plan. En général, les deux palettes ont une couleur commune : la couleur transparente. Elle est codée deux fois, une fois dans chaque palette. Mais les autres couleurs des palettes sont potentiellement différentes dans les deux palettes. L'usage de deux palettes indicées séparées est assez commun sur les consoles 8 bits. L'utilité de ce système est de gérer deux fois plus de couleurs, tout en réduisant les besoins en mémoire. En théorie, on pourrait gérer deux fois plus de couleurs en utilisant une palette unique deux fois plus grande, ce qui serait plus flexible. Mais en utilisant une palette deux fois plus grande, on doit ajouter un bit en plus par pixel, pour encoder deux fois plus de couleurs. Avec deux palettes séparées pour les ''sprites'' et l'arrière-plan, pas besoin : le bit est implicite, il vaut 0 pour les ''sprites'' et 1 pour l'arrière-plan. La Master System a deux palettes : une réservée à l'arrière-plan, l'autre servant à la fois pour les ''sprites'' et le décor. Les ''sprites'' ont à disposition 16 couleurs qu'ils peuvent configurer comme ils le souhaitent. La couleur de transparence n'est pas obligatoire. A l'inverse, la palette pour l'arrière-plan dispose de 15 couleurs configurables, et une couleur de transparence fixe. L'arrière-plan a donc à sa disposition 31 couleurs configurables : 16 provenant de la palette des ''sprites'', 15 provenant de l'autre palette, la 32ème couleur fixe étant la couleur de transparence. La NES utilise un système de palette indicé assez complexe pour réduire encore plus le nombre de bits utilisé pour encoder un ''sprite''. Pour simplifier, elle dispose de 4 palettes pour les ''sprites''. Chaque palette gère 4 couleurs chacune, dont l'une est la couleur transparente, ce qui fait 3 couleurs configurables. Chaque ''sprite'' précise quelle palette utiliser avec deux bits de configuration précisés dans le registre associé au ''sprite''. L'avantage est que cela réduit grandement la quantité de mémoire utilisée pour stocker un ''sprite'' : deux bits par pixel du motif, deux pixels pour préciser la palette utilisée pour le ''sprite''. Au total, cela fait maximum 13 couleurs différentes : 3 couleurs fois 4 palettes plus la couleur de transparence. Même principe pour la palette de l'arrière-plan, qui est elle aussi découpée en 4 sous-palettes avec chacune ayant sa propre copie de la couleur de transparence. De rares consoles 8 bits disposent de plus de deux palettes. Par exemple, la PC-Engine a 32 palettes indicées de 16 couleurs chacune. La première palette est toujours consacrée à l'arrière-plan, la dernière est toujours réservée aux ''sprites'', les 30 palettes restantes sont utilisables à volonté par le programmeur. L'avantage est que l'on peut utiliser une palette différente par ''sprite'', au lieu d'avoir une palette indicée partagée par tous les ''sprites''. Mine de rien, trouver un ensemble de couleur partagé par plus d'une dizaine de ''sprite'' est assez compliqué. Les graphismes sont donc plus colorés, sans que cela demande d'utiliser une palette trop large. Et quand on veut modifier la palette à la volée pour un seul ''sprite'', cette implémentation avec des palettes séparées est bien plus simple. Les consoles comme la NES n'avaient que 4 couleurs par ''sprite''. Mais il y avait moyen de contourner ces limitations en superposant plusieurs ''sprites'' de couleurs différentes. Par exemple, on peut simuler un ''sprite'' de 8 couleurs avec deux ''sprites'' de 4 couleurs chacun. Quelques consoles avaient même des fonctionnalités matérielles pour faciliter cette superposition. Par exemple, la MSX 2 fait automatiquement un OU entre deux ''sprites'' superposés. ===Le zoom et la rotation des ''sprites''=== Il a existé des VDC qui pouvaient zoomer sur des ''sprites'', voire les faire tourner. Le ZOOM des sprites permet de faire grossir ou de réduire la taille d'un sprite dynamiquement. L'effet de zoom pouvait servir pour générer des effets de profondeur. Par exemple, quand on veut simuler un personnage qui se rapproche de l'écran en marchant/courant, il suffit de prendre son sprite et de grossir le zoom progressivement pour donner l'illusion d'un personnage qui se rapproche. Idem pour n'importe quel sprite : plus le sprite est loin, plus on en réduit la taille. L'idée est de gérer la taille des sprites en fonction de la profondeur du sprite. L'effet donnait un rendu en pseudo-3D. On parle alors de '''''Sprite Scaling'''''. Les implémentations les plus simples permettaient de faire multiplier les dimensions d'un sprite par 2, 4, 8 fois. En clair, la largeur et la longueur du sprite étaient multipliés par 2, 4, 8, etc. Il y avait possibilité de séparer zoom vertical et horizontal. Quelques VDC ne supportaient que le zoom horizontal, d'autre que en vertical, mais la plupart de ceux qui supportaient le zoom supportaient les deux. [[File:IllustrationOfAPixelReplicationProcess.svg|centre|vignette|upright=2|ZOOM Entier sur un "sprite".]] Les implémentations plus complexes supportaient un zoom plus fluide, avec tous les intermédiaires possibles entre *1 et *X. Pour cela, le sprite devait subir des opérations d'interpolation pour avoir un rendu agréable à l'écran. Pour comprendre ce que cela veut dire : imaginez que vous souhaitez multiplier la taille d'un sprite par X. Pour multiplier par 2, 3, 4 ou tout autre entier, cela demande juste de dupliquer chaque pixel. Mais pour les valeurs fractionnaires, les choses sont plus compliquées. Vous devrez appliquer un filtre pour faire le zoom, filtre qui prend les valeurs des pixels et les mélange pour calculer les pixels finaux. Nous reviendrons sur les filtres possibles dans le chapitre sur le filtrage de texture. Vous avez bien lu : le zoom des sprites n'est pas si différent du filtrage de texture, les algorithmes utilisés pour zoomer sur les sprites et filtrer des textures sont d'ailleurs très similaires, voire identiques. ===L'effet miroir ou ''flipping''=== Une autre possibilité est de faire tourner les sprites. La technique la plus simple est un '''effet de miroir''', à savoir que le sprite est inversé horizontalement, il est tourné dans l'autre sens. Pour vous donner une idée de l'utilité de cette technique, imaginez que vous jouez à Mario : si vous allez à droite, Mario sera tourné vers la droite. Mais si vous allez à gauche, le sprite sera tourné à gauche. Mais il s'agit d'un seul sprite, qui est tourné dans un sens ou l'autre avec un effet de miroir. Il est aussi possible d'inverser le sprite verticalement, pour le retourner. Mais cette possibilité est plus rarement utilisée. La raison est que les rares jeux où cela pourrait être utile sont des jeux en vue de dessus, par exemple les Zelda, les Pokemon, et d'autres jeux dans le genre. Mais ils utilisent souvent un effet de perspective qui fait que la caméra n'est pas placée exactement à la verticale, ce qui fait qu'inverser un sprite verticalement ne respecte pas la perspective. Toutes les consoles 8 bits supportaient l'effet de miroir directement en matériel, celui-ci étant très utile. Une des rares exceptions était la Master System de Sega. Sur cette dernière, le GPU était un VDC TMS9918 de Texas Instrument qui ne gérait pas l'effet miroir. Deux autres consoles utilisaient ce VDC : la colevision et la Sega SG-1000. Elles avaient le même problème. Cependant, il était possible de gérer l'effet miroir en utilisant le CPU. L'avantage de la technique est qu'elle réduit le nombre de ''sprites'' nécessaires, ce qui entraine un gain en mémoire ROM. Les concepteurs peuvent ainsi faire rentrer un jeu sur une cartouche plus facilement, voire peuvent en profiter pour rajouter des ''sprites''. Mais un défaut de cette méthode est que les personnages donnent l'impression d'être ambidextres ! Au passage, sur la Master System, les concepteurs de jeu n'avaient pas d'autre choix que d'utiliser des ''sprites'' séparés pour les personnages/ennemis vus de gauche et vu de droite. Et on peut le remarquer au fait que les ennemis/personnages ne sont pas ambidextres, les artistes ayant souvent pris en compte de détail. <noinclude>Au passage, j'en profite pour vous renvoyer vers ce lien, qui détaille l'utilisation de l'effet de miroir dans plusieurs jeux : * [https://upsilandre.over-blog.com/2019/09/asymetrie-ou-ambidextrie-il-faut-choisir.html ASYMÉTRIE OU AMBIDEXTRIE, IL FAUT CHOISIR], du blog "Upsilandre Retrogaming".</noinclude> ===La rotation des ''sprites''=== La '''rotation des ''sprites''''' regroupe plusieurs techniques diverses, qui vont de simples effets de miroir à des techniques de rotation complexes. L'effet miroir est techniquement une rotation de ''sprite'' particulière, mais ce n'est pas la seule. Les techniques plus évoluées permettent de faire tourner un sprite, pour faire comme si on voyait un objet de biais. Un sprite rectangulaire représente un objet vu soit de profil, soit de face. Mais si on veut donner l'illusion d'un objet faisant un angle différent, il faut modifier la forme du sprite. Le sprite rectangulaire est transformé en trapèze, qui est d'autant moins proche d'un rectangle que l'angle est important. Déformer un sprite rectangulaire en trapèze est un effet de rotation général. Le tout donne un '''effet de perspective'''. [[File:Mode 7 Test-0000.png|centre|vignette|Mode 7, test.]] [[File:Mode 7 process.svg|vignette|upright=1|Mode 7.]] L'implémentation de la perspective est assez simple. Le sprite est une image formée de plusieurs lignes de pixels. L'idée est que la taille des lignes est d'autant plus réduite que la ligne est censée être loin. Les portions proches du sprite seront de taille normale, les autres sont réduites. Mais la technique demande cependant de multiplier la taille de chaque ligne par un coefficient, qui n'est pas forcément entier. Là encore, des algorithmes permettent de lisser les images des sprites pour les mettre à l'échelle. L'algorithme peut faire à la fois la gestion de la perspective et le zoom des sprites, et utiliser des algorithmes proches de ceux du filtrage de textures. Une implémentation complexe est celle du ''mode 7'' de la Super Nintendo. L'implémentation matérielle est paradoxalement assez simple. Mais la comprendre demande de faire la distinction entre les pixels du ''framebuffer'' et les pixels du ''sprite''. Le ''sprite'' est une image qui est composée de pixels. Pour faire la distinction avec les pixels du ''framebuffer'', nous allons appeler les pixels du ''sprite'' des '''texels'''. Terme qui est normalement utilisé pour les textures, mais il y a un lien qui sera fait dans quelques chapitres. Placer le ''sprite'' sur l'arrière-plan demande de prendre les coordonnées de chaque ''texel'' et de faire un calcul qui donne les coordonnées finales x,Y dans le ''framebuffer''. Sans rotation et sans zoom, le calcul est simple : on additionne la position x,y du sprite et la coordonnée du texel dans le sprite. Pour faire tourner les sprites, il faut faire des calculs impliquant des matrices (des objets mathématiques en forme de tableaux de nombre), que je ne détaillerais pas du tout. Pour le dire très rapidement, il faut juste multiplier les coordonnées du texel par une matrice qui encode à la fois la rotation et le zoom, mais aussi le placement au bon endroit sur l'écran (la translation). La matrice est calculée par le processeur, le VDC ne fait que faire la multiplication matricielle. ==L'accélération matérielle du défilement== [[File:Parallax scroll.gif|vignette|Exemple de ''scrolling''.]] Le défilement permet de faire défiler l'environnement sur l'écran, spécialement quand le joueur se déplace. Les jeux de plateforme rétro utilisaient énormément le défilement, le joueur se déplaçait généralement de gauche à droite, ce qui fait que l'on parle de défilement horizontal. Mais il y avait aussi le défilement vertical, utilisé dans d'autres situations. Peu utilisé dans les jeux de plateforme, le défilement vertical est absolument essentiel pour les ''Shoot 'em up'' ! Les cartes accélératrices intégraient souvent des techniques pour accélérer le défilement. La première optimisation est l'usage du ''blitter''. En effet, défiler ne demande pas de régénérer toute l'image à afficher à partir de zéro. L'idéal est de déplacer l'image de quelques pixels vers la gauche, puis de dessiner ce qui manque. Pour cela, on peut utiliser le ''blitter'' pour déplacer l'image dans le ''framebuffer''. L'optimisation est souvent très intéressante, mais elle est imparfaite et n'était pas suffisante sur les toutes premières consoles de jeu. Elle l'était sur les consoles plus récentes, ou disons plutôt : moins rétro. Les consoles moins rétros avaient des mémoires RAM plus rapides, ce qui rendait l'usage du ''blitter'' suffisante. Mais certains VDC implémentaient une forme de défilement accéléré en matériel totalement différent. Les implémentations sont multiples, mais elles ajoutaient toutes des registres de défilement dans le VDC, qui permettaient de défiler facilement l'écran. Il faut noter que l'implémentation du défilement vertical est bien plus simple que pour le défilement horizontal. En effet, les images sont stockées dans le ''framebuffer'' ligne par ligne ! Et le défilement vertical demande de déplacer l'écran d'une ou plusieurs lignes. Les deux vont donc bien ensemble. ===Le défilement vertical implémenté dans le CRTC=== Une technique utilise le fonctionnement d'un CRTC, couplé avec un ''framebuffer'' amélioré. Nous l’appellerons la technique du ''framebuffer'' étendu, terme de mon invention qui aide à comprendre en quoi consiste cette technique. Elle utilise cependant plus de mémoire vidéo qu'un ''framebuffer'' normal. Elle fonctionne très bien pour le défilement vertical, elle demande quelques adaptations pour le défilement horizontal. [[File:Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer.png|vignette|Implémentation du défilement vertical accéléré en hardware via un pointeur de framebuffer]] La méthode demande d'utiliser un ''framebuffer'' beaucoup plus grand que l'image à afficher. Par exemple, imaginez qu'une console ait une résolution de 640*480, avec des couleurs sur 16 bits. L'image à afficher prend donc 640*480*2 = 600 Kilooctets. Maintenant, imaginez que la mémoire vidéo pour l'arrière-plan fasse 2 mégaoctets. On peut y stocker l’image à rendre, et ce qu'il y a hors de l'écran. Si une scène est assez petite, l'arrière-plan tient entièrement dans la mémoire vidéo, changer l'adresse de base permet de défiler l'écran sur une distance assez longue, voire pour toute la scène. L'idée est de tout simplement dire au CRTC de demander à afficher l'image à partir de la ligne numéro X ! Avec cette technique, il faut faire la différence entre le ''framebuffer'' et le '''''viewport'''''. Le ''viewport'' est la portion du ''framebuffer'' qui mémorise l'image à afficher à l'écran. Le ''framebuffer'', lui, mémorise plus que ce qu'il faut afficher à l'écran, il mémorise quelques lignes en plus, voire un niveau entier ! Le pointeur de ''framebuffer'' et la résolution indiquent la position du ''viewport'' dans le ''framebuffer'', qui monte ou descend en fonction du sens de défilement. Pour la comprendre, prenez le cas où on souhaite défiler d'un pixel, verticalement vers le bas. La première ligne de l'image disparait, une nouvelle apparait en bas de l'image. Cas simple, un peu irréaliste, mais qui permet de bien comprendre l'idée. Pour rappel, un CRTC incorpore deux compteurs de ligne et de colonne, ainsi qu'un registre pour l'adresse de départ de l'image dans le ''framebuffer''. L'idée est que l'adresse de départ de l'image est augmentée de manière à pointer sur la ligne suivante, en l'augmentant de la taille d'une ligne. Il ne reste plus qu'à remplir la ligne suivante, pas besoin de faire la moindre copie en mémoire vidéo ! Et défiler vers le haut demande au contraire de retrancher la taille d'une ligne de l'adresse. On peut généraliser le tout pour du défilement vertical. L'implémentation la plus complexe demande d'ajouter un '''registre de défilement vertical''', dans lequel on place le numéro de ligne à partir de laquelle il faut dessiner l'image. L'image en mémoire vidéo a plus de lignes que l'écran peut en afficher, le CRTC parcourt autant de ligne que ce que demande la résolution, le registre de défilement vertical indique à partir de quelle ligne commencer l'affichage. Le calcul de l'adresse prend en compte le contenu de ce registre pour parcourir le ''framebuffer''. ===Le défilement vertical infini : le ''warp-around'' des adresses=== La technique précédente fonctionne bien, mais elle ne permet pas d'avoir du défilement infini, à savoir avec des maps dont la longueur n'est pas limitée par la mémoire vidéo. Mais on peut l'adapter pour obtenir du défilement vertical, en utilisant un comportement particulier du calcul des adresses. Le comportement en question est le ''warp-around''. Pour le comprendre, prenons l'exemple suivant. La mémoire vidéo peut contenir 1000 lignes, la résolution verticale est de 300 lignes. Si on démarre l'affichage à la 700ème ligne, tout va bien, on n'a pas besoin de ''warp-around''. Mais maintenant, imaginons que le défilement vertical fasse démarrer l'affichage à partir de la 900ème ligne. L'affichage se fera normalement pour 100 lignes, mais la 101ème débordera hors du ''framebuffer'', il n'y aura pas d'adresse associée. Le ''warp-around'' fait repartir les adresses à zéro lors d'un tel débordement. Ainsi, la 101ème adresse sera en fait l'adresse 0, la 102ème sera l'adresse 1, etc. En clair, si on commence à afficher l'image à la 900ème ligne, les 100 premières seront prises dans les 100 lignes à la fin du ''framebuffer'', alors que les 200 suivantes seront les 200 lignes au début du ''framebuffer''. En faisant cela, on peut avoir un défilement vertical infini. Quand l'image affichée est démarrée assez loin, le début du ''framebuffer'' est libre, il contient des lignes qui ne seront sans doute pas affichées par la suite. Dans ce cas, on écrit dedans la suite du niveau, celle située après la ligne à la fin du ''framebuffer''. Il suffit que le programmeur se charge de modifier le ''framebuffer'' de cette manière et on garantit que tout va bien se passer. Avec cette technique, on peut avoir un défilement infini en utilisant seulement deux fois plus de mémoire vidéo que ce qui est nécessaire pour stocker une image à l'écran. Il est même possible de tricher pour utiliser moins de mémoire vidéo. Mais laissons cela de côté, tout cela est laissé à l’appréciation du programmeur. ===Le défilement horizontal et vertical implémenté par le CRTC=== Pour le défilement horizontal, il faut procéder de la même manière, mais en trichant un peu. Là encore, il y a une différence entre ''viewport'' et ''framebuffer'', et les deux n'ont pas la même résolution. Mais cette fois-ci, outre la résolution verticale qui est plus grande, la résolution horizontale l'est aussi. Par exemple, si je prends la console de jeux NES, elle a une résolution pour l'écran de 256 par 240, alors que l'arrière-plan a une résolution de 512 par 480. L'implémentation utilise des compteurs de ligne et de colonne séparés. L'idée est d'avoir des lignes plus longues dans le ''framebuffer'' que ce qui est indiqué dans le registre de résolution. On peut alors mémoriser une ligne plus longue que ce qui est affiché à l'écran, avec des portions non-affichées à l'écran. L'idée est là encore d'initialiser le compteur de colonne avec une valeur qui est incrémentée d'un pixel à chaque fois qu'on défile vers la droite, décrémentée quand on va vers la gauche. Le registre pour la résolution horizontale, qui vérifie si la fin de la ligne/colonne est atteinte, est lui aussi incrémenté. La même méthode peut être utilisée pour le défilement horizontal en faisant la même chose pour le compteur de ligne. L'implémentation demande d'ajouter un registre de défilement horizontal, en plus du registre de défilement vertical, le principe derrière est le même mais pour le numéro de colonne et non de ligne. [[File:Implémentation du défilement horizontal avec in viewport.png|centre|vignette|upright=2|Implémentation du défilement horizontal avec in viewport]] Notons que le comportement de ''warp-around'' peut aussi être implémenté pour les adresses et compteurs de colonne. Cela permet d'avoir du défilement horizontal infini. La fonctionnalité était disponible sur les cartes EGA, les toutes premières cartes d'affichage datant d'avant même le standard VGA. Tout était en place sur ces cartes graphiques pour implémenter la technique : une mémoire vidéo assez grande, un ''framebuffer'' potentiellement plus grand que ce qui est affiché à l'écran, une adresse de départ qu'on peut incrémenter ligne par ligne, par incréments de 1 pixel. Le logiciel devait cependant utiliser cette faculté adéquatement pour implémenter le défilement. Malheureusement, le BIOS des cartes VGA n'implémentait pas les optimisations du défilement, et les programmeurs devaient tout coder à la main dans leurs applications pour les utiliser. ==Les ''raster effects'' : défilement partiel et ''sprites'' supplémentaires== Les '''''raster effects''''' sont des effets graphiques qui sont implémentés en modifiant le VDC pendant l'affichage de l'image. Par exemple, il est possible de changer la couleur de l'arrière-plan à partir d'une certaine ligne, afin de séparer le ciel du sol. Un exemple classique est celui qui permet de contourner le nombre maximal de ''sprites'' à l'écran. ===La limite de ''sprites'' par écran=== Un VDC normal ne peut gérer qu'un nombre maximal de ''sprites'' par image/écran. Mais grâce aux ''raster effects'', il est possible de dépasser cette limite, en changeant les ''sprites'' à la volée, pendant que l'image s'affiche. Par exemple, les ''sprites'' déjà affichés sont recyclés et remplacés par d'autres ''sprites''. Leur coordonnée passe d'une portion affichée de l'image (typiquement en haut de l'écran) à une portion pas encore affichée (typiquement plus bas). En faisant cela, on peut afficher plus de ''sprites'' que ce que gére le VDC. Par contre, on ne peut pas dépasser la limite de ''sprite'' par ''scanline''. Par exemple, si un VDC gère maximum 64 ''sprites'' par imaeg et 8 ''sprites'' par ligne, la première limite est facilement contournée via les ''raster effects'', mais pas la seconde. Autant changer des ''sprites'' entre l'affichage de deux lignes est possible, autant le faire pendant l'affichage d'une ligne ne l'est pas. En effet, le VDC n'est souvent pas reconfigurable par le processeur pendant l'affichage d'une ligne. Il l'est entre l'affichage de deux lignes, pas pendant. ===Le défilement partiel=== De nombreux effets graphiques demandent de ne faire défiler qu'une partie de l'écran, le reste de l'écran reste en place. Dans ce cas, nous parlerons de '''défilement partiel''', le terme partiel indiquant qu'il ne touche qu'une portion de l'image. De tels effets sont généralement implémentés avec des ''raster effect'', mais il faut que le matériel le supporte pleinement. Pour donner un exemple, prenez les phases d’ascenseur dans les jeux de type ''beat'them up'', où votre personnage est sur une plateforme qui monte/descend, les ennemis arrivant dessus par vagues successives. Dans ce cas, la plateforme est immobile et le reste de l'image défile verticalement vers le haut (ascenseur descend) ou vers le bas (ascenseur monte). Un cas particulier de défilement partiel est celui utilisé pour le HUD : les compteurs de vie, score, et autres. Il arrive que le HUD soit dessiné avec des ''sprites'', mais ce n'est pas la majorité des cas. En réalité, le HUD est placé dans l'arrière-plan directement. Et il ne doit pas être défilé, pour rester en place. par exemple, si le HUD est placé au sommet de l'écran, il doit y rester et ne pas subir de défilement vertical ou horizontal. D'autres effets demandent de changer le défilement ligne par ligne : des effets de vagues, d'ondulation, ou autre. Par exemple, c'est ce qui permet de créer des virages sur les jeux de course ! Il n'y a qu'une seule image de route en ligne droite, qu'on décale à chaque ligne pour simuler un virage ! D'autres effets demandent un défilement partiel à la verticale. Il a été utilisé pour le HUD, les Boss de grande taille de certains jeux, des effets d'eau qui monte et bien d'autres encore. Voici un article qui explique le tout en détail : * [https://upsilandre.over-blog.com/2019/07/les-arcanes-du-scrolling-vertical.html LES ARCANES DU SCROLLING VERTICAL SUR NES] Un problème est que le défilement doit être reconfigurable lors de l'affichage de l'image. La quasi-totalité des consoles permettait cela, avec cependant quelques exceptions. Par exemple, la Master System permettait de changer les ''sprites'' à la volée, idem pour le défilement horizontal, mais ne permettait pas de changer le défilement vertical pendant l'affichage d'une image. Sur Master System, le registre de défilement vertical était pris en compte uniquement au début de l'affichage, le modifier en cours d'affichage n'avait pas le moindre effet sur l'affichage. On parle alors de '''''Vlock'''''. Il était possible de contourner le problème avec des solutions logicielles, avec un cout en performance et quelques limitations quant au résultat. ===L'implémentation des ''raster effects''=== Les VDC étaient souvent conçus avec les ''raster effects'' en tête. Ils supportent souvent des fonctionnalités qui facilitent l'implémentation des ''raster effects'' : compteurs de ligne, interruptions horizontales, et autres que nous allons voir dans ce qui suit. En théorie, les ''raster effects'' peuvent se faire même si le VDC ne supporte pas ces fonctionnalités. Mais cela demande de synchroniser le processeur et le VDC au cycle près, ou presque. Les programmeurs de l'Atari 2600 faisaient ainsi, mais il faut avouer que ce n'était pas pratique. La première fonctionnalité est le '''compteur de ligne'''. Le nom est assez transparent : il s'agit d'un registre qui contient le numéro de la dernière ligne affichée. Par exemple, si le VDC a affiché la 20ème ligne et se prépare à afficher la 21ème, alors ce compteur contient le numéro 20. Le compteur de ligne permet au processeur/logiciel de savoir où il en est lors de l'affichage de l'écran. Il peut regarder régulièrement ce compteur et changer le défilement et/ou les ''sprites'' quand un certain numéro apparait dans ce compteur de ligne. Le compteur de ligne en question existe déjà dans la plupart des VDC, vu qu'il s'agit de celui vu dans les chapitres précédents, qui sert pour l'adressage de la mémoire vidéo et quelques autres fonctionnalités. Mais il n'est pas forcément accesible par le processeur. Les VDC anciens ont un compteur de ligne interne, qui n'est accesible que par les circuits du VDC, mais le processeur n'y a pas accès. La fonctionnalité dont on parle ici rend ce registre visible par le processeur, un peu comme l'est le registre d'état. Une seconde fonctionnalité, très liée au compteur de ligne, est l''''''horizontal blank interrupt''''', une cousine de l'interruption de ''vertical blank interrupt'' qui indique qu'une image complète a été affichée à l'écran. L'''horizontal blank interrupt'' fait la même chose, mais au niveau des lignes et d'une manière configurable. L'idée est que l'on peut demander au VDC de déclencher une interruption quand il atteint la ligne numéro X, par exemple quand il a fini d'afficher la 20ème ligne, la 50ème, etc. Le programmeur peut précise à quelle ligne se déclenche l'interruption. Pour le dire autrement, cette interruption se déclenche quand le compteur de ligne atteint une valeur bien précise, configurable par le programmeur. Prenons l'exemple où programmeur veut afficher un HUD de 30 pixels de hauteur au-dessus d'un arrière-plan qui défile horizontalement. L'image ne défile pas initialement et le jeu affiche d'abord le HUD. Mais le programmeur a configuré l'interruption pour se déclencher à la 30ème ligne. L'interruption réactive le défilement de l'arrière-plan et change l'affichage pour basculer du HUD vers l'arrière-plan. Une autre fonctionnalité, spécifique à la SNES, est le '''HDMA''', une amélioration de la fonctionnalité DMA (''Direct Memory Access''). Le DMA normal permet de faire des copies de la RAM vers la RAM, parfois de la RAM vers la mémoire vidéo (et inversement). Le '''HDMA''' de la SNES étend le comportement du DMA. Elle permet de faire copies RAM -> VDC, pour reconfigurer le VDC. De plus, les copies sont programmées à l'avance, elles ne se font pas en réaction à une interruption de ''blanking'' horizontal. Précisément, le VDC est reconfiguré à chaque période de ''blanking'' horizontal, entre l'affichage de deux lignes. Pour cela, le processeur prépare une table HDMA qui précise comment configurer le VDC pour chaque ligne à l'écran. Pour simplifier, la table HDMA contient des entrées, chacune correspondant à une ligne de l'écran, qui indique quoi envoyer dans les registres de configuration du VDC. Le VDC lit les entrées de la première à la dernière, ligne par ligne. Le fonctionnement réel est un peu plus complexe. La table permet de conserver la même configuration pour N lignes consécutives, N allant de 1 à 128. Quand le VDC voit une de ces entrées, les données de configuration sont recopiées à l'identique pour N lignes consécutives. ==L'usage de plusieurs arrière-plans et d'avant-plans== Une carte graphique 2D basique gére un arrière-plan et un avant-plan contenant plusieurs ''sprites'', avec éventuellement un avant-plan pour le HUD ou une interface sur laquelle afficher les vies, et d'autres informations. En tout, cela fait trois plans aux usages bien précis. Mais il est possible d'ajouter plusieurs arrière-plans, voir plusieurs avant-plans. L'utilité n'est pas évidente, mais cela sert pour de nombreux effets graphiques. Voyons lesquels. ===Les décors à l'avant-plan=== Il faut noter que les cartes graphiques peuvent aussi gérer des avant-plans, à savoir des décors qui passent devant les ''sprites''. Une forme d'avant-plan très utile est celui pour le HUD, les compteurs de vie, mana, munitions et autres. Implémenter un HUD avec du défilement est compliqué, car le HUD ne doit pas défiler : il doit rester à la même place sur l'écran, alors que le reste de l'écran défile. Il faut noter que les avant-plans ne sont pas forcément séparés des arrière-plans. La seule différence entre les deux est la profondeur ! Et précisément la profondeur comparée à la couche pour les ''sprites''. Plus profond que les ''sprites'' : c'est un arrière-plan. Moins profond, c'est un avant-plan. Les cartes graphiques gèrent souvent des "couches" (''layers'') qui se superposent, avec une couche spécialisée pour les ''sprites'', et d'autres couches qu'on peut configurer à volonté comme arrière- ou avant-plan. Les avant-plans sont aussi utilisés dans quelques jeux pour un effet purement esthétique, pour mettre un décor ou des objets devant les ''sprites''. De plus, ils sont occasionnellement nécessaires pour rendre certains effets graphiques, ou pour ajouter de la profondeur à une scène. Les avant-plans défilent à une vitesse différente des arrière-plans, sans quoi le résultat est absolument affreux. Aussi, l'usage d'avant-plans est très fortement corrélé à l'usage du défilement à parallaxe qu'on va voir dans ce qui suit. ===Le défilement horizontal à parallaxe=== [[File:Parallax-scroll-example-2.png|vignette|Défilement avec parallaxe.]] [[File:Parallax-scroll-example.gif|vignette|Défilement avec parallaxe : illustration des plans.]] Le '''défilement à parallaxe''' donne une illusion de profondeur dans l'environnement? Pour cela, il utilise plusieurs arrière-plans superposés qui défilent à des vitesses différentes. Le défilement à parallaxe demande que les éléments à l'arrière-plan bougent à des vitesses différentes, mais pas les sprites à l'avant-plan. Le défilement sans parallaxe fait bouger le ''framebuffer'' en bloc, ce qui fait bouger tout l'arrière-plan tout d'un coup. Pour implémenter la technique, il est possible d'utiliser un défilement partiel basé sur des ''raster effects''. L'idée est de changer le défilement horizontal ou vertical pendant l'affichage. En général, l'écran est découpé en bandes qui défilent à des vitesses différentes, pour donner des effets parallaxe, parfois des effets de rouleau (le sol forme un tore) ou d'autres effets graphiques. Une autre solution utilise des arrière-plans partiellement transparents qui se superposent. Les différents arrière-plans ont chacun une profondeur qui dit quel arrière-plan passe devant les autres. Il s'agit de l'implémentation la plus simple, mais elle demande que la carte graphique gère la transparence. Ce n'est cependant pas la seule option et quelques consoles de jeu se débrouillaient pour mélanger plusieurs arrière-plans sans pour autant gérer directement la transparence. Mais nous verrons cela plus tard. ===L'émulation de la transparence, des ombres et lumières=== L'usage de plusieurs arrière-plans marche bien si la carte graphique gère la transparence. C’est-à-dire que chaque pixel indique s'il est totalement opaque, totalement transparent, ou partiellement opaque. En faisant cela, déterminer quel pixel afficher est simple : on prend en compte la profondeur de chaque arrière-plan, et on détermine quel est le premier pixel visible. Par un exemple, si un pixel transparent est situé devant un pixel opaque, c'est ce dernier qui s'affiche. Pour les pixels partiellement transparents, il faut mélanger les couleurs des pixels en faisant une simple moyenne. Mais cela implique que la carte graphique gère la transparence, que chaque pixel contienne une couleur alpha qui indique son niveau de transparence, couleur ajoutée aux couleurs RGB existantes. Des consoles comme la SNES utilisaient un système totalement différent. Elles utilisaient des arrière-plans dont les pixels étaient codés en RGB, sans composante de transparence alpha. Mais elles arrivaient à combiner plusieurs arrière-plans entre eux sans problèmes. Les arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. La combinaison pouvait utiliser plusieurs opérations, qui étaient appliquées pixel par pixel. Les opérations de combinaison sont : l'addition, la soustraction, la moyenne additive, et une soustraction suivie d'une division par deux. Pour résumer, on peut additionner/soustraire des pixels à la même place dans les différents arrière-plans, puis éventuellement diviser par deux le résultat. Précisons que les additions/soustractions sont dites saturées : elles n'ont pas de débordements d'entiers. Les différentes opérations permettaient surtout d'implémenter des effets d'éclairage, d'ombrage, de transparence, voire de masquage (n'afficher qu'une partie de l'écran). L'addition ne peut qu'augmenter la couleur du pixel final, en augmenter la luminosité, ce qui la rend idéale pour appliquer des effets de lumière. À l'inverse, la soustraction ne peut que réduire la couleur finale d'un pixel, ce qui permet d'appliquer des ombres. La moyenne mélange deux pixels entre eux, qui sont à la même place à l'écran, mais n'ont pas la même profondeur, vu qu'ils sont dans des arrière-plans différents. En clair, elle applique des effets de transparences assez limités. Les pixels de deux arrière-plans sont mélangés avec une proportion fixe de 50-50. Ce qui permet d'appliquer des effets de transparence très limités. Avec l'addition, il suffit de calculer les lumières à appliquer dans un arrière-plan, qui est additionné avec le reste de l'image. Pour appliquer des ombres, il faut faire la même chose mais avec la soustraction. Les ombres sont calculées dans un arrière-plan à part, qui est soustrait du résultat du reste. Pour être plus précis, l'arrière-plan contenait une image d'ombrage, qui indique quelles sont les parties de l'image dans l'ombre et l'intensité de l'ombre pour chaque pixel. Plus un pixel est dans l'ombre, plus sa couleur est proche du blanc (en RGB) : la palette de couleur est inversée. En soustrayant cette seconde image d'ombrage à l'image du ''framebuffer'' principal, on ombre les pixels. Il faut noter que certaines consoles, comme la NES, permettaient en plus d'additionner une couleur fixe pour tous les pixels de l'écran, voire de la soustraire, voire de soustraire le pixel à cette couleur fixe. Cela permettait de biaiser les couleurs de base avec une couleur de base. Là encore, l'utilité était une question d'ombrage, d'éclairage, de transparence, ou autre. Cela permettait d'affiner les couleurs finales. La couleur de base était mémorisée dans un registre. Notons que le registre pouvait être changé entre l'affichage de deux lignes, via des ''raster interrupts'', ce qui permettait d'appliquer des dégradés de lumière verticaux, d'appliquer un effet d'horizon, d'ajouter du brouillard de distance. ===L'implémentation matérielle et le cas particulier de la SNES=== Utiliser plusieurs arrière-plans demande que le matériel soit adapté. Il faut typiquement ajouter de quoi gérer et mémoriser plusieurs arrière-plans et ajouter des circuits pour les combiner entre eux. Le hardware pour faire cette combinaison détermine quel pixel passe devant les autres, il peut gérer de la transparence, etc. Les ''sprites'' sont souvent gérés par un système de ''sprite'' matériel, ce qui fait que le défilement n'est pas tellement un problème pour eux. Les arrières/avant-plans sont typiquement dans des mémoires séparées afin de faciliter la gestion du défilement . Avec plusieurs mémoires, la technique précédente (le ''framebuffer'' étendu et un viewport rectangulaire) peut s'appliquer à chaque arrière-plan. Et on peut les faire défiler à des vitesses différentes. Il est aussi possible d'utiliser une seule mémoire pour cela, qui mémorise plusieurs arrière-plans, c'est tout à fait possible. La console de jeu SNES gérait 4 arrière-plans différents, mais elle n'utilisait pas plusieurs mémoires. Les 4 arrière-plans étaient combinés entre eux, ce qui donnait l'image finale à afficher. Il était possible d'activer ou de désactiver les arrière-plans si besoin. Il était par exemple possible de n'utiliser que 2 arrière-plans, ou 3 arrière-plans dont un soustrait de l'addition des deux autres, etc. Elle disposait de plusieurs modes, appelés mode 1, mode 2, ..., mode 7. Le mode 7 est un mode de rendu avec un seul arrière-plan, mais où les techniques des sections précédentes sont utilisables. Les optimisations pour le défilement horizontal et vertical sont présentes, et le ''viewport'' peut même être déformé, tourné, etc. Il peut utiliser un second arrière-plan très particulier, dérivé du premier. Il utilise les mêmes tiles, avec cependant la possibilité de se retrouver devant les ''sprites'' ou les autres arrière-plans. Il était utilisé pour gérer des tunnels vus de dessus, ou pour quelques effets graphiques où des élèments de décor se retrouvaient à l'avant-plan. {|class="wikitable" |- ! Mode vidéo ! BG 1 ! BG 2 ! BG 3 ! BG 4 |- ! 0 | 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) || 4 couleurs (2 bits) |- ! 1 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || 4 couleurs (2 bits) || |- ! 2 | 16 couleurs (4 bits) || 16 couleurs (4 bits) || || |- ! 3 | 256 couleurs (8 bits) || 16 couleurs (4 bits) || || |- ! 4 | 256 couleurs (8 bits) || 4 couleurs (2 bits) || || |- ! 5 | 16 couleurs (4 bits) || 4 couleurs (2 bits) || || |- ! 6 | 16 couleurs (4 bits) || || || |- ! 7 | 256 couleurs (8 bits) || EXTBG || || |} ==L'accélération matérielle du tracé de ligne et de figures géométriques== <noinclude>[[File:Bresenham.svg|vignette|Tracé d'une ligne sur un écran.]]</noinclude> La dernière optimisation du rendu 2D est le '''tracé de lignes et de figures géométriques''' accéléré en matériel. Quelques VDC incorporent cette optimisation, dont le nom est assez clair sur ce qu'elle fait. Tracer une ligne, un segment, est l'opération la plus courante sur de tels VDC, le tracé de cercles est déjà plus rare. Tracer des polygones est entre les deux, : plus rare que le tracé de ligne pur, moins que le tracé de cercles. ===Les circuits de tracé de ligne=== L'algorithme le plus utilisé par le matériel pour tracer des lignes est l''''algorithme de Bresenham'''. Il est très simple et s'implémente très facilement dans un circuit électronique. Il fut dit que cet algorithme utilise seulement des additions, des soustractions et des décalages, opérations très simples à implémenter en hardware. Il est de plus un des tout premiers algorithmes découvert dans le domaine du graphisme sur ordinateur. Il existe de nombreuses modifications de cet algorithme, qui vont de mineures à assez profondes. Et certaines d'entre elles sont plus faciles à implémenter en hardware que d'autres. [[File:Bresenham line.png|vignette|Coordonnées du pixel de départ et d'arrivée.]] [[File:LineBresenham.gif|vignette|Tracé d'une ligne sur un écran, pixel par pixel.]] Le fonctionnement du circuit de tracé de ligne est le suivant. Premièrement, on précise le pixel de départ et le pixel d'arrivée en configurant des registres à l'intérieur du circuit, avec une paire de registre pour les coordonnées du pixel de départ, une autre parie pour les coordonnées du pixel d'arrivée. Le circuit dessine la ligne pixel par pixel, avec un pixel dessiné par cycle d'horloge. ===Le tracé de figures géométriques=== Passons maintenant au tracé de figures géométrique. Le tracé se fait là encore pixel par pixel, sur le principe. Généralement, le tracé est limité à des figures géométriques simples, que vous avez tous vu quand vous étiez au collège, en cours de maths. Tracer des carrés/rectangles/pentagones/trapèzes ou autres polygone est très simple : il suffit de tracer plusieurs lignes les unes à la suite des autres. La vraie utilité est l'implémentation de courbes, comme des cercles, des ellipses, ou autres. L'algorithme de Bressenham peut être modifié pour implémenter des cercles, ce qui donne le '''''Midpoint circle algorithm'''''. D'autres extensions permettent de dessiner des ellipses, et même des courbes plus complexes comme des courbes de Bezier ou d'autres courbes assez complexes à expliquer. ===Le tracé et le remplissage de figures géométriques par le ''blitter''=== Outre le tracé des figures géométriques, il est aussi possible de gérer en hardware les opérations de '''remplissage'''. Cela veut dire dessiner l'intérieur d'une figure géométrique, comme remplir un carré ou un rectangle, avec une couleur uniforme. Par exemple : dessiner un carré en rouge, remplir un rectangle existant de bleu clair, etc. Le remplissage est souvent disponible pour certaines formes géométriques simples, comme des carrés ou rectangles, rarement plus. Pour le remplissage des triangles ou d'autres figures géométriques, le support matériel est encore plus rare, ne parlons même pas des cercles. Le remplissage de rectangles est souvent réalisé par le ''blitter''. Pour faire une comparaison, la méthode utilisée est globalement la même que celle utilisée pour lire le ''viewport'' dans le ''framebuffer'', mais cette fois-ci réalisé par le ''blitter''. Le ''viewport'' est remplacé par le rectangle à remplir, et la lecture du pixel à envoyer à l'écran est remplacée par l'écriture d'une couleur précisée dans un registre. Pour cela, on précise la couleur, la coordonnée X,Y et la largeur et la hauteur du rectangle dans des registres dédiés. Le remplissage commence à la coordonnée X,Y. L'adresse mémoire est alors incrémentée jusqu'à ce que la largeur voulue soit atteinte. On incrémente alors le compteur de ligne pour passer à la suivante, le compteur de colonne est réinitialisé avec la coordonnée X de la première colonne. Le remplissage s’arrête une fois que la hauteur voulue est atteinte. Un exemple est le ''blitter'' des anciennes consoles Amiga, qui gère nativement des blocs en forme de rectangles, et de trapèzes dessinés à l'horizontale. Ils sont remplis en fournissant plusieurs informations : la position de leur premier pixel, une largeur qui est un multiple de 16 bits, une hauteur mesurée en nombre de lignes, un décalage qui indique de combien de pixels sont décalées deux lignes consécutives. Le décalage est ajouté une fois le compteur de colonne réinitialisé à sa valeur précédente (au démarrage de la ligne précédente). {{NavChapitre | book=Les cartes graphiques | prev=Les systèmes à framebuffer | prevText=Les systèmes à framebuffer | next=Le mode texte et le rendu en tiles | nextText=Le mode texte et le rendu en tiles }} {{autocat}} 79f5wy0b27wi0qfk8li4v2td69rdd8t Les cartes graphiques/Le multi-GPU 0 67391 764877 746295 2026-04-24T17:53:29Z Mewtow 31375 /* L'implémentation matérielle du multi-GPU */ 764877 wikitext text/x-wiki Les techniques dites de multi-GPU, tels le SLI et le Crossfire, permettent de mettre plusieurs cartes graphiques dans un PC pour gagner en performances. Le multi-GPU a eu son heure de gloire durant les années 2000. Dès 1998, il était possible de mettre dans un même PC deux cartes graphiques Voodoo 2, de marque 3dfx. Autre exemple : en 2006, le fabricant de cartes graphiques S3 avait introduit cette technologie pour ses cartes graphiques Chrome. Mais le multi-GPU est tombé en désuétude après 2010, du moins pour le grand public. Le multi-GPU était destiné aux jeux vidéo, même si les applications de réalité virtuelle, l'imagerie médicale haute précision ou les applications de conception par ordinateur pouvaient en tirer profit. C'est ce genre de choses qui se cachent derrière les films d'animation ou les effets spéciaux créés par ordinateur : Pixar ou Disney ont vraiment besoin de rendre des images très complexes, avec beaucoup d'effets, ce qui demande la coopération de plusieurs cartes graphiques. ==La répartition des calculs sur les GPU== Tout le problème des solutions multi-GPU est de répartir les calculs sur plusieurs cartes graphiques, ce qui est loin d'être chose facile. Il existe diverses techniques, chacune avec ses avantages et ses inconvénients, que nous allons aborder de suite. Mais elles peuvent être classées en deux types. Le ''Split Frame Rendering'' répartit le calcul d'une image sur plusieurs GPU. L'''Alternate Frame Rendering'' calcule une image sur un GPU, les GPU calculent chacun des images différentes. ===Le ''Split Frame Rendering''=== Le '''''Split Frame Rendering''''' (SFR) découpe l'image en morceaux, qui sont répartis sur des cartes graphiques différentes. Le SFR et l'AFR n'utilisent pas les GPU de la même manière. Le SFR demande d'utiliser au moins deux GPU, soit deux GPU sur une même carte imprimée, soit deux cartes graphiques séparées. Les GPU ont une organisation entre maitre-esclave : un GPU est un maitre, les autres sont des esclaves. Tous les GPU font des calculs de rendu pour un morceau de l'image final, mais seul le GPU maitre récupère les résultats calculés par les GPU esclaves et combine le tout pour donner l'imager finale. Pour faire la combinaison, le GPU contient des circuits de composition d'image dédié et c'est lui qui a le ''framebuffer'' final. Historiquement, la première technique multi-GPU inventée est apparue sur les cartes graphiques Voodoo 2 et s'appelait le '''''Scan Line Interleave''''', ou SLI. Elle fonctionnait avec seulement deux GPU maximum. Le premier GPU rendait les lignes paires et l'autre les lignes impaires. Il faut noter qu'outre des performances améliorées, utiliser le SLI permettait de doubler la résolution, faisant passer d'une résolution maximale de 800 par 600 maximum pour une voodoo 2, à 1024 par 768. En théorie, on peut adapter la technique à un nombre arbitraire de GPU, en faisant calculer par chaque GPU une ligne sur 3, 4, 5, etc. [[File:Scanline interleave.png|centre|vignette|upright=2.0|Scanline interleave]] Il est aussi possible de simplement couper l'image en deux : la partie haute de l'image ira sur un GPU, et la partie basse sur l'autre. Cette technique peut être adaptée avec plusieurs GPU, en découpant l'image en autant de parties qu'il y a de GPU. Intuitivement, on se dit que l'écran est coupé en deux portions égales. Mais en faisant cela, des complications peuvent survenir dans certains jeux où le bas de l'image est plus chargé que le haut, les FPS notamment. Dans ces jeux, le haut représente le ciel ou un plafond assez vide de géométrie, toute la géométrie et les textures sont dans le bas de l'image. Ainsi, le rendu de la partie haute sera plus rapide que celui du bas, une des cartes 3D finira par attendre l'autre. Mieux répartir les calculs devient alors nécessaire. Pour cela, on peut choisir un découpage statique adapté, dans lequel la partie haute envoyée au premier GPU est plus grande que la partie basse. Cela peut aussi être fait dynamiquement : le découpage de l'image est alors choisi à l’exécution, et la balance entre partie haute et basse s'adapte aux circonstances. Pour cela, le driver dispose d'algorithmes plus ou moins complexes capables de déterminer assez précisément comment découper l'image au mieux. Mais il va de soit que ces algorithmes ne sont pas parfaits. [[File:Screen spliting.png|centre|vignette|upright=2.0|Screen spliting]] La technique du '''''Checker Board''''' découpe l'image en carrés de plusieurs pixels, de taille identique. Le premier GPU calcule les carrés pairs, le second GPU calcule les carrés impairs. Les carrés ont une taille fixe, de 16 ou 32 pixels de largeur, identique pour tous les carrés d'une image. L'avantage est que la technique équilibre bien la charge de travail entre les deux GPU : les deux GPU calculent une portion égale de l'écran, autant en haut qu'en bas. ===L'''Alternate Frame Rendering''=== L''''alternate Frame Rendering''' (AFR) consiste à répartir des images complètes sur les différents GPUs. Dans sa forme la plus simple, un GPU calcule une image, et l'autre GPU calcule la suivante en parallèle. Les problèmes liés à la répartition des calculs entre cartes graphiques disparaissent alors. L'AFR a été inventé par ATI, sur ses cartes graphiques Rage Fury, afin de faire concurrence à la Geforce 256. Un des défauts de cette approche est le '''micro-stuttering'''. Dans des situations où le processeur est peu puissant, les temps entre deux images peuvent se mettre à varier très fortement, et d'une manière beaucoup moins imprévisible. Le nombre d'images par seconde se met à varier rapidement sur de petites périodes de temps. Alors certes, on ne parle que de quelques millisecondes, mais cela se voit à l’œil nu. Cela cause une impression de micro-saccades, que notre cerveau peut percevoir consciemment, même si le temps entre deux images est très faible. Suivant les joueurs, des différences de 10 à 20 millisecondes peuvent rendre une partie de jeu injouable. Pour diminuer l'ampleur de ce phénomène, les cartes graphiques récentes incorporent des circuits pour limiter la casse. Ceux-ci se basent sur un principe simple : pour égaliser le temps entre deux images, et éviter les variations, le mieux est d’empêcher des images de s'afficher trop tôt. Si une image a été calculée en très peu de temps, on retarde son affichage durant un moment. Le temps d'attente idéal est alors calculé en fonction de la moyenne du framerate mesuré précédemment. Ensuite, il arrive que deux images soient dépendantes les unes des autres : les informations nées lors du calcul d'une image peuvent devoir être réutilisées dans le calcul des images suivantes. Cela arrive quand des données géométriques traitées par la carte graphique sont enregistrées dans des textures (dans les Streams Out Buffers pour être précis), dans l'utilisation de fonctionnalités de DirectX ou d'Open GL qu'on appelle le Render To Texture, ainsi que dans quelques autres situations. Évidemment, avec l'AFR, cela pose quelques problèmes : les deux cartes doivent synchroniser leurs calculs pour éviter que l'image suivante rate des informations utiles, et soit affichée n'importe comment. Sans compter qu'en plus, les données doivent être transférées dans la mémoire du GPU qui calcule l'image suivante. ==L'implémentation matérielle du multi-GPU== Le multi-GPU peut se présenter sous plusieurs formes. Il est possible d'utiliser des GPU différents, des GPU identiques, de placer plusieurs GPU sur un même circuit imprimé, et j'en passe. Voyons ces méthodes en revue. La plus simple des méthodes consiste à placer plusieurs GPU sur une même carte graphique. La technique a été utilisée dès les premières cartes accélératrices 2D. Par exemple, la Voodoo 5500 était une carte avec deux GPU sur son circuit imprimé et elle est sortie en Juin 2000. 3dfx a même envisagé des prototypes avec 4 GPU, portant le nom de Voodoo 5 6000, mais ils ne sont pas sortis dans le commerce. On parle alors de '''carte double GPU''' (''dual GPU''). [[File:3dfx Voodoo 5500.jpg|centre|vignette|upright=2|3dfx Voodoo 5500]] Il est aussi possible d'utiliser plusieurs cartes graphiques séparées, connectées à la carte mère via PCI-Express. Pour échanger des informations, les premières implémentations demandaient de connecter les deux cartes avec un connecteur spécialisé. ATI et NVIDIA faisaient ainsi sur les premières implémentations de leurs technologies Crossfire et SLI. Le connecteur n'était pas standardisé, dans le sens où ATI et NVIDIA avaient chacun leur connecteur dédié, incompatibles entre eux. <noinclude>[[File:AMD CrossFireX – bridge connector-bottom oblique PNr°0369.jpg|centre|vignette|upright=2|Connecteur CrossFireX pour le multi-GPU ATI/AMD.]]</noinclude> Par la suite, le connecteur SLI/CrossFire a rapidement été abandonné, pour laisser la place à des échanges passant par le PCI-Express. Le PCI Express permet en effet à deux périphériques de communiquer entre eux sans passer par l'intermédiaire du processeur, de la RAM, ou autre. En configurant des échanges DMA adéquats, plusieurs cartes graphiques dédiées peuvent communiquer entre elles via PCI-Express. ATI/AMD et NVIDIA utilisaient pour cela des technologies propriétaires, comme l'AMD DirectGMA. [[File:AMD DirectGMA.svg|centre|vignette|upright=2|AMD DirectGMA.]] Utiliser un connecteur dédié épargnait la bande passante PCI-Express, dans le sens où le connecteur fournissait de la bande passante en plus, utilisée uniquement pour la communication entre GPU. Les transferts PCI Express normaux n'entraient pas en compétition avec ceux du multi-GPU. Mais le gain était surtout pertinent sur les premières versions du PCI-Express dont le débit était limité. Sur les versions ultérieures du PCI-Express, le débit a augmenté suffisamment pour pouvoir gérer à la fois les transferts GPU normaux et les échanges multi-GPU sans trop de casse. ===L'ATI Crossfire=== La technologie multi-GPU d'ATI/AMD était appelée le Crossfire. Elle a été développée durant les années 2000 et a progressivement évolué dans le temps. La toute première version n'était pas compatible avec toutes les cartes graphiques vendues par ATI. ATI vendait ses cartes graphiques en deux éditions : une édition Crossfire et une édition normale. Elle demandait d'utiliser une carte maitre avec une carte esclave. La carte esclave était une carte graphique normale ou Crossfire, mais la carte maitre devait obligatoirement être une carte Crossfire. La carte maitre était celle branchée sur l'écran. En tant que carte Crossfire, elle incorporait des circuits de composition d'image, afin de combiner les portions d'image calculée par elle-même avec celles calculées par la carte esclave. Cependant, les circuits de composition d'image étaient un peu faibles. Par exemple, la Radeon XT 8500 ne supportait au maximum que des résolutions de 600×1200 - 60 Hz, or 1920×1440 - 52 Hz. Vu que le taux de rafraichissement était faible à de telles résolutions, surtout pour des écrans CRT qui ont tendance à faire mal aux yeux, le Crossfire était surtout utile pour les résolutions plus basses. Dommage pour du multi-GPU, censé aider pour les hautes résolutions. Par la suite, les cartes Crossfire ont disparues et toutes les cartes graphiques ATI étaient compatibles Crossfire. La communication entre les GPU se faisait via le bus PCI Express. La technologie devint alors bien plus pratique, les cartes Crossfire étant rares et peu disponibles. Et ce malgré une petite perte en performance liée aux transferts via le PCI Express. Par la suite, l'introduction du CrossfireX ajouta le support d'un connecteur entre cartes graphiques, afin de passer outre le bus PCI Express. Cependant, cela ne dura que pour les générations des AMD HD 2000 à 7000. ATI/AMD a abandonné l'usage d'un connecteur CrossFire avec ses cartes utilisant le PCI-Express 3.0. [[File:R700 interconnect.svg|centre|vignette|upright=2|Illustration du multi-GPU où deux cartes graphiques communiquent via un lien indépendant du bus PCI-Express. On voit que le débit du lien entre les deux cartes graphique est ajouté au débit du bus PCI-Express.]] {{NavChapitre | book=Les cartes graphiques | prev=L'antialiasing | prevText=L'antialiasing }}{{autocat}} b2198hqwefbzrtveniyi2wfrjdc2wns 764895 764877 2026-04-24T17:59:03Z Mewtow 31375 /* L'ATI Crossfire */ 764895 wikitext text/x-wiki Les techniques dites de multi-GPU, tels le SLI et le Crossfire, permettent de mettre plusieurs cartes graphiques dans un PC pour gagner en performances. Le multi-GPU a eu son heure de gloire durant les années 2000. Dès 1998, il était possible de mettre dans un même PC deux cartes graphiques Voodoo 2, de marque 3dfx. Autre exemple : en 2006, le fabricant de cartes graphiques S3 avait introduit cette technologie pour ses cartes graphiques Chrome. Mais le multi-GPU est tombé en désuétude après 2010, du moins pour le grand public. Le multi-GPU était destiné aux jeux vidéo, même si les applications de réalité virtuelle, l'imagerie médicale haute précision ou les applications de conception par ordinateur pouvaient en tirer profit. C'est ce genre de choses qui se cachent derrière les films d'animation ou les effets spéciaux créés par ordinateur : Pixar ou Disney ont vraiment besoin de rendre des images très complexes, avec beaucoup d'effets, ce qui demande la coopération de plusieurs cartes graphiques. ==La répartition des calculs sur les GPU== Tout le problème des solutions multi-GPU est de répartir les calculs sur plusieurs cartes graphiques, ce qui est loin d'être chose facile. Il existe diverses techniques, chacune avec ses avantages et ses inconvénients, que nous allons aborder de suite. Mais elles peuvent être classées en deux types. Le ''Split Frame Rendering'' répartit le calcul d'une image sur plusieurs GPU. L'''Alternate Frame Rendering'' calcule une image sur un GPU, les GPU calculent chacun des images différentes. ===Le ''Split Frame Rendering''=== Le '''''Split Frame Rendering''''' (SFR) découpe l'image en morceaux, qui sont répartis sur des cartes graphiques différentes. Le SFR et l'AFR n'utilisent pas les GPU de la même manière. Le SFR demande d'utiliser au moins deux GPU, soit deux GPU sur une même carte imprimée, soit deux cartes graphiques séparées. Les GPU ont une organisation entre maitre-esclave : un GPU est un maitre, les autres sont des esclaves. Tous les GPU font des calculs de rendu pour un morceau de l'image final, mais seul le GPU maitre récupère les résultats calculés par les GPU esclaves et combine le tout pour donner l'imager finale. Pour faire la combinaison, le GPU contient des circuits de composition d'image dédié et c'est lui qui a le ''framebuffer'' final. Historiquement, la première technique multi-GPU inventée est apparue sur les cartes graphiques Voodoo 2 et s'appelait le '''''Scan Line Interleave''''', ou SLI. Elle fonctionnait avec seulement deux GPU maximum. Le premier GPU rendait les lignes paires et l'autre les lignes impaires. Il faut noter qu'outre des performances améliorées, utiliser le SLI permettait de doubler la résolution, faisant passer d'une résolution maximale de 800 par 600 maximum pour une voodoo 2, à 1024 par 768. En théorie, on peut adapter la technique à un nombre arbitraire de GPU, en faisant calculer par chaque GPU une ligne sur 3, 4, 5, etc. [[File:Scanline interleave.png|centre|vignette|upright=2.0|Scanline interleave]] Il est aussi possible de simplement couper l'image en deux : la partie haute de l'image ira sur un GPU, et la partie basse sur l'autre. Cette technique peut être adaptée avec plusieurs GPU, en découpant l'image en autant de parties qu'il y a de GPU. Intuitivement, on se dit que l'écran est coupé en deux portions égales. Mais en faisant cela, des complications peuvent survenir dans certains jeux où le bas de l'image est plus chargé que le haut, les FPS notamment. Dans ces jeux, le haut représente le ciel ou un plafond assez vide de géométrie, toute la géométrie et les textures sont dans le bas de l'image. Ainsi, le rendu de la partie haute sera plus rapide que celui du bas, une des cartes 3D finira par attendre l'autre. Mieux répartir les calculs devient alors nécessaire. Pour cela, on peut choisir un découpage statique adapté, dans lequel la partie haute envoyée au premier GPU est plus grande que la partie basse. Cela peut aussi être fait dynamiquement : le découpage de l'image est alors choisi à l’exécution, et la balance entre partie haute et basse s'adapte aux circonstances. Pour cela, le driver dispose d'algorithmes plus ou moins complexes capables de déterminer assez précisément comment découper l'image au mieux. Mais il va de soit que ces algorithmes ne sont pas parfaits. [[File:Screen spliting.png|centre|vignette|upright=2.0|Screen spliting]] La technique du '''''Checker Board''''' découpe l'image en carrés de plusieurs pixels, de taille identique. Le premier GPU calcule les carrés pairs, le second GPU calcule les carrés impairs. Les carrés ont une taille fixe, de 16 ou 32 pixels de largeur, identique pour tous les carrés d'une image. L'avantage est que la technique équilibre bien la charge de travail entre les deux GPU : les deux GPU calculent une portion égale de l'écran, autant en haut qu'en bas. ===L'''Alternate Frame Rendering''=== L''''alternate Frame Rendering''' (AFR) consiste à répartir des images complètes sur les différents GPUs. Dans sa forme la plus simple, un GPU calcule une image, et l'autre GPU calcule la suivante en parallèle. Les problèmes liés à la répartition des calculs entre cartes graphiques disparaissent alors. L'AFR a été inventé par ATI, sur ses cartes graphiques Rage Fury, afin de faire concurrence à la Geforce 256. Un des défauts de cette approche est le '''micro-stuttering'''. Dans des situations où le processeur est peu puissant, les temps entre deux images peuvent se mettre à varier très fortement, et d'une manière beaucoup moins imprévisible. Le nombre d'images par seconde se met à varier rapidement sur de petites périodes de temps. Alors certes, on ne parle que de quelques millisecondes, mais cela se voit à l’œil nu. Cela cause une impression de micro-saccades, que notre cerveau peut percevoir consciemment, même si le temps entre deux images est très faible. Suivant les joueurs, des différences de 10 à 20 millisecondes peuvent rendre une partie de jeu injouable. Pour diminuer l'ampleur de ce phénomène, les cartes graphiques récentes incorporent des circuits pour limiter la casse. Ceux-ci se basent sur un principe simple : pour égaliser le temps entre deux images, et éviter les variations, le mieux est d’empêcher des images de s'afficher trop tôt. Si une image a été calculée en très peu de temps, on retarde son affichage durant un moment. Le temps d'attente idéal est alors calculé en fonction de la moyenne du framerate mesuré précédemment. Ensuite, il arrive que deux images soient dépendantes les unes des autres : les informations nées lors du calcul d'une image peuvent devoir être réutilisées dans le calcul des images suivantes. Cela arrive quand des données géométriques traitées par la carte graphique sont enregistrées dans des textures (dans les Streams Out Buffers pour être précis), dans l'utilisation de fonctionnalités de DirectX ou d'Open GL qu'on appelle le Render To Texture, ainsi que dans quelques autres situations. Évidemment, avec l'AFR, cela pose quelques problèmes : les deux cartes doivent synchroniser leurs calculs pour éviter que l'image suivante rate des informations utiles, et soit affichée n'importe comment. Sans compter qu'en plus, les données doivent être transférées dans la mémoire du GPU qui calcule l'image suivante. ==L'implémentation matérielle du multi-GPU== Le multi-GPU peut se présenter sous plusieurs formes. Il est possible d'utiliser des GPU différents, des GPU identiques, de placer plusieurs GPU sur un même circuit imprimé, et j'en passe. Voyons ces méthodes en revue. La plus simple des méthodes consiste à placer plusieurs GPU sur une même carte graphique. La technique a été utilisée dès les premières cartes accélératrices 2D. Par exemple, la Voodoo 5500 était une carte avec deux GPU sur son circuit imprimé et elle est sortie en Juin 2000. 3dfx a même envisagé des prototypes avec 4 GPU, portant le nom de Voodoo 5 6000, mais ils ne sont pas sortis dans le commerce. On parle alors de '''carte double GPU''' (''dual GPU''). [[File:3dfx Voodoo 5500.jpg|centre|vignette|upright=2|3dfx Voodoo 5500]] Il est aussi possible d'utiliser plusieurs cartes graphiques séparées, connectées à la carte mère via PCI-Express. Pour échanger des informations, les premières implémentations demandaient de connecter les deux cartes avec un connecteur spécialisé. ATI et NVIDIA faisaient ainsi sur les premières implémentations de leurs technologies Crossfire et SLI. Le connecteur n'était pas standardisé, dans le sens où ATI et NVIDIA avaient chacun leur connecteur dédié, incompatibles entre eux. <noinclude>[[File:AMD CrossFireX – bridge connector-bottom oblique PNr°0369.jpg|centre|vignette|upright=2|Connecteur CrossFireX pour le multi-GPU ATI/AMD.]]</noinclude> Par la suite, le connecteur SLI/CrossFire a rapidement été abandonné, pour laisser la place à des échanges passant par le PCI-Express. Le PCI Express permet en effet à deux périphériques de communiquer entre eux sans passer par l'intermédiaire du processeur, de la RAM, ou autre. En configurant des échanges DMA adéquats, plusieurs cartes graphiques dédiées peuvent communiquer entre elles via PCI-Express. ATI/AMD et NVIDIA utilisaient pour cela des technologies propriétaires, comme l'AMD DirectGMA. [[File:AMD DirectGMA.svg|centre|vignette|upright=2|AMD DirectGMA.]] Utiliser un connecteur dédié épargnait la bande passante PCI-Express, dans le sens où le connecteur fournissait de la bande passante en plus, utilisée uniquement pour la communication entre GPU. Les transferts PCI Express normaux n'entraient pas en compétition avec ceux du multi-GPU. Mais le gain était surtout pertinent sur les premières versions du PCI-Express dont le débit était limité. Sur les versions ultérieures du PCI-Express, le débit a augmenté suffisamment pour pouvoir gérer à la fois les transferts GPU normaux et les échanges multi-GPU sans trop de casse. ===L'ATI Crossfire=== La technologie multi-GPU d'ATI/AMD était appelée le Crossfire. Elle a été développée durant les années 2000 et a progressivement évolué dans le temps. La toute première version n'était pas compatible avec toutes les cartes graphiques vendues par ATI. ATI vendait ses cartes graphiques en deux éditions : une édition Crossfire et une édition normale. Elle demandait d'utiliser une carte maitre avec une carte esclave. La carte esclave était une carte graphique normale ou Crossfire, mais la carte maitre devait obligatoirement être une carte Crossfire. La carte maitre était celle branchée sur l'écran. En tant que carte Crossfire, elle incorporait des circuits de composition d'image, afin de combiner les portions d'image calculée par elle-même avec celles calculées par la carte esclave. Cependant, les circuits de composition d'image étaient un peu faibles. Par exemple, la Radeon XT 8500 ne supportait au maximum que des résolutions de 600×1200 - 60 Hz, or 1920×1440 - 52 Hz. Vu que le taux de rafraichissement était faible à de telles résolutions, surtout pour des écrans CRT qui ont tendance à faire mal aux yeux, le Crossfire était surtout utile pour les résolutions plus basses. Dommage pour du multi-GPU, censé aider pour les hautes résolutions. Par la suite, les cartes Crossfire ont disparues et toutes les cartes graphiques ATI étaient compatibles Crossfire. La communication entre les GPU se faisait via le bus PCI Express. La technologie devint alors bien plus pratique, les cartes Crossfire étant rares et peu disponibles. Et ce malgré une petite perte en performance liée aux transferts via le PCI Express. Par la suite, l'introduction du CrossfireX ajouta le support d'un connecteur entre cartes graphiques, afin de passer outre le bus PCI Express. Cependant, cela ne dura que pour les générations des AMD HD 2000 à 7000. ATI/AMD a abandonné l'usage d'un connecteur CrossFire avec ses cartes utilisant le PCI-Express 3.0. [[File:R700 interconnect.svg|centre|vignette|upright=2|Illustration du multi-GPU où deux cartes graphiques communiquent via un lien indépendant du bus PCI-Express. On voit que le débit du lien entre les deux cartes graphique est ajouté au débit du bus PCI-Express.]] <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=L'antialiasing | prevText=L'antialiasing }}{{autocat}} </noinclude> gh2si9ctoy4cyh6um575vtinr27hicb Les cartes graphiques/L'évolution vers la programmabilité : les GPUs 0 67392 764871 763890 2026-04-24T17:49:38Z Mewtow 31375 /* Le Transform & Lighting matériel de Direct X 7.0 */ 764871 wikitext text/x-wiki Il est intéressant d'étudier le hardware des cartes graphiques en faisant un petit résumé de leur évolution dans le temps. En effet, leur hardware a fortement évolué dans le temps. Et il serait difficile à comprendre le hardware actuel sans parler du hardware d'antan. En effet, une carte graphique moderne est partiellement programmable. Certains circuits sont totalement programmables, d'autres non. Et pour comprendre pourquoi, il faut étudier comment ces circuits ont évolués. Le hardware des cartes graphiques a fortement évolué dans le temps, ce qui n'est pas une surprise. Les évolutions de la technologie, avec la miniaturisation des transistors et l'augmentation de leurs performances a permis aux cartes graphiques d'incorporer de plus en plus de circuits avec les années. Avant l'invention des cartes graphiques, toutes les étapes du pipeline graphique étaient réalisées par le processeur : il calculait l'image à afficher, et l’envoyait à une carte d'affichage 2D. Au fil du temps, de nombreux circuits furent ajoutés, afin de déporter un maximum de calculs vers la carte vidéo. Le rendu 3D moderne est basé sur le placage de texture inverse, avec des coordonnées de texture, une correction de perspective, etc. Mais les anciennes consoles et bornes d'arcade utilisaient le placage de texture direct. Et cela a impacté le hardware des consoles/PCs de l'époque. Avec le placage de texture direct, il était primordial de calculer la géométrie, mais la rasterisation était le fait de VDC améliorés. Aussi, les premières bornes d'arcade 3D et les consoles de 5ème génération disposaient processeurs pour calculer la géométrie et de circuits d'application de textures très particuliers. A l'inverse, les PC utilisaient un rendu inverse, totalement différent. Sur les PC, les premières cartes graphiques avaient un circuit de rastérisation et des unités de textures, mais pas de circuits géométriques. ==Les premières cartes graphiques, pour ''mainframes'' et stations de travail== Dès les années 70-80, le rendu 3D était utilisé par de nombreuses entreprises industrielles : des applications de visualisation 3D étaient utilisées en architecture, des applications de conception assistée par ordinateur étaient déjà d'utilisation courante, sans compter les simulateurs de vol utilisés par l'armée et les instructeurs qui formaient les pilotes d'avion. Le rendu 3D était aussi étudié au niveau académique, la recherche en 3D était déjà florissante. Il existait même du matériel spécifiquement conçu pour le rendu graphique, mais celui-ci était spécifiquement dédié à des super-calculateurs ou des ''workstations'' (des sortes d'ancêtres des PC, très puissants pour l'époque, mais conçus uniquement pour les entreprises). ===Le début des années 80 : le rendu en fils de fer=== Le tout premier système de ce genre était le '''''Line Drawing System-1''''' de l'entreprise Evans & Sutherland, daté de 1969. Ce n'est ni plus ni moins que le toute premier circuit graphique séparé du processeur ayant existé. C'est en un sens la toute première carte graphique, le tout premier GPU. Il prenait la forme d'un périphérique qui se connectait à l'ordinateur d'un côté et était relié à l'écran de l'autre. Il était compatible avec un grand nombre d'ordinateurs et de processeurs existants. Il a été suivi par plusieurs successeurs, nommés ''Picture System 1, 2'' et le ''PS300 series''. [[File:Evans & Sutherland LDS-1 (1).jpg|vignette|Evans & Sutherland LDS-1 (1)]] Ils permettaient de faire du rendu en fil de fer, sans texture ni même sans polygones colorés. Un tel rendu était utile pour des applications assez limitées : architecture, dessin de molécules pour les entreprises pharmaceutique et certains centres de recherche, l'aérospatiale, etc. Ces cartes graphiques étaient utilisées de concert avec des écrans appelés '''écrans vectoriels''' (''vector display''). Pour simplifier, ils ressemblaient à des écrans CRT, sauf que le faisceau d'électron ne balayait pas l'écran ligne par ligne, mais traçait des lignes arbitraires à l'écran. On lui précisait deux points de coordonnées x1,y1 ; et x2,y2 ; puis l'écran tracait une ligne entre ces deux points. En général, la ligne tracée était maintenue pendant un long moment, entre plusieurs secondes et plusieurs minutes. L'intérieur du circuit était assez simple : un circuit de multiplication de matrice pour les calculs géométriques, un rastériser simplifié (le ''clipping diviser''), un circuit de tracé de lignes, et un processeur de contrôle pour commander les autres circuits. Le fait que ces trois circuits soient séparés permettait une implémentation en pipeline, où plusieurs portions de l'image pouvaient être calculées en même temps : pendant que l'une est dans l'unité géométrique, l'autre est dans le rastériseur et une troisième est en cours de tracé. [[File:Lds1blockdiagram05.svg|centre|vignette|upright=2|Architecture du LDS-1. Le processeur de contrôle n'est pas représenté.]] Le processeur de contrôle exécute un programme qui se charge de commander l'unité géométrique et les autres circuits. Le programme en question est fourni par le programmeur, le LDS-1 est donc totalement programmable. Il lit directement les données nécessaires pour le rendu dans la mémoire de l’ordinateur et le programme exécuté est lui aussi en mémoire principale. Il n'a pas de mémoire vidéo dédiée, il utilise la RAM de l'ordinateur principal. Le multiplieur de matrices est plus complexe qu'on pourrait s'y attendre. Il ne s'agit pas que d'un circuit arithmétique tout simple, mais d'un véritable processeur avec des registres et des instructions machine complexes. Il contient plusieurs registres, l'ensemble mémorisant 4 matrices de 16 nombres chacune (4 lignes de 4 colonnes). Un nombre est codé sur 18 bits. Les registres sont reliés à un ensemble de circuits arithmétiques, des additionneurs et des multiplieurs. Le circuit supporte des instructions de copie entre registres, pour copier une ligne d'une matrice à une autre, des instructions LOAD/STORE pour lire ou écrire dans la mémoire RAM, etc. Il supporte aussi des multiplications en 2D et 3D. Le ''clipping divider'' est un circuit assez complexe, contenant un processeur à accumulateur, une mémoire ROM pour le programme du processeur. Le programme exécuté par le processeur est un petit programme de 62 instructions, stocké dans la ROM. L'algorithme du ''clipping divider'' est décrite dans le papier de recherche "A clipping divider", écrit par Robert Sproull. Un détail assez intéressant est que le résultat en sortie de l'unité géométrique et du rastériseur peuvent être envoyés à l'ordinateur en parallèle du rendu. C'était très utile sur les anciens ordinateurs qui étaient connectés à plusieurs terminaux. Le LDS-1 calculait la géométrie et le rendu, et le tout pouvait petre envoyé à d'autres composants, comme des terminaux, une imprimante, etc. ===Les systèmes ultérieurs : rendu à triangles colorés et texturé=== Les systèmes précédents étaient très limités : ils calculaient la géométrie et n'avaient pas de ''framebuffer'', ni de tampon de profondeur, ni gestion de l'éclairage, ni quoique ce soit. De tels systèmes étaient donc des accélérateurs géométriques que de vrais systèmes graphiques complets, du fait de l'absence de ''framebuffer''. Ils étaient composés de processeurs spécialisés dans les calculs à virgule flottante, faisant des calculs géométriques, et éventuellement d'un processeur pour la rastérisation. La raison est que la RAM était très chère et que créer des circuits fixes étaient très chers et peu disponibles. Par contre, les processeurs à virgule flottante étaient peu chers et facile à trouver. Vers la fin des années 80, grâce à la baisse du prix de la RAM et la démocratisation des ASIC (des circuits fixes fait sur mesure), ajouter un ''framebuffer'' est est devenu possible. C'est alors que sont apparus les '''systèmes de rendu 3D de première génération'''. De tels systèmes ont permis d'implémenter le rendu à primitives colorées qu'on a vu il y a quelques chapitres, à savoir un rendu où les triangles sont coloriés avec une couleur unique. Les systèmes de première génération étaient simples : des processeurs pour le calcul de la géométrie, un circuit de rastérisation, une RAM pour le ''framebuffer'' et des ASIC servant de ROPs très simples. Il n'y avait pas d'élimination des pixels cachés, pas de textures, et encore moins d'éclairage par pixels. Le premier système de ce genre était le ''Shaded Picture System'', toujours par Evans & Sutherland. Il ne gérait pas la couleur et ne pouvait afficher que des images en noir et blanc, mais il gérait l'éclairage par sommet (''vertex lighting''). Il a rapidement été dépassé par les systèmes de l'entreprise ''Silicon Graphics Inc'' (SGI), ainsi que ceux de l'entreprise Apollo avec sa série Apollo DN. Les '''systèmes de seconde génération''' sont apparus vers la fin des années 80, et se distinguent des précédents par l'ajout un tampon de profondeur. Ils intègrent aussi des capacités d'éclairage par pixel, à savoir de l'éclairage plat, de Gouraud, voire de Phong ! Enfin, les '''systèmes de troisième génération''' ont acquis des capacités de placage de texture, que les systèmes précédents n'avaient pas. Ils ont aussi ajouté un support de l'antialiasing. Les systèmes SGI avec placage de texture ont déjà été abordé au chapitre précédent, dans la section sur les GPU en mode immédiat et à ''tile''. Aussi, nous ne reviendrons pas dessus. [[File:Evolution de l'architecture des premières cartes graphiques, dans les années 80-90.png|centre|vignette|upright=2.5|Evolution de l'architecture des premières cartes graphiques, dans les années 80-90]] Les systèmes de première, seconde et troisième génération avaient de nombreux points communs. En premier lieu, ils étaient fabriqués en connectant plusieurs cartes électroniques : une carte pour les calculs géométriques, une ou plusieurs cartes pour le reste du rendu graphique, une carte dédiée au VDC et avec un connecteur écran. Les transistors de l'époque n'étaient pas encore miniaturisés, ce qui fait que le système graphique ne pouvait pas tenir sur une seule carte électronique. Il n'y avait donc pas de carte graphique proprement dit, mais un équivalent éclaté sur plusieurs cartes électroniques. La carte pour la géométrie contenait typiquement une mémoire FIFO pour accumuler les commandes de rendu, un processeur de commande, et plusieurs processeurs géométriques. Les processeurs géométriques étaient parfois conçus sur mesure, comme l'a été le le ''Geometry Engine'' de SGI. Mais il est arrivé qu'ils utilisent des processeurs commerciaux comme le Weitek 3222, l'Intel i860, etc. Les processeurs pouvaient être placés en série ou en parallèle, comme expliqué dans le chapitre précédent. Le circuit de rastérisation était réalisé soit avec un processeur dédié, soit avec un circuit fixe, soit un mélange des deux. La rastérisation est en effet réalisée en plusieurs étapes, certaines peuvent être implémentées avec un processeur et d'autres avec des circuits fixes. Un point important est qu'à l'époque, le rendu n'utilisait pas que des triangles, mais des polygones en général. Ce n'est que par la suite que le rendu s'est focalisé sur les triangles et les ''quads'' (quadrilatères). Il arrivait que le système graphique gérait partiellement des polygones concaves, voire convexes. Sur les systèmes SGI, les calculs géométriques se faisaient avec des polygones, que la rastérisation découpait en triangles, le reste du rendu se faisait avec des triangles. Les stations de travail Apollo DN 10000VS découpaient les polygones en trapézoïdes orientés à l'horizontale, alignés avec des ''scanlines''. D'autres systèmes découpaient tout en triangle lors de l'étape géométrique ==Les précurseurs grand public : les bornes d'arcade== [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] L'accélération du rendu 3D sur les bornes d'arcade était déjà bien avancé dès les années 90. Les bornes d'arcade ont toujours été un segment haut de gamme de l'industrie du jeu vidéo, aussi ce n'est pas étonnant. Le prix d'une borne d'arcade dépassait facilement les 10 000 dollars pour les plus chères et une bonne partie du prix était celui du matériel informatique. Le matériel était donc très puissant et débordait de mémoire RAM comparé aux consoles de jeu et aux PC. La plupart des bornes d'arcade utilisaient du matériel standardisé entre plusieurs bornes. A l'intérieur d'une borne d'arcade se trouve une '''carte de borne d'arcade''' qui est une carte mère avec un ou plusieurs processeurs, de la RAM, une carte graphique, un VDC et pas mal d'autres matériels. La carte est reliée aux périphériques de la borne : joysticks, écran, pédales, le dispositif pour insérer les pièces afin de payer, le système sonore, etc. Le jeu utilisé pour la borne est placé dans une cartouche qui est insérée dans un connecteur spécialisé. Les cartes de bornes d'arcade étaient généralement assez complexes, elles avaient une grande taille et avaient plus de composants que les cartes mères de PC. Chaque carte contenait un grand nombre de chips pour la mémoire RAM et ROM, et il n'était pas rare d'avoir plusieurs processeurs sur une même carte. Et il n'était pas rare d'avoir trois à quatre cartes superposées dans une seule borne. Pour ceux qui veulent en savoir plus, Fabien Sanglard a publié gratuitement un livre sur le fonctionnement des cartes d'arcade CPS System, disponible via ce lien : [https://fabiensanglard.net/b/cpsb.pdf The book of CP System]. Les premières cartes graphiques des bornes d'arcade étaient des cartes graphiques 2D auxquelles on avait ajouté quelques fonctionnalités. Les sprites pouvaient être tournés, agrandit/réduits, ou déformés pour simuler de la perspective et faire de la fausse 3D. Par la suite, le vrai rendu 3D est apparu sur les bornes d'arcade. Dès 1988, la carte d'arcade Namco System 21 et Sega Model 1 géraient les calculs géométriques. Quelques années plus tard, les cartes graphiques se sont mises à supporter un éclairage de Gouraud et du placage de texture. Par exemple, le Namco System 22 et la Sega model 2 supportaient des textures 2D et comme le filtrage de texture (bilinéaire et trilinéaire), le mip-mapping, et quelques autres. Au passage, les cartes graphiques de la Namco System 22 étaient développées en partenariat avec Eans & Sutherland, qui avait commencé à se diversifier dans le marché grand public. Les cartes graphiques de l'époque faisaient les calculs géométriques sur plusieurs processeurs, généralement des processeurs de type DSP (des processeurs spécialisés dans le traitement de signal). Par exemple, la Namco System 2 utilisait 4 DSP de marque Texas Instruments TMS320C25, cadencés à 24,576 MHz. La carte d'arcade Sega Model 1 utilisait quant à elle un DSP spécialisé dans les calculs géométriques. Par la suite, les bornes d'arcade ont réutilisé le hardware des PC et autres consoles de jeux. ==La 3D sur les consoles de quatrième/cinquième génération== Les consoles avant la quatrième génération de console étaient des consoles purement 2D, sans circuits d'accélération 3D. Leur carte graphique était un simple VDC 2D, plus ou moins performant selon la console. Les premières consoles de jeu capables de rendu 3D par elles-mêmes sont les consoles dites de 5ème génération. Il y a diverses manières de classer les consoles en générations, la plus commune place la 3D à la 5ème génération, mais détailler ces controverses quant à ce classement nous amènerait trop loin. Les consoles de génération avaient une architecture assez différente des systèmes antérieurs. Les systèmes SGI et assimilés pouvaient se permettre de couter assez cher, d'utiliser beaucoup de circuits, de prendre beaucoup de place. Les bornes d'arcade sont aussi dans ce cas. Aussi, il n'était pas rare que les cartes 3D de l'époque tiennent sur plusieurs cartes électroniques séparées. Mais une console ne peut pas se permettre ce genre de folies. Aussi, les cartes 3D des consoles de l'époque tenaient dans un seul circuit intégré, comme il est d'usage de nos jours. La conséquence est que certains circuits étaient fortement simplifiés, sur les consoles de cinquième génération. Et cela a impacté l'architecture interne des GPU des consoles. Les systèmes SGI avaient plusieurs processeurs pour calculer la géométrie, couplés à plusieurs unités non-programmables pour les pixels/textures. Les cartes 3D des consoles gardaient cette organisation : processeurs pour la géométrie, circuits fixes pour le reste. Mais elles se débrouillaient souvent avec un seul processeur, voire aucun ! Dans ce dernier cas, la géométrie était calculée sur le processeur principal, le CPU. Les unités pour les pixels étaient aussi moins nombreuses, mais il y en avait plusieurs, pour profiter de l'amplification des pixels. : Les cartes 3D des consoles de jeu utilisaient le placage de texture inverse, avec quelques exceptions qui utilisaient le placage de texture direct. ===Le rendu 3D sur les consoles de quatrième génération : la SNES=== Plus haut, j'ai dit que les consoles de quatrième génération n'avaient pas de carte accélératrice 3D. Pourtant, elles ont connus quelques jeux en vraie 3D. La raison à cela est que la 3D était calculée par un GPU placé dans les cartouches du jeu ! Par exemple, les cartouches de Starfox et de Super Mario 2 contenaient un coprocesseur Super FX, qui gérait des calculs de rendu 2D/3D. En tout, il y a environ 16 coprocesseurs pour la SNES et on en trouve facilement la liste sur le net. La console était conçue pour, des pins sur les ports cartouches étaient prévues pour des fonctionnalités de cartouche annexes, dont ces coprocesseurs. Ces pins connectaient le coprocesseur au bus des entrées-sorties. Les coprocesseurs des cartouches de NES avaient souvent de la mémoire rien que pour eux, qui était intégrée dans la cartouche. Ceci étant dit, passons aux consoles de cinquième génération. ===La Nintendo 64 : un GPU avancé=== La Nintendo 64 avait le GPU le plus complexe comparé aux autres consoles, et dépassait même les cartes graphiques des PC. Il faut dire que son GPU a été conçu avec l'aide de l'entreprise SGI, dont on a vu les systèmes graphiques plus haut. Le GPU de la N64 incorporait une unité pour les calculs géométriques, un circuit de rasterisation, une unité de textures et un ROP final pour les calculs de transparence/brouillard/antialiasing, ainsi qu'un circuit pour gérer la profondeur des pixels. En somme, tout le pipeline graphique était implémenté dans le GPU de la Nintendo 64, chose très en avance sur son temps, comparé au PC ou aux autres consoles ! Le GPU est construit autour d'un processeur dédié aux calculs géométriques, le ''Reality Signal Processor'' (RSP), autour duquel on a ajouté des circuits pour le reste du pipeline graphique. L'unité de calcul géométrique est un processeur MIPS R4000, un processeur assez courant à l'époque, auquel on avait retiré quelques fonctionnalités inutiles pour le rendu 3D. Il était couplé à 4 KB de mémoire vidéo, ainsi qu'à 4 KB de mémoire ROM. Le reste du GPU était réalisé avec des circuits fixes. Un point intéressant est que le programme exécuté par le RSP pouvait être programmé ! Le RSP gérait déjà des espèces de proto-shaders, qui étaient appelés des ''[https://ultra64.ca/files/documentation/online-manuals/functions_reference_manual_2.0i/ucode/microcode.html micro-codes]'' dans la documentation de l'époque. La ROM associée au RSP mémorise cinq à sept programmes différents, aux fonctionnalités différentes. * Les microcodes gspFast3D et gspF3DNoN, implémentent un rendu 3D normal, avec des options de ''clipping'' différentes entre les deux. * Le microcode gspTurbo3D fait la même chose, mais avec moins de fonctionnalités et avec une précision réduite. Il ne gère pas le ''clipping'', l'éclairage par pixel, la correction de perspective, l'antialiasing et quelques autres fonctionnalités. Il gère cependant l'éclairage de Gouraud. Il utilise une ''display list'' simplifiée comparé aux deux microcodes précédents. * Le microcode gspZ-Sort effectue une pré-passe z, à savoir qu'il calcule le tampon de profondeur final de la scène 3D, sans rendre l'image. Cela sert à faire une élimination des pixels cachés parfaite, en logiciel. On calcule le tampon de profondeur pour déterminer quels pixels sont visibles, puis une seconde passe rend l'image en, rejetant les pixels non-visibles. * Le microcode gspSprite2D implémente un rendu 2D émulé : les sprites et arrière-plan sont des rectangles texturés. Le microcode gspS2DEX fait la même chose, mais sert à émuler le rendu de la SNES plus qu'autre chose. * Le microcode gspLine3D ne gére que des lignes, pas de triangles. Il sert pour du rendu en fil de fer. Ils géraient le rendu 3D de manière différente et avec une gestion des ressources différentes. Très peu de studios de jeu vidéo ont développé leur propre microcodes N64, car la documentation était mal faite, que Nintendo ne fournissait pas de support officiel pour cela, que les outils de développement ne permettaient pas de faire cela proprement et efficacement. ===La Playstation 1=== Sur la Playstation 1 le calcul de la géométrie était réalisé par le processeur, la carte graphique gérait tout le reste. Et la carte graphique était un circuit fixe spécialisé dans la rasterisation et le placage de textures. Elle utilisait, comme la Nintendo 64, le placage de texture inverse, qui est apparu ensuite sur les cartes graphiques. ===La 3DO et la Sega Saturn=== La Sega Saturn et la 3DO étaient les deux seules consoles à utiliser le rendu direct. La géométrie était calculée sur le processeur, même si les consoles utilisaient parfois un CPU dédié au calcul de la géométrie. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. La Sega Saturn incorpore trois processeurs et deux GPU. Les deux GPUs sont nommés le VDP1 et le VDP2. Le VDP1 s'occupe des textures et des sprites, le VDP2 s'occupe uniquement de l'arrière-plan et incorpore un VDC tout ce qu'il y a de plus simple. Ils ne gèrent pas du tout la géométrie, qui est calculée par les trois processeurs. Le troisième processeur, la Saturn Control Unit, est un processeur de type DSP, à savoir un processeur spécialisé dans le traitement de signal. Il est utilisé presque exclusivement pour accélérer les calculs géométriques. Il avait sa propre mémoire RAM dédiée, 32 KB de SRAM, soit une mémoire locale très rapide. Les transferts entre cette RAM et le reste de l'ordinateur était géré par un contrôleur DMA intégré dans le DSP. En somme, il s'agit d'une sorte de processeur spécialisé dans la géométrie, une sorte d'unité géométrique programmable. Mais la géométrie n'était pas forcément calculée que sur ce DSP, mais pouvait être prise en charge par les 3 CPU. ==L'historique des cartes graphiques pour PC== Sur PC, l'évolution des cartes graphiques a eu du retard par rapport aux consoles. Les PC sont en effet des machines multi-usage, pour lesquelles le jeu vidéo était un cas d'utilisation parmi tant d'autres. Et les consoles étaient la plateforme principale pour jouer à des jeux vidéo, le jeu vidéo PC étant plus marginal. Mais cela ne veut pas dire que le jeu PC n'existait pas, loin de là ! Un problème pour les jeux PC était que l'écosystème des PC était aussi fragmenté en plusieurs machines différentes : machines Apple 1 et 2, ordinateurs Commdore et Amiga, IBM PC et dérivés, etc. Aussi, programmer des jeux PC n'était pas mince affaire, car les problèmes de compatibilité étaient légion. C'est seulement quand la plateforme x86 des IBM PC s'est démocratisée que l'informatique grand public s'est standardisée, réduisant fortement les problèmes de compatibilité. Mais cela n'a pas suffit, il a aussi fallu que les API 3D naissent. Les API 3D comme Direct X et Open GL sont absolument cruciales pour garantir la compatibilité entre plusieurs ordinateurs aux cartes graphiques différentes. Aussi, l'évolution des cartes graphiques pour PC s'est faite main dans la main avec l'évolution des API 3D. Les fonctionnalités des cartes graphiques ont évolué dans le temps, en suivant les évolutions des API 3D. Du moins dans les grandes lignes, car il est arrivé plusieurs fois que des fonctionnalités naissent sur les cartes graphiques, pour que les fabricants forcent la main de Microsoft ou d'Open GL pour les intégrer de force dans les API 3D. Passons. ===L'introduction des premiers jeux 3D : Quake et les drivers miniGL=== L'API OpenGL est née de la main de SGI, encore eux ! SGI avait créé l'API Iris GL pour ses stations de travail Iris Graphics. Iris GL a ensuite été libéré et est devenu le standard Open GL. Open GL existait déjà avant l'apparition des cartes accélératrices 3D. Il y a avait donc déjà un terreau que les programmeurs graphiques pouvaient utiliser. Mais Open GL était surtout utilisé pour des applications industrielles, médicales (imagerie), graphiques ou militaires, pas pour le jeu vidéo. Mais cela changea avec la sortie du jeu Quake, d'IdSoftware, en 1996. Quake pouvait fonctionner en rendu logiciel, mais le programmeur responsable du moteur 3D (le célébre John Carmack) ajouta une version OpenGL du jeu. Il faut dire que le jeu était programmé sur une station de travail compatible avec OpenGL, même si aucune carte accélératrice de l'époque ne supportait OpenGL. C'était là un choix qui se révéla visionnaire. En théorie, le rendu par OpenGL aurait dû se faire intégralement en logiciel, sauf sur quelques rares stations de travail adaptées. Mais les premières cartes graphiques étaient déjà dans les starting blocks. La toute première carte 3D pour PC est la '''Rendition Vérité V1000''', sortie en Septembre 1995, soit quelques mois avant l'arrivée de la Nintendo 64. La Rendition Vérité V1000 contenait un processeur MIPS cadencé à 25 MHz, 4 mébioctets de RAM, une ROM pour le BIOS, et un RAMDAC, rien de plus. C'était un vrai ordinateur complètement programmable de bout en bout, sans aucun circuit fixe. Les programmeurs ne pouvaient cependant pas utiliser cette programmabilité avec des ''shaders'', mais elle permettait à Rendition d'implémenter n'importe quelle API 3D, que ce soit OpenGL, DirectX ou même sa son API propriétaire. La Rendition Vérité avait de bonnes performances pour ce qui est de la géométrie, mais pas pour le reste. Réaliser la rastérisation et le placage de texture en logiciel n'est pas efficace, pareil pour les opérations de fin de pipeline comme l'antialiasing. Le manque d'unités fixes très rapides pour la rastérisation, le placage de texture ou les opérations de fin de pipeline était clairement un gros défaut. Mais la Rendition Vérité était un cas à part, une exception dans le paysage des cartes 3D de l'époque, qui ne faisait rien comme les autres. Les autres cartes graphiques, sorties peu après, étaient les Voodoo de 3dfx, les Riva TNT de NVIDIA, les Rage/3D d'ATI, la Virge/3D de S3, et la Matrox Mystique. Elles avaient choisit le compromis inverse de la Rendition Vérité V1000 : de bonnes performances pour le placage de textures et la rastérization, mais pas pour les calculs géométriques. Pour rappel, les systèmes professionnels et les consoles avaient des processeurs pour la géométrie, et des circuits fixes pour le reste. Les cartes graphiques de PC se passaient des processeurs pour la géométrie, les calculs géométriques étaient réalisés par le CPU. Les toutes premières cartes 3D pour PC contenaient seulement des circuits pour gérer les textures et des ROPs. Elle géraient le ''z-buffer'' en mémoire vidéo, ainsi que des effets de brouillard. Il n'y avait même pas de circuit pour la rastérisation, qui était faite en logiciel, avec les calculs géométriques. [[File:Architecture de base d'une carte 3D - 2.png|centre|vignette|upright=1.5|Carte 3D sans rasterization matérielle.]] Les cartes suivantes ajoutèrent une gestion des étapes de ''rasterization'' directement en matériel. Les cartes ATI rage 2, les Invention de chez Rendition, et d'autres cartes graphiques supportaient la rasterisation en hardware. [[File:Architecture de base d'une carte 3D - 3.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] Pour exploiter les unités de texture et le circuit de rastérisation, OpenGL et Direct 3D étaient partiellement implémentées en logiciel, car les cartes graphiques ne supportaient pas toutes les fonctionnalités de l'API. C'était l'époque du miniGL, des implémentations partielles d'OpenGL, fournies par les fabricants de cartes 3D, implémentées dans les pilotes de périphériques de ces dernières. Les fonctionnalités d'OpenGL implémentées dans ces pilotes étaient presque toutes exécutées en matériel, par la carte graphique. Avec l'évolution du matériel, les pilotes de périphériques devinrent de plus en plus complets, au point de devenir des implémentations totales d'OpenGL. Mais au-delà d'OpenGL, chaque fabricant de carte graphique avait sa propre API propriétaire, qui était gérée par leurs pilotes de périphériques (''drivers''). Par exemple, les premières cartes graphiques de 3dfx interactive, les fameuses voodoo, disposaient de leur propre API graphique, l'API Glide. Elle facilitait la gestion de la géométrie et des textures, ce qui collait bien avec l'architecture de ces cartes 3D. Mais ces API propriétaires tombèrent rapidement en désuétude avec l'évolution de DirectX et d'OpenGL. Direct X était une API dans l'ombre d'Open GL. La première version de Direct X qui supportait la 3D était DirectX 2.0 (juin 2, 1996), suivie rapidement par DirectX 3.0 (septembre 1996). Elles dataient d'avant le jeu Quake, et elles étaient très éloignées du hardware des premières cartes graphiques. Elles utilisaient un système d'''execute buffer'' pour communiquer avec la carte graphique, Microsoft espérait que le matériel 3D implémenterait ce genre de système. Ce qui ne fu pas le cas. Direct X 4.0 a été abandonné en cours de développement pour laisser à une version 5.0 assez semblable à la 2.0/3.0. Le mode de rendu laissait de côté les ''execute buffer'' pour coller un peu plus au hardware de l'époque. Mais rien de vraiment probant comparé à Open GL. Même Windows utilisait Open GL au lieu de Direct X maison... C'est avec Direct X 6.0 que Direct X est entré dans la cours des grands. Il gérait la plupart des technologies supportées par les cartes graphiques de l'époque. ===Le ''multi-texturing'' de l'époque Direct X 6.0 : combiner plusieurs textures=== Une technologie très importante standardisée par Dirext X 6 est la technique du '''''multi-texturing'''''. Avec ce qu'on a dit dans le chapitre précédent, vous pensez sans doute qu'il n'y a qu'une seule texture par objet, qui est plaquée sur sa surface. Mais divers effet graphiques demandent d'ajouter des textures par dessus d'autres textures. En général, elles servent pour ajouter des détails, du relief, sur une surface pré-existante. Un exemple intéressant vient des jeux de tir : ajouter des impacts de balles sur les murs. Pour cela, on plaque une texture d'impact de balle sur le mur, à la position du tir. Il s'agit là d'un exemple de '''''decals''''', des petites textures ajoutées sur les murs ou le sol, afin de simuler de la poussière, des impacts de balle, des craquelures, des fissures, des trous, etc. Les textures en question sont de petite taille et se superposent à une texture existante, plus grande. Rendre des ''decals'' demande de pouvoir superposer deux textures. Direct X 6.0 supportait l'application de plusieurs textures directement dans le matériel. La carte graphique devait être capable d'accéder à deux textures en même temps, ou du moins faire semblant que. Pour cela, elle doublaient les unités de texture et adaptaient les connexions entre unités de texture et mémoire vidéo. La mémoire vidéo devait être capable de gérer plusieurs accès mémoire en même temps et devait alors avoir un débit binaire élevé. [[File:Multitexturing.png|centre|vignette|upright=2|Multitexturing]] La carte graphique devait aussi gérer de quoi combiner deux textures entre elles. Par exemple, pour revenir sur l'exemple d'une texture d'impact de balle, il faut que la texture d'impact recouvre totalement la texture du mur. Dans ce cas, la combinaison est simple : la première texture remplace l'ancienne, là où elle est appliquée. Mais les cartes graphiques ont ajouté d'autres combinaisons possibles, par exemple additionner les deux textures entre elle, faire une moyenne des texels, etc. Les opérations pour combiner les textures était le fait de circuits appelés des '''''combiners'''''. Concrètement, les ''combiners'' sont de simples unités de calcul. Les ''conbiners'' ont beaucoup évolués dans le temps, mais les premières implémentation se limitaient à quelques opérations simples : addition, multiplication, superposition, interpolation. L'opération effectuer était envoyée au ''conbiner'' sur une entrée dédiée. [[File:Multitexturing avec combiners.png|centre|vignette|upright=2|Multitexturing avec combiners]] S'il y avait eu un seul ''conbiner'', le circuit de ''multitexturing'' aurait été simplement configurable. Mais dans la réalité, les premières cartes utilisant du ''multi-texturing'' utilisaient plusieurs ''combiners'' placés les uns à la suite des autres. L'implémentation des ''combiners'' retenue par Open Gl, et par le hardware des cartes graphiques, était la suivante. Les ''combiners'' étaient placés en série, l'un à la suite de l'autre, chacun combinant le résultat de l'étage précédent avec une texture. Le premier ''combiner'' gérait l'éclairage par sommet, afin de conserver un minimum de rétrocompatibilité. [[File:Texture combiners Open GL.png|centre|vignette|upright=2|Texture combiners Open GL]] Voici les opérations supportées par les ''combiners'' d'Open GL. Ils prennent en entrée le résultat de l'étage précédent et le combinent avec une texture lue depuis l'unité de texture. {|class="wikitable" |+ Opérations supportées par les ''combiners'' d'Open GL |- ! Replace | colspan="2" | Pixel provenant de l'unité de texture |- ! Addition | colspan="2" | Additionne l'entrée au texel lu. |- ! Modulate | colspan="2" | Multiplie l'entrée avec le texel lu |- ! Mélange (''blending'') | Moyenne pondérée des deux entrées, pondérée par la composante de transparence || La couleur de transparence du texel lu et de l'entrée sont multipliées. |- ! Decals | Moyenne pondérée des deux entrées, pondérée par la composante de transparence. || La transparence du résultat est celle de l'entrée. |} Il faut noter qu'un dernier étage de ''combiners'' s'occupait d'ajouter la couleur spéculaire et les effets de brouillards. Il était à part des autres et n'était pas configurable, c'était un étage fixe, qui était toujours présent, peu importe le nombre de textures utilisé. Il était parfois appelé le '''''combiner'' final''', terme que nous réutiliserons par la suite. Mine de rien, cela a rendu les cartes graphiques partiellement programmables. Le fait qu'il y ait des opérations enchainées à la suite, opérations qu'on peut choisir librement, suffit à créer une sorte de mini-programme qui décide comment mélanger plusieurs textures. Mais il y avait une limitation de taille : le fait que les données soient transmises d'un étage à l'autre, sans détours possibles. Par exemple, le troisième étage ne pouvait avoir comme seule opérande le résultat du second étage, mais ne pouvait pas utiliser celui du premier étage. Il n'y avait pas de registres pour stocker ce qui sortait de la rastérisation, ni pour mémoriser temporairement les texels lus. ===Le ''Transform & Lighting'' matériel de Direct X 7.0=== La première carte graphique pour PC capable de gérer la géométrie en hardware fût la Geforce 256, la toute première Geforce. Son unité de gestion de la géométrie n'est autre que la bien connue '''unité T&L''' (''Transform And Lighting''). Elle implémentait des algorithmes d'éclairage de la scène 3D assez simples, comme un éclairage de Gouraud, qui étaient directement câblés dans ses circuits. Mais contrairement à la Nintendo 64 et aux bornes d'arcade, elle implémentait le tout, non pas avec un processeur classique, mais avec des circuits fixes. Avec Direct X 7.0 et Open GL 1.0, l'éclairage était en théorie limité à de l'éclairage par sommet, l'éclairage par pixel n'était pas implémentable en hardware. Les cartes graphiques ont tenté d'implémenter l'éclairage par pixel, mais cela n'est pas allé au-delà du support de quelques techniques de ''bump-mapping'' très limitées. Par exemple, Direct X 6.0 implémentait une forme limitée de ''bump-mapping'', guère plus. Un autre problème est qu'il a beaucoup d'algorithmes d'éclairages différents, aux résultats visuels différents, bien au-delà des algorithmes d'éclairage plat, de Gouraud et de Phong. Et les unités de T&L étaient souvent en retard sur les algorithmes logiciels. Les programmeurs avaient le choix entre programmer les algorithmes d’éclairage qu'ils voulaient et les exécuter en logiciel, ou utiliser ceux de l'unité de T&L. Ils choisissaient souvent la première option. Par exemple, Quake 3 Arena et Unreal Tournament n'utilisaient pas les capacités d'éclairage géométrique et préféraient utiliser leurs calculs d'éclairage logiciel fait maison. Cependant, le hardware dépassait les capacités des API et avait déjà commencé à ajouter des capacités de programmation liées au ''multi-texturing''. Les cartes graphiques de l'époque, surtout chez NVIDIA, implémentaient un système de '''''register combiners''''', une forme améliorée de ''texture combiners'', qui permettait de faire une forme limitée d'éclairage par pixel, notamment du vrai ''bump-mampping'', voire du ''normal-mapping''. Mais ce n'était pas totalement supporté par les API 3D de l'époque. Les ''registers combiners'' sont des ''texture combiners'' mais dans lesquels ont aurait retiré la stricte organisation en série. Il y a toujours plusieurs étages à la suite, qui peuvent exécuter chacun une opération, mais tous les étages ont maintenant accès à toutes les textures lues et à tout ce qui sort de la rastérisation, pas seulement au résultat de l'étape précédente. Pour cela, on ajoute des registres pour mémoriser ce qui sort des unités de texture, et pour ce qui sort de la rastérisation. De plus, on ajoute des registres temporaires pour mémoriser les résultats de chaque ''combiner'', de chaque étage. Il faut cependant signaler qu'il existe un ''combiner'' final, séparé des étages qui effectuent des opérations proprement dits. Il s'agit de l'étage qui applique la couleur spéculaire et les effets de brouillards. Il ne peut être utilisé qu'à la toute fin du traitement, en tant que dernier étage, on ne peut pas mettre d'opérations après lui. Sa sortie est directement connectée aux ROPs, pas à des registres. Il faut donc faire la distinction entre les '''''combiners'' généraux''' qui effectuent une opération et mémorisent le résultat dans des registres, et le ''combiner'' final qui envoie le résultat aux ROPs. L'implémentation des ''register combiners'' utilisait un processeur spécialisés dans les traitements sur des pixels, une sorte de proto-processeur de ''shader''. Le processeur supportait des opérations assez complexes : multiplication, produit scalaire, additions. Il s'agissait d'un processeur de type VLIW, qui sera décrit dans quelques chapitres. Mais ce processeur avait des programmes très courts. Les premières cartes NVIDIA, comme les cartes TNT pouvaient exécuter deux opérations à la suite, suivie par l'application de la couleurs spéculaire et du brouillard. En somme, elles étaient limitées à un ''shader'' à deux/trois opérations, mais c'était un début. Le nombre d'opérations consécutives est rapidement passé à 8 sur la Geforce 3. [[File:Architecture de base d'une carte 3D - 4.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] ===L'arrivée des ''shaders'' avec Direct X 8.0=== [[File:Architecture de la Geforce 3.png|vignette|upright=1.5|Architecture de la Geforce 3]] Les ''register combiners'' était un premier pas vers un éclairage programmable. Paradoxalement, l'évolution suivante s'est faite non pas dans l'unité de rastérisation/texture, mais dans l'unité de traitement de la géométrie. La Geforce 3 a remplacé l'unité de T&L par un processeur capable d'exécuter des programmes. Les programmes en question complétaient l'unité de T&L, afin de pouvoir rajouter des techniques d'éclairage plus complexes. Le tout a permis aussi d'ajouter des animations, des effets de fourrures, des ombres par ''shadow volume'', des systèmes de particule évolués, et bien d'autres. À partir de la Geforce 3 de Nvidia, les cartes graphiques sont devenues capables d'exécuter des programmes appelés '''''shaders'''''. Le terme ''shader'' vient de ''shading'' : ombrage en anglais. Grace aux ''shaders'', l'éclairage est devenu programmable, il n'est plus géré par des unités d'éclairage fixes mais été laissé à la créativité des programmeurs. Les programmeurs ne sont plus vraiment limités par les algorithmes d'éclairage implémentés dans les cartes graphiques, mais peuvent implémenter les algorithmes d'éclairage qu'ils veulent et peuvent le faire exécuter directement sur la carte graphique. Les ''shaders'' sont classifiés suivant les données qu'ils manipulent : '''''pixel shader''''' pour ceux qui manipulent des pixels, '''''vertex shaders''''' pour ceux qui manipulent des sommets. Les premiers sont utilisés pour implémenter l'éclairage par pixel, les autres pour gérer tout ce qui a trait à la géométrie, pas seulement l'éclairage par sommets. Direct X 8.0 avait un standard pour les shaders, appelé ''shaders 1.0'', qui correspondait parfaitement à ce dont était capable la Geforce 3. Il standardisait les ''vertex shaders'' de la Geforce 3, mais il a aussi renommé les ''register combiners'' comme étant des ''pixel shaders'' version 1.0. Les ''register combiners'' n'ont pas évolués depuis la Geforce 256, si ce n'est que les programmes sont passés de deux opérations successives à 8, et qu'il y avait possibilité de lire 4 textures en ''multitexturing''. A l'opposé, le processeur de ''vertex shader'' de la Geforce 3 était capable d'exécuter des programmes de 128 opérations consécutives et avait 258 registres différents ! Des ''pixels shaders'' plus évolués sont arrivés avec l'ATI Radeon 8500 et ses dérivés. Elle incorporait la technologie ''SMARTSHADER'' qui remplacait les ''registers combiners'' par un processeur de ''shader'' un peu limité. Un point est que le processeur acceptait de calculer des adresses de texture dans le ''pixel shader''. Avant, les adresses des texels à lire étaient fournis par l'unité de rastérisation et basta. L'avantage est que certains effets graphiques étaient devenus possibles : du ''bump-mapping'' avancé, des textures procédurales, de l'éclairage par pixel anisotrope, du éclairage de Phong réel, etc. Avec la Radeon 8500, le ''pixel shader'' pouvait calculer des adresses, et lire les texels associés à ces adresses calculées. Les ''pixel shaders'' pouvaient lire 6 textures, faire 8 opérations sur les texels lus, puis lire 6 textures avec les adresses calculées à l'étape précédente, et refaire 8 opérations. Quelque chose de limité, donc, mais déjà plus pratique. Les ''pixel shaders'' de ce type ont été standardisé dans Direct X 8.1, sous le nom de ''pixel shaders 1.4''. Encore une fois, le hardware a forcé l'intégration dans une API 3D. ===Les ''shaders'' de Direct X 9.0 : de vrais ''pixel shaders''=== Avec Direct X 9.0, les ''shaders'' sont devenus de vrais programmes, sans les limitations des ''shaders'' précédents. Les ''pixels shaders'' sont passés à la version 2.0, idem pour les ''vertex shaders''. Concrètement, ils ont des fonctionnalités bien supérieures à celles des ''registers combiners''. Les ''shaders'' pouvaient exécuter une suite d'opérations arbitraire, dans le sens où elle n'était pas structurée avec tel type d'opération au début, suivie par un accès aux textures, etc. On pouvait mettre n'importe quelle opération dans n'importe quel ordre. De plus, les ''shaders'' ne sont plus écrit en assembleur comme c'était le cas avant. Ils sont dorénavant écrits dans un langage de haut-niveau, le HLSL pour les shaders Direct X et le GLSL pour les shaders Open Gl. Les ''shaders'' sont ensuite traduit (compilés) en instructions machines compréhensibles par la carte graphique. Au début, ces langages et la carte graphique supportaient uniquement des opérations simples. Mais au fil du temps, les spécifications de ces langages sont devenues de plus en plus riches à chaque version de Direct X ou d'Open Gl, et le matériel en a fait autant. Le matériel s'est alors adapté, en incorporant un véritable processeur pour les ''pixel shaders''. Les ''pixel shaders'' sont maintenant exécutés par un processeur de ''shader'' dédié, aux fonctionnalités bien supérieures à celles des ''registers combiners''. Le processeur de ''pixel shader'' incorpore l'unité de texture en sont sein, les deux sont fusionnés. La raison à cela sera expliqué dans la suite du chapitre. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=1.5|Carte 3D avec pixels et vertex shaders non-unifiés.]] ===L'après Direct X 9.0 : GPGPU et shaders unifiés=== Avant Direct X 10, les processeurs de ''shaders'' ne géraient pas exactement les mêmes opérations pour les processeurs de ''vertex shader'' et de ''pixel shader''. Les processeurs de ''vertex shader'' et de ''pixel shader''étaient séparés. Depuis DirectX 10, ce n'est plus le cas : le jeu d'instructions a été unifié entre les vertex shaders et les pixels shaders, ce qui fait qu'il n'y a plus de distinction entre processeurs de vertex shaders et de pixels shaders, chaque processeur pouvant traiter indifféremment l'un ou l'autre. [[File:Architecture de base d'une carte 3D - 6.png|centre|vignette|upright=1.5|Architecture de la GeForce 6800.]] Les GPU modernes sont capables d’exécuter des programmes informatiques qui n'ont aucun lien avec le rendu 3D, comme des calculs scientifiques, tout ce qui implique des réseaux de neurones, de l'imagerie médicale, etc. De manière générale, tout calcul faisant usage d'un grand nombre de calculs sur des matrices ou des vecteurs est concerné. L'usage d'une carte graphique pour autre chose que le rendu 3D porte le nom de '''GPGPU''', ''General Processing GPU''. En soi, le GPGPU est assez logique : les processeurs de shaders, bien que conçus avec le rendu 3D en tête, n'en restent pas moins des processeurs assez puissants. Pour ce genre d'utilisations, les GPU actuel supportent des ''shaders'' sans lien avec le rendu 3D, appelés des ''compute shader''. ==Les cartes graphiques d'aujourd'hui== Les circuits d'un GPU ont beaucoup évolué depuis l'introduction des ''shaders'', pour devenir de plus en plus programmables. Mais à côté des processeurs de ''shaders'', il reste quelques circuits non-programmables appelés des circuits fixes. La rastérisation, le placage de texture, l'élimination des pixels cachés et le mélange ''alpha'' sont gérés par des circuits fixes. [[File:3D-Pipeline.svg|centre|vignette|upright=3.0|Pipeline 3D : ce qui est programmable et ce qui ne l'est pas dans une carte graphique moderne.]] Mais pourquoi ne pas tout rendre programmable ? Ou au contraire, utiliser seulement des circuits fixes ? La réponse n'est pas la même pour les ROPs, le rastériseur, et les unités de texture. Pour simplifier, la réponse rapide est qu'il s'agit d'un compromis entre flexibilité et performance qui permet d'avoir le meilleur des deux mondes. Mais ce compromis a fortement évolué dans le temps, comme on va le voir plus bas. Rendre l'éclairage programmable permet d'implémenter facilement un grand nombre d'effets graphiques sans avoir à les implémenter en hardware. Avant les ''shaders'', les effets graphiques derniers cri n'étaient disponibles que sur les derniers modèles de carte graphique. Avec des ''vertex/pixel shaders'', ce genre de défaut est passé à la trappe. Si un nouvel algorithme de rendu graphique est inventé, il peut être utilisé dès le lendemain sur toutes les cartes graphiques modernes. De plus, implémenter beaucoup d'algorithmes d'éclairage différents avec des circuits fixes a un cout en termes de transistors, alors qu'utiliser des circuits programmable a un cout en hardware plus limité. Tout cela est à l'exact opposé de ce qu'on a avec les autres circuits, comme les circuits pour la rastérisation ou le placage de texture. Il n'y a pas 36 façons de rastériser une scène 3D et la flexibilité n'est pas un besoin important pour cette opération, alors que les performances sont cruciales. Même chose pour le placage/filtrage de textures. En conséquences, les unités de rastérisation et de texture sont toutes implémentées en matériel. Faire ainsi permet de gagner en performance sans que cela ait le moindre impact pour le programmeur. Reste à expliquer dans le détail pourquoi. Le cas du ROP est plus complexe et on en reparlera dans un chapitre dédié. Mais pour simplifier, c'est parce que les GPU actuels sont de type ''sort-last'', comme vu dans le chapitre précédent. Il trient les pixels suivant leur position à l'écran à la toute fin du pipeline, et ce tri ne peut pas être rendu programmable. ===Les unités de texture sont intégrées aux processeurs de shaders=== Avec l'arrivée des processeurs de shaders, les unités de texture ont été intégrées dans les processeurs de shaders eux-mêmes. C'est la seule unité fixe qui a subit ce traitement, et il est intéressant de comprendre pourquoi. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=2|Architecture de base d'une carte 3D.]] Pour cela, il faut faire un rappel sur ce qu'il y a dans un processeur. Un processeur contient globalement quatre circuits : * une unité de calcul qui fait des calculs ; * des registres pour stocker les opérandes et résultats des calculs ; * une unité de communication avec la mémoire ; * et un séquenceur, un circuit de contrôle qui commande les autres. L'unité de communication avec la mémoire sert à lire ou écrire des données, à les transférer de la RAM vers les registres, ou l'inverse. Lire une donnée demande d'envoyer son adresse à la RAM, qui répond en envoyant la donnée lue. Elle est donc toute indiquée pour lire une texture : lire une texture n'est qu'un cas particulier de lecture de données. Les texels à lire sont à une adresse précise, la RAM répond à la lecture avec le texel demandé. Il est donc possible d'utiliser l'unité de communication avec la mémoire comme si c'était une unité de texture. Cependant, les textures ne sont pas utilisées comme telles de nos jours. Le rendu 3D moderne utilise des techniques dites de filtrage de texture, qui permettent d'améliorer la qualité du rendu des textures. Sans ce filtrage de texture, les textures appliquées naïvement donnent un résultat assez pixelisé et assez moche, pour des raisons assez techniques. Le filtrage élimine ces artefacts, en utilisant une forme d'''antialiasing'' interne aux textures, le fameux filtrage de texture. Le filtrage de texture peut être réalisé en logiciel ou en matériel. Techniquement, il est possible de le faire dans un ''shader''. Le ''shader'' calcule les adresses des texels à lire, lit les texels, et effectue ensuite le filtrage avec des opérations de calcul. Mais ce n'est pas ce qui est fait, le filtrage de texture est toujours effectué directement en matériel. La raison est que le filtrage de texture est très simple à implémenter en hardware. Le filtrage bilinéaire ou trilinéaire demande juste des circuits d'interpolation et quelques registres, ce qui est trivial. Et la seconde raison est qu'il n'y a pas 36 façons de filtrer des textures : une carte graphique peut implémenter les algorithmes principaux existants en assez peu de circuits. Pour simplifier l'implémentation, les processeurs de ''shader'' modernes disposent d'une unité d'accès mémoire séparée de l'unité de texture. L'unité d'accès mémoire normale s'occupe des accès mémoire hors-textures, alors que l'unité mémoire s'occupe de lire les textures. L'unité de texture contient de quoi faire du filtrage de texture, mais aussi faire des calculs d'adresse spécialisées, intrinsèquement liés au format des textures, qu'on détaillera dans le chapitre sur les textures. En comparaison, les unités d'accès mémoire effectuent des calculs d'adresse plus basiques. Un dernier avantage est que l'unité de texture est reliée au cache de texture, alors que l'unité d'accès mémoire est relié au cache L1/L2. ===Le projet Larrabee d'Intel : une programmabilité maximale=== Pour finir, nous allons parler d'un ancien projet d'Intel, qui ne s'est pas matérialisé : le projet Larrabee. Il s'agissait d'un projet de GPU, qui a été annulé en 2009 avant d'être commercialisé. Le GFU avait pour particularité de limiter les circuits fixes au minimum. Il ne gardait qu'une unité de texture, les ROPs et le rastériseur étaient émulés en logiciel. L'unité de texture n'était pas intégrée aux processeurs de shader, mais en était séparée. Le GPU était composé de plusieurs centaines de processeurs, reliés entre eux avec un réseau d'interconnexion assez complexe. L'unité de texture était connectée sur ce réseau d'interconnexion, de même que le VDC et l'interface avec le bus. [[File:Larrabee slide block diagram.svg|centre|vignette|upright=2.5|Larrabee, diagramme. Les processeurs de shaders sont en orange.]] Un autre point important est que les processeurs utilisés étaient des processeurs x86, les mêmes que ceux utilisés comme CPU dans nos PCs. Le choix d'utiliser des CPU x86 peut sembler étrange, ceux-ci ayant des instructions qui ne servaient à rien pour le rendu 3D, mais qui consommaient une partie du budget en transistors. Mais cela se comprend quand on sait que le GPU était prévu à la fois pour le GPGPU et le rendu 3D. Utiliser des processeurs x86 était très intéressant pour le GPGPU, cela assurait une certaine forme de compatibilité, sans compter que les programmeurs PC sont familiers avec le x86. Pour gérer le problème mentionné plus haut avec les ROPs, Larrabee simulait un GPU de type ''Tile Based Rendering'', où l'écran est divisé en ''tiles'', et la rastérisation se fait ''tile'' par ''tile''. L'émulation logicielle des ROPs était nettement plus simple avec ce genre d'émulation. Mais le logiciel qui émulait les ROPs et le rastériseur était programmé pour éviter ce genre de problèmes. Le projet a été annulé en 2009, sans doute parce qu'il n’arrivait pas à obtenir des performances acceptables. Mais larrabee été recyclé pour donner les Xeon Phi, des cartes d'extension utilisées pour des serveurs, du calcul scientifique ou intensif, ou d'autres usages. Les circuits de rendu 3D avaient été retirées de ces cartes, qui ne faisaient que du calcul. {{NavChapitre | book=Les cartes graphiques | prev=Avant les GPUs : les cartes accélératrices 3D | prevText=Avant les GPUs : les cartes accélératrices 3D | next=Les processeurs de shaders | nextText=Les processeurs de shaders }} {{autocat}} 7hgu1k43wwu6gxs327oxy2b8vg11n6r 764872 764871 2026-04-24T17:49:56Z Mewtow 31375 /* L'arrivée des shaders avec Direct X 8.0 */ 764872 wikitext text/x-wiki Il est intéressant d'étudier le hardware des cartes graphiques en faisant un petit résumé de leur évolution dans le temps. En effet, leur hardware a fortement évolué dans le temps. Et il serait difficile à comprendre le hardware actuel sans parler du hardware d'antan. En effet, une carte graphique moderne est partiellement programmable. Certains circuits sont totalement programmables, d'autres non. Et pour comprendre pourquoi, il faut étudier comment ces circuits ont évolués. Le hardware des cartes graphiques a fortement évolué dans le temps, ce qui n'est pas une surprise. Les évolutions de la technologie, avec la miniaturisation des transistors et l'augmentation de leurs performances a permis aux cartes graphiques d'incorporer de plus en plus de circuits avec les années. Avant l'invention des cartes graphiques, toutes les étapes du pipeline graphique étaient réalisées par le processeur : il calculait l'image à afficher, et l’envoyait à une carte d'affichage 2D. Au fil du temps, de nombreux circuits furent ajoutés, afin de déporter un maximum de calculs vers la carte vidéo. Le rendu 3D moderne est basé sur le placage de texture inverse, avec des coordonnées de texture, une correction de perspective, etc. Mais les anciennes consoles et bornes d'arcade utilisaient le placage de texture direct. Et cela a impacté le hardware des consoles/PCs de l'époque. Avec le placage de texture direct, il était primordial de calculer la géométrie, mais la rasterisation était le fait de VDC améliorés. Aussi, les premières bornes d'arcade 3D et les consoles de 5ème génération disposaient processeurs pour calculer la géométrie et de circuits d'application de textures très particuliers. A l'inverse, les PC utilisaient un rendu inverse, totalement différent. Sur les PC, les premières cartes graphiques avaient un circuit de rastérisation et des unités de textures, mais pas de circuits géométriques. ==Les premières cartes graphiques, pour ''mainframes'' et stations de travail== Dès les années 70-80, le rendu 3D était utilisé par de nombreuses entreprises industrielles : des applications de visualisation 3D étaient utilisées en architecture, des applications de conception assistée par ordinateur étaient déjà d'utilisation courante, sans compter les simulateurs de vol utilisés par l'armée et les instructeurs qui formaient les pilotes d'avion. Le rendu 3D était aussi étudié au niveau académique, la recherche en 3D était déjà florissante. Il existait même du matériel spécifiquement conçu pour le rendu graphique, mais celui-ci était spécifiquement dédié à des super-calculateurs ou des ''workstations'' (des sortes d'ancêtres des PC, très puissants pour l'époque, mais conçus uniquement pour les entreprises). ===Le début des années 80 : le rendu en fils de fer=== Le tout premier système de ce genre était le '''''Line Drawing System-1''''' de l'entreprise Evans & Sutherland, daté de 1969. Ce n'est ni plus ni moins que le toute premier circuit graphique séparé du processeur ayant existé. C'est en un sens la toute première carte graphique, le tout premier GPU. Il prenait la forme d'un périphérique qui se connectait à l'ordinateur d'un côté et était relié à l'écran de l'autre. Il était compatible avec un grand nombre d'ordinateurs et de processeurs existants. Il a été suivi par plusieurs successeurs, nommés ''Picture System 1, 2'' et le ''PS300 series''. [[File:Evans & Sutherland LDS-1 (1).jpg|vignette|Evans & Sutherland LDS-1 (1)]] Ils permettaient de faire du rendu en fil de fer, sans texture ni même sans polygones colorés. Un tel rendu était utile pour des applications assez limitées : architecture, dessin de molécules pour les entreprises pharmaceutique et certains centres de recherche, l'aérospatiale, etc. Ces cartes graphiques étaient utilisées de concert avec des écrans appelés '''écrans vectoriels''' (''vector display''). Pour simplifier, ils ressemblaient à des écrans CRT, sauf que le faisceau d'électron ne balayait pas l'écran ligne par ligne, mais traçait des lignes arbitraires à l'écran. On lui précisait deux points de coordonnées x1,y1 ; et x2,y2 ; puis l'écran tracait une ligne entre ces deux points. En général, la ligne tracée était maintenue pendant un long moment, entre plusieurs secondes et plusieurs minutes. L'intérieur du circuit était assez simple : un circuit de multiplication de matrice pour les calculs géométriques, un rastériser simplifié (le ''clipping diviser''), un circuit de tracé de lignes, et un processeur de contrôle pour commander les autres circuits. Le fait que ces trois circuits soient séparés permettait une implémentation en pipeline, où plusieurs portions de l'image pouvaient être calculées en même temps : pendant que l'une est dans l'unité géométrique, l'autre est dans le rastériseur et une troisième est en cours de tracé. [[File:Lds1blockdiagram05.svg|centre|vignette|upright=2|Architecture du LDS-1. Le processeur de contrôle n'est pas représenté.]] Le processeur de contrôle exécute un programme qui se charge de commander l'unité géométrique et les autres circuits. Le programme en question est fourni par le programmeur, le LDS-1 est donc totalement programmable. Il lit directement les données nécessaires pour le rendu dans la mémoire de l’ordinateur et le programme exécuté est lui aussi en mémoire principale. Il n'a pas de mémoire vidéo dédiée, il utilise la RAM de l'ordinateur principal. Le multiplieur de matrices est plus complexe qu'on pourrait s'y attendre. Il ne s'agit pas que d'un circuit arithmétique tout simple, mais d'un véritable processeur avec des registres et des instructions machine complexes. Il contient plusieurs registres, l'ensemble mémorisant 4 matrices de 16 nombres chacune (4 lignes de 4 colonnes). Un nombre est codé sur 18 bits. Les registres sont reliés à un ensemble de circuits arithmétiques, des additionneurs et des multiplieurs. Le circuit supporte des instructions de copie entre registres, pour copier une ligne d'une matrice à une autre, des instructions LOAD/STORE pour lire ou écrire dans la mémoire RAM, etc. Il supporte aussi des multiplications en 2D et 3D. Le ''clipping divider'' est un circuit assez complexe, contenant un processeur à accumulateur, une mémoire ROM pour le programme du processeur. Le programme exécuté par le processeur est un petit programme de 62 instructions, stocké dans la ROM. L'algorithme du ''clipping divider'' est décrite dans le papier de recherche "A clipping divider", écrit par Robert Sproull. Un détail assez intéressant est que le résultat en sortie de l'unité géométrique et du rastériseur peuvent être envoyés à l'ordinateur en parallèle du rendu. C'était très utile sur les anciens ordinateurs qui étaient connectés à plusieurs terminaux. Le LDS-1 calculait la géométrie et le rendu, et le tout pouvait petre envoyé à d'autres composants, comme des terminaux, une imprimante, etc. ===Les systèmes ultérieurs : rendu à triangles colorés et texturé=== Les systèmes précédents étaient très limités : ils calculaient la géométrie et n'avaient pas de ''framebuffer'', ni de tampon de profondeur, ni gestion de l'éclairage, ni quoique ce soit. De tels systèmes étaient donc des accélérateurs géométriques que de vrais systèmes graphiques complets, du fait de l'absence de ''framebuffer''. Ils étaient composés de processeurs spécialisés dans les calculs à virgule flottante, faisant des calculs géométriques, et éventuellement d'un processeur pour la rastérisation. La raison est que la RAM était très chère et que créer des circuits fixes étaient très chers et peu disponibles. Par contre, les processeurs à virgule flottante étaient peu chers et facile à trouver. Vers la fin des années 80, grâce à la baisse du prix de la RAM et la démocratisation des ASIC (des circuits fixes fait sur mesure), ajouter un ''framebuffer'' est est devenu possible. C'est alors que sont apparus les '''systèmes de rendu 3D de première génération'''. De tels systèmes ont permis d'implémenter le rendu à primitives colorées qu'on a vu il y a quelques chapitres, à savoir un rendu où les triangles sont coloriés avec une couleur unique. Les systèmes de première génération étaient simples : des processeurs pour le calcul de la géométrie, un circuit de rastérisation, une RAM pour le ''framebuffer'' et des ASIC servant de ROPs très simples. Il n'y avait pas d'élimination des pixels cachés, pas de textures, et encore moins d'éclairage par pixels. Le premier système de ce genre était le ''Shaded Picture System'', toujours par Evans & Sutherland. Il ne gérait pas la couleur et ne pouvait afficher que des images en noir et blanc, mais il gérait l'éclairage par sommet (''vertex lighting''). Il a rapidement été dépassé par les systèmes de l'entreprise ''Silicon Graphics Inc'' (SGI), ainsi que ceux de l'entreprise Apollo avec sa série Apollo DN. Les '''systèmes de seconde génération''' sont apparus vers la fin des années 80, et se distinguent des précédents par l'ajout un tampon de profondeur. Ils intègrent aussi des capacités d'éclairage par pixel, à savoir de l'éclairage plat, de Gouraud, voire de Phong ! Enfin, les '''systèmes de troisième génération''' ont acquis des capacités de placage de texture, que les systèmes précédents n'avaient pas. Ils ont aussi ajouté un support de l'antialiasing. Les systèmes SGI avec placage de texture ont déjà été abordé au chapitre précédent, dans la section sur les GPU en mode immédiat et à ''tile''. Aussi, nous ne reviendrons pas dessus. [[File:Evolution de l'architecture des premières cartes graphiques, dans les années 80-90.png|centre|vignette|upright=2.5|Evolution de l'architecture des premières cartes graphiques, dans les années 80-90]] Les systèmes de première, seconde et troisième génération avaient de nombreux points communs. En premier lieu, ils étaient fabriqués en connectant plusieurs cartes électroniques : une carte pour les calculs géométriques, une ou plusieurs cartes pour le reste du rendu graphique, une carte dédiée au VDC et avec un connecteur écran. Les transistors de l'époque n'étaient pas encore miniaturisés, ce qui fait que le système graphique ne pouvait pas tenir sur une seule carte électronique. Il n'y avait donc pas de carte graphique proprement dit, mais un équivalent éclaté sur plusieurs cartes électroniques. La carte pour la géométrie contenait typiquement une mémoire FIFO pour accumuler les commandes de rendu, un processeur de commande, et plusieurs processeurs géométriques. Les processeurs géométriques étaient parfois conçus sur mesure, comme l'a été le le ''Geometry Engine'' de SGI. Mais il est arrivé qu'ils utilisent des processeurs commerciaux comme le Weitek 3222, l'Intel i860, etc. Les processeurs pouvaient être placés en série ou en parallèle, comme expliqué dans le chapitre précédent. Le circuit de rastérisation était réalisé soit avec un processeur dédié, soit avec un circuit fixe, soit un mélange des deux. La rastérisation est en effet réalisée en plusieurs étapes, certaines peuvent être implémentées avec un processeur et d'autres avec des circuits fixes. Un point important est qu'à l'époque, le rendu n'utilisait pas que des triangles, mais des polygones en général. Ce n'est que par la suite que le rendu s'est focalisé sur les triangles et les ''quads'' (quadrilatères). Il arrivait que le système graphique gérait partiellement des polygones concaves, voire convexes. Sur les systèmes SGI, les calculs géométriques se faisaient avec des polygones, que la rastérisation découpait en triangles, le reste du rendu se faisait avec des triangles. Les stations de travail Apollo DN 10000VS découpaient les polygones en trapézoïdes orientés à l'horizontale, alignés avec des ''scanlines''. D'autres systèmes découpaient tout en triangle lors de l'étape géométrique ==Les précurseurs grand public : les bornes d'arcade== [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] L'accélération du rendu 3D sur les bornes d'arcade était déjà bien avancé dès les années 90. Les bornes d'arcade ont toujours été un segment haut de gamme de l'industrie du jeu vidéo, aussi ce n'est pas étonnant. Le prix d'une borne d'arcade dépassait facilement les 10 000 dollars pour les plus chères et une bonne partie du prix était celui du matériel informatique. Le matériel était donc très puissant et débordait de mémoire RAM comparé aux consoles de jeu et aux PC. La plupart des bornes d'arcade utilisaient du matériel standardisé entre plusieurs bornes. A l'intérieur d'une borne d'arcade se trouve une '''carte de borne d'arcade''' qui est une carte mère avec un ou plusieurs processeurs, de la RAM, une carte graphique, un VDC et pas mal d'autres matériels. La carte est reliée aux périphériques de la borne : joysticks, écran, pédales, le dispositif pour insérer les pièces afin de payer, le système sonore, etc. Le jeu utilisé pour la borne est placé dans une cartouche qui est insérée dans un connecteur spécialisé. Les cartes de bornes d'arcade étaient généralement assez complexes, elles avaient une grande taille et avaient plus de composants que les cartes mères de PC. Chaque carte contenait un grand nombre de chips pour la mémoire RAM et ROM, et il n'était pas rare d'avoir plusieurs processeurs sur une même carte. Et il n'était pas rare d'avoir trois à quatre cartes superposées dans une seule borne. Pour ceux qui veulent en savoir plus, Fabien Sanglard a publié gratuitement un livre sur le fonctionnement des cartes d'arcade CPS System, disponible via ce lien : [https://fabiensanglard.net/b/cpsb.pdf The book of CP System]. Les premières cartes graphiques des bornes d'arcade étaient des cartes graphiques 2D auxquelles on avait ajouté quelques fonctionnalités. Les sprites pouvaient être tournés, agrandit/réduits, ou déformés pour simuler de la perspective et faire de la fausse 3D. Par la suite, le vrai rendu 3D est apparu sur les bornes d'arcade. Dès 1988, la carte d'arcade Namco System 21 et Sega Model 1 géraient les calculs géométriques. Quelques années plus tard, les cartes graphiques se sont mises à supporter un éclairage de Gouraud et du placage de texture. Par exemple, le Namco System 22 et la Sega model 2 supportaient des textures 2D et comme le filtrage de texture (bilinéaire et trilinéaire), le mip-mapping, et quelques autres. Au passage, les cartes graphiques de la Namco System 22 étaient développées en partenariat avec Eans & Sutherland, qui avait commencé à se diversifier dans le marché grand public. Les cartes graphiques de l'époque faisaient les calculs géométriques sur plusieurs processeurs, généralement des processeurs de type DSP (des processeurs spécialisés dans le traitement de signal). Par exemple, la Namco System 2 utilisait 4 DSP de marque Texas Instruments TMS320C25, cadencés à 24,576 MHz. La carte d'arcade Sega Model 1 utilisait quant à elle un DSP spécialisé dans les calculs géométriques. Par la suite, les bornes d'arcade ont réutilisé le hardware des PC et autres consoles de jeux. ==La 3D sur les consoles de quatrième/cinquième génération== Les consoles avant la quatrième génération de console étaient des consoles purement 2D, sans circuits d'accélération 3D. Leur carte graphique était un simple VDC 2D, plus ou moins performant selon la console. Les premières consoles de jeu capables de rendu 3D par elles-mêmes sont les consoles dites de 5ème génération. Il y a diverses manières de classer les consoles en générations, la plus commune place la 3D à la 5ème génération, mais détailler ces controverses quant à ce classement nous amènerait trop loin. Les consoles de génération avaient une architecture assez différente des systèmes antérieurs. Les systèmes SGI et assimilés pouvaient se permettre de couter assez cher, d'utiliser beaucoup de circuits, de prendre beaucoup de place. Les bornes d'arcade sont aussi dans ce cas. Aussi, il n'était pas rare que les cartes 3D de l'époque tiennent sur plusieurs cartes électroniques séparées. Mais une console ne peut pas se permettre ce genre de folies. Aussi, les cartes 3D des consoles de l'époque tenaient dans un seul circuit intégré, comme il est d'usage de nos jours. La conséquence est que certains circuits étaient fortement simplifiés, sur les consoles de cinquième génération. Et cela a impacté l'architecture interne des GPU des consoles. Les systèmes SGI avaient plusieurs processeurs pour calculer la géométrie, couplés à plusieurs unités non-programmables pour les pixels/textures. Les cartes 3D des consoles gardaient cette organisation : processeurs pour la géométrie, circuits fixes pour le reste. Mais elles se débrouillaient souvent avec un seul processeur, voire aucun ! Dans ce dernier cas, la géométrie était calculée sur le processeur principal, le CPU. Les unités pour les pixels étaient aussi moins nombreuses, mais il y en avait plusieurs, pour profiter de l'amplification des pixels. : Les cartes 3D des consoles de jeu utilisaient le placage de texture inverse, avec quelques exceptions qui utilisaient le placage de texture direct. ===Le rendu 3D sur les consoles de quatrième génération : la SNES=== Plus haut, j'ai dit que les consoles de quatrième génération n'avaient pas de carte accélératrice 3D. Pourtant, elles ont connus quelques jeux en vraie 3D. La raison à cela est que la 3D était calculée par un GPU placé dans les cartouches du jeu ! Par exemple, les cartouches de Starfox et de Super Mario 2 contenaient un coprocesseur Super FX, qui gérait des calculs de rendu 2D/3D. En tout, il y a environ 16 coprocesseurs pour la SNES et on en trouve facilement la liste sur le net. La console était conçue pour, des pins sur les ports cartouches étaient prévues pour des fonctionnalités de cartouche annexes, dont ces coprocesseurs. Ces pins connectaient le coprocesseur au bus des entrées-sorties. Les coprocesseurs des cartouches de NES avaient souvent de la mémoire rien que pour eux, qui était intégrée dans la cartouche. Ceci étant dit, passons aux consoles de cinquième génération. ===La Nintendo 64 : un GPU avancé=== La Nintendo 64 avait le GPU le plus complexe comparé aux autres consoles, et dépassait même les cartes graphiques des PC. Il faut dire que son GPU a été conçu avec l'aide de l'entreprise SGI, dont on a vu les systèmes graphiques plus haut. Le GPU de la N64 incorporait une unité pour les calculs géométriques, un circuit de rasterisation, une unité de textures et un ROP final pour les calculs de transparence/brouillard/antialiasing, ainsi qu'un circuit pour gérer la profondeur des pixels. En somme, tout le pipeline graphique était implémenté dans le GPU de la Nintendo 64, chose très en avance sur son temps, comparé au PC ou aux autres consoles ! Le GPU est construit autour d'un processeur dédié aux calculs géométriques, le ''Reality Signal Processor'' (RSP), autour duquel on a ajouté des circuits pour le reste du pipeline graphique. L'unité de calcul géométrique est un processeur MIPS R4000, un processeur assez courant à l'époque, auquel on avait retiré quelques fonctionnalités inutiles pour le rendu 3D. Il était couplé à 4 KB de mémoire vidéo, ainsi qu'à 4 KB de mémoire ROM. Le reste du GPU était réalisé avec des circuits fixes. Un point intéressant est que le programme exécuté par le RSP pouvait être programmé ! Le RSP gérait déjà des espèces de proto-shaders, qui étaient appelés des ''[https://ultra64.ca/files/documentation/online-manuals/functions_reference_manual_2.0i/ucode/microcode.html micro-codes]'' dans la documentation de l'époque. La ROM associée au RSP mémorise cinq à sept programmes différents, aux fonctionnalités différentes. * Les microcodes gspFast3D et gspF3DNoN, implémentent un rendu 3D normal, avec des options de ''clipping'' différentes entre les deux. * Le microcode gspTurbo3D fait la même chose, mais avec moins de fonctionnalités et avec une précision réduite. Il ne gère pas le ''clipping'', l'éclairage par pixel, la correction de perspective, l'antialiasing et quelques autres fonctionnalités. Il gère cependant l'éclairage de Gouraud. Il utilise une ''display list'' simplifiée comparé aux deux microcodes précédents. * Le microcode gspZ-Sort effectue une pré-passe z, à savoir qu'il calcule le tampon de profondeur final de la scène 3D, sans rendre l'image. Cela sert à faire une élimination des pixels cachés parfaite, en logiciel. On calcule le tampon de profondeur pour déterminer quels pixels sont visibles, puis une seconde passe rend l'image en, rejetant les pixels non-visibles. * Le microcode gspSprite2D implémente un rendu 2D émulé : les sprites et arrière-plan sont des rectangles texturés. Le microcode gspS2DEX fait la même chose, mais sert à émuler le rendu de la SNES plus qu'autre chose. * Le microcode gspLine3D ne gére que des lignes, pas de triangles. Il sert pour du rendu en fil de fer. Ils géraient le rendu 3D de manière différente et avec une gestion des ressources différentes. Très peu de studios de jeu vidéo ont développé leur propre microcodes N64, car la documentation était mal faite, que Nintendo ne fournissait pas de support officiel pour cela, que les outils de développement ne permettaient pas de faire cela proprement et efficacement. ===La Playstation 1=== Sur la Playstation 1 le calcul de la géométrie était réalisé par le processeur, la carte graphique gérait tout le reste. Et la carte graphique était un circuit fixe spécialisé dans la rasterisation et le placage de textures. Elle utilisait, comme la Nintendo 64, le placage de texture inverse, qui est apparu ensuite sur les cartes graphiques. ===La 3DO et la Sega Saturn=== La Sega Saturn et la 3DO étaient les deux seules consoles à utiliser le rendu direct. La géométrie était calculée sur le processeur, même si les consoles utilisaient parfois un CPU dédié au calcul de la géométrie. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. La Sega Saturn incorpore trois processeurs et deux GPU. Les deux GPUs sont nommés le VDP1 et le VDP2. Le VDP1 s'occupe des textures et des sprites, le VDP2 s'occupe uniquement de l'arrière-plan et incorpore un VDC tout ce qu'il y a de plus simple. Ils ne gèrent pas du tout la géométrie, qui est calculée par les trois processeurs. Le troisième processeur, la Saturn Control Unit, est un processeur de type DSP, à savoir un processeur spécialisé dans le traitement de signal. Il est utilisé presque exclusivement pour accélérer les calculs géométriques. Il avait sa propre mémoire RAM dédiée, 32 KB de SRAM, soit une mémoire locale très rapide. Les transferts entre cette RAM et le reste de l'ordinateur était géré par un contrôleur DMA intégré dans le DSP. En somme, il s'agit d'une sorte de processeur spécialisé dans la géométrie, une sorte d'unité géométrique programmable. Mais la géométrie n'était pas forcément calculée que sur ce DSP, mais pouvait être prise en charge par les 3 CPU. ==L'historique des cartes graphiques pour PC== Sur PC, l'évolution des cartes graphiques a eu du retard par rapport aux consoles. Les PC sont en effet des machines multi-usage, pour lesquelles le jeu vidéo était un cas d'utilisation parmi tant d'autres. Et les consoles étaient la plateforme principale pour jouer à des jeux vidéo, le jeu vidéo PC étant plus marginal. Mais cela ne veut pas dire que le jeu PC n'existait pas, loin de là ! Un problème pour les jeux PC était que l'écosystème des PC était aussi fragmenté en plusieurs machines différentes : machines Apple 1 et 2, ordinateurs Commdore et Amiga, IBM PC et dérivés, etc. Aussi, programmer des jeux PC n'était pas mince affaire, car les problèmes de compatibilité étaient légion. C'est seulement quand la plateforme x86 des IBM PC s'est démocratisée que l'informatique grand public s'est standardisée, réduisant fortement les problèmes de compatibilité. Mais cela n'a pas suffit, il a aussi fallu que les API 3D naissent. Les API 3D comme Direct X et Open GL sont absolument cruciales pour garantir la compatibilité entre plusieurs ordinateurs aux cartes graphiques différentes. Aussi, l'évolution des cartes graphiques pour PC s'est faite main dans la main avec l'évolution des API 3D. Les fonctionnalités des cartes graphiques ont évolué dans le temps, en suivant les évolutions des API 3D. Du moins dans les grandes lignes, car il est arrivé plusieurs fois que des fonctionnalités naissent sur les cartes graphiques, pour que les fabricants forcent la main de Microsoft ou d'Open GL pour les intégrer de force dans les API 3D. Passons. ===L'introduction des premiers jeux 3D : Quake et les drivers miniGL=== L'API OpenGL est née de la main de SGI, encore eux ! SGI avait créé l'API Iris GL pour ses stations de travail Iris Graphics. Iris GL a ensuite été libéré et est devenu le standard Open GL. Open GL existait déjà avant l'apparition des cartes accélératrices 3D. Il y a avait donc déjà un terreau que les programmeurs graphiques pouvaient utiliser. Mais Open GL était surtout utilisé pour des applications industrielles, médicales (imagerie), graphiques ou militaires, pas pour le jeu vidéo. Mais cela changea avec la sortie du jeu Quake, d'IdSoftware, en 1996. Quake pouvait fonctionner en rendu logiciel, mais le programmeur responsable du moteur 3D (le célébre John Carmack) ajouta une version OpenGL du jeu. Il faut dire que le jeu était programmé sur une station de travail compatible avec OpenGL, même si aucune carte accélératrice de l'époque ne supportait OpenGL. C'était là un choix qui se révéla visionnaire. En théorie, le rendu par OpenGL aurait dû se faire intégralement en logiciel, sauf sur quelques rares stations de travail adaptées. Mais les premières cartes graphiques étaient déjà dans les starting blocks. La toute première carte 3D pour PC est la '''Rendition Vérité V1000''', sortie en Septembre 1995, soit quelques mois avant l'arrivée de la Nintendo 64. La Rendition Vérité V1000 contenait un processeur MIPS cadencé à 25 MHz, 4 mébioctets de RAM, une ROM pour le BIOS, et un RAMDAC, rien de plus. C'était un vrai ordinateur complètement programmable de bout en bout, sans aucun circuit fixe. Les programmeurs ne pouvaient cependant pas utiliser cette programmabilité avec des ''shaders'', mais elle permettait à Rendition d'implémenter n'importe quelle API 3D, que ce soit OpenGL, DirectX ou même sa son API propriétaire. La Rendition Vérité avait de bonnes performances pour ce qui est de la géométrie, mais pas pour le reste. Réaliser la rastérisation et le placage de texture en logiciel n'est pas efficace, pareil pour les opérations de fin de pipeline comme l'antialiasing. Le manque d'unités fixes très rapides pour la rastérisation, le placage de texture ou les opérations de fin de pipeline était clairement un gros défaut. Mais la Rendition Vérité était un cas à part, une exception dans le paysage des cartes 3D de l'époque, qui ne faisait rien comme les autres. Les autres cartes graphiques, sorties peu après, étaient les Voodoo de 3dfx, les Riva TNT de NVIDIA, les Rage/3D d'ATI, la Virge/3D de S3, et la Matrox Mystique. Elles avaient choisit le compromis inverse de la Rendition Vérité V1000 : de bonnes performances pour le placage de textures et la rastérization, mais pas pour les calculs géométriques. Pour rappel, les systèmes professionnels et les consoles avaient des processeurs pour la géométrie, et des circuits fixes pour le reste. Les cartes graphiques de PC se passaient des processeurs pour la géométrie, les calculs géométriques étaient réalisés par le CPU. Les toutes premières cartes 3D pour PC contenaient seulement des circuits pour gérer les textures et des ROPs. Elle géraient le ''z-buffer'' en mémoire vidéo, ainsi que des effets de brouillard. Il n'y avait même pas de circuit pour la rastérisation, qui était faite en logiciel, avec les calculs géométriques. [[File:Architecture de base d'une carte 3D - 2.png|centre|vignette|upright=1.5|Carte 3D sans rasterization matérielle.]] Les cartes suivantes ajoutèrent une gestion des étapes de ''rasterization'' directement en matériel. Les cartes ATI rage 2, les Invention de chez Rendition, et d'autres cartes graphiques supportaient la rasterisation en hardware. [[File:Architecture de base d'une carte 3D - 3.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] Pour exploiter les unités de texture et le circuit de rastérisation, OpenGL et Direct 3D étaient partiellement implémentées en logiciel, car les cartes graphiques ne supportaient pas toutes les fonctionnalités de l'API. C'était l'époque du miniGL, des implémentations partielles d'OpenGL, fournies par les fabricants de cartes 3D, implémentées dans les pilotes de périphériques de ces dernières. Les fonctionnalités d'OpenGL implémentées dans ces pilotes étaient presque toutes exécutées en matériel, par la carte graphique. Avec l'évolution du matériel, les pilotes de périphériques devinrent de plus en plus complets, au point de devenir des implémentations totales d'OpenGL. Mais au-delà d'OpenGL, chaque fabricant de carte graphique avait sa propre API propriétaire, qui était gérée par leurs pilotes de périphériques (''drivers''). Par exemple, les premières cartes graphiques de 3dfx interactive, les fameuses voodoo, disposaient de leur propre API graphique, l'API Glide. Elle facilitait la gestion de la géométrie et des textures, ce qui collait bien avec l'architecture de ces cartes 3D. Mais ces API propriétaires tombèrent rapidement en désuétude avec l'évolution de DirectX et d'OpenGL. Direct X était une API dans l'ombre d'Open GL. La première version de Direct X qui supportait la 3D était DirectX 2.0 (juin 2, 1996), suivie rapidement par DirectX 3.0 (septembre 1996). Elles dataient d'avant le jeu Quake, et elles étaient très éloignées du hardware des premières cartes graphiques. Elles utilisaient un système d'''execute buffer'' pour communiquer avec la carte graphique, Microsoft espérait que le matériel 3D implémenterait ce genre de système. Ce qui ne fu pas le cas. Direct X 4.0 a été abandonné en cours de développement pour laisser à une version 5.0 assez semblable à la 2.0/3.0. Le mode de rendu laissait de côté les ''execute buffer'' pour coller un peu plus au hardware de l'époque. Mais rien de vraiment probant comparé à Open GL. Même Windows utilisait Open GL au lieu de Direct X maison... C'est avec Direct X 6.0 que Direct X est entré dans la cours des grands. Il gérait la plupart des technologies supportées par les cartes graphiques de l'époque. ===Le ''multi-texturing'' de l'époque Direct X 6.0 : combiner plusieurs textures=== Une technologie très importante standardisée par Dirext X 6 est la technique du '''''multi-texturing'''''. Avec ce qu'on a dit dans le chapitre précédent, vous pensez sans doute qu'il n'y a qu'une seule texture par objet, qui est plaquée sur sa surface. Mais divers effet graphiques demandent d'ajouter des textures par dessus d'autres textures. En général, elles servent pour ajouter des détails, du relief, sur une surface pré-existante. Un exemple intéressant vient des jeux de tir : ajouter des impacts de balles sur les murs. Pour cela, on plaque une texture d'impact de balle sur le mur, à la position du tir. Il s'agit là d'un exemple de '''''decals''''', des petites textures ajoutées sur les murs ou le sol, afin de simuler de la poussière, des impacts de balle, des craquelures, des fissures, des trous, etc. Les textures en question sont de petite taille et se superposent à une texture existante, plus grande. Rendre des ''decals'' demande de pouvoir superposer deux textures. Direct X 6.0 supportait l'application de plusieurs textures directement dans le matériel. La carte graphique devait être capable d'accéder à deux textures en même temps, ou du moins faire semblant que. Pour cela, elle doublaient les unités de texture et adaptaient les connexions entre unités de texture et mémoire vidéo. La mémoire vidéo devait être capable de gérer plusieurs accès mémoire en même temps et devait alors avoir un débit binaire élevé. [[File:Multitexturing.png|centre|vignette|upright=2|Multitexturing]] La carte graphique devait aussi gérer de quoi combiner deux textures entre elles. Par exemple, pour revenir sur l'exemple d'une texture d'impact de balle, il faut que la texture d'impact recouvre totalement la texture du mur. Dans ce cas, la combinaison est simple : la première texture remplace l'ancienne, là où elle est appliquée. Mais les cartes graphiques ont ajouté d'autres combinaisons possibles, par exemple additionner les deux textures entre elle, faire une moyenne des texels, etc. Les opérations pour combiner les textures était le fait de circuits appelés des '''''combiners'''''. Concrètement, les ''combiners'' sont de simples unités de calcul. Les ''conbiners'' ont beaucoup évolués dans le temps, mais les premières implémentation se limitaient à quelques opérations simples : addition, multiplication, superposition, interpolation. L'opération effectuer était envoyée au ''conbiner'' sur une entrée dédiée. [[File:Multitexturing avec combiners.png|centre|vignette|upright=2|Multitexturing avec combiners]] S'il y avait eu un seul ''conbiner'', le circuit de ''multitexturing'' aurait été simplement configurable. Mais dans la réalité, les premières cartes utilisant du ''multi-texturing'' utilisaient plusieurs ''combiners'' placés les uns à la suite des autres. L'implémentation des ''combiners'' retenue par Open Gl, et par le hardware des cartes graphiques, était la suivante. Les ''combiners'' étaient placés en série, l'un à la suite de l'autre, chacun combinant le résultat de l'étage précédent avec une texture. Le premier ''combiner'' gérait l'éclairage par sommet, afin de conserver un minimum de rétrocompatibilité. [[File:Texture combiners Open GL.png|centre|vignette|upright=2|Texture combiners Open GL]] Voici les opérations supportées par les ''combiners'' d'Open GL. Ils prennent en entrée le résultat de l'étage précédent et le combinent avec une texture lue depuis l'unité de texture. {|class="wikitable" |+ Opérations supportées par les ''combiners'' d'Open GL |- ! Replace | colspan="2" | Pixel provenant de l'unité de texture |- ! Addition | colspan="2" | Additionne l'entrée au texel lu. |- ! Modulate | colspan="2" | Multiplie l'entrée avec le texel lu |- ! Mélange (''blending'') | Moyenne pondérée des deux entrées, pondérée par la composante de transparence || La couleur de transparence du texel lu et de l'entrée sont multipliées. |- ! Decals | Moyenne pondérée des deux entrées, pondérée par la composante de transparence. || La transparence du résultat est celle de l'entrée. |} Il faut noter qu'un dernier étage de ''combiners'' s'occupait d'ajouter la couleur spéculaire et les effets de brouillards. Il était à part des autres et n'était pas configurable, c'était un étage fixe, qui était toujours présent, peu importe le nombre de textures utilisé. Il était parfois appelé le '''''combiner'' final''', terme que nous réutiliserons par la suite. Mine de rien, cela a rendu les cartes graphiques partiellement programmables. Le fait qu'il y ait des opérations enchainées à la suite, opérations qu'on peut choisir librement, suffit à créer une sorte de mini-programme qui décide comment mélanger plusieurs textures. Mais il y avait une limitation de taille : le fait que les données soient transmises d'un étage à l'autre, sans détours possibles. Par exemple, le troisième étage ne pouvait avoir comme seule opérande le résultat du second étage, mais ne pouvait pas utiliser celui du premier étage. Il n'y avait pas de registres pour stocker ce qui sortait de la rastérisation, ni pour mémoriser temporairement les texels lus. ===Le ''Transform & Lighting'' matériel de Direct X 7.0=== La première carte graphique pour PC capable de gérer la géométrie en hardware fût la Geforce 256, la toute première Geforce. Son unité de gestion de la géométrie n'est autre que la bien connue '''unité T&L''' (''Transform And Lighting''). Elle implémentait des algorithmes d'éclairage de la scène 3D assez simples, comme un éclairage de Gouraud, qui étaient directement câblés dans ses circuits. Mais contrairement à la Nintendo 64 et aux bornes d'arcade, elle implémentait le tout, non pas avec un processeur classique, mais avec des circuits fixes. Avec Direct X 7.0 et Open GL 1.0, l'éclairage était en théorie limité à de l'éclairage par sommet, l'éclairage par pixel n'était pas implémentable en hardware. Les cartes graphiques ont tenté d'implémenter l'éclairage par pixel, mais cela n'est pas allé au-delà du support de quelques techniques de ''bump-mapping'' très limitées. Par exemple, Direct X 6.0 implémentait une forme limitée de ''bump-mapping'', guère plus. Un autre problème est qu'il a beaucoup d'algorithmes d'éclairages différents, aux résultats visuels différents, bien au-delà des algorithmes d'éclairage plat, de Gouraud et de Phong. Et les unités de T&L étaient souvent en retard sur les algorithmes logiciels. Les programmeurs avaient le choix entre programmer les algorithmes d’éclairage qu'ils voulaient et les exécuter en logiciel, ou utiliser ceux de l'unité de T&L. Ils choisissaient souvent la première option. Par exemple, Quake 3 Arena et Unreal Tournament n'utilisaient pas les capacités d'éclairage géométrique et préféraient utiliser leurs calculs d'éclairage logiciel fait maison. Cependant, le hardware dépassait les capacités des API et avait déjà commencé à ajouter des capacités de programmation liées au ''multi-texturing''. Les cartes graphiques de l'époque, surtout chez NVIDIA, implémentaient un système de '''''register combiners''''', une forme améliorée de ''texture combiners'', qui permettait de faire une forme limitée d'éclairage par pixel, notamment du vrai ''bump-mampping'', voire du ''normal-mapping''. Mais ce n'était pas totalement supporté par les API 3D de l'époque. Les ''registers combiners'' sont des ''texture combiners'' mais dans lesquels ont aurait retiré la stricte organisation en série. Il y a toujours plusieurs étages à la suite, qui peuvent exécuter chacun une opération, mais tous les étages ont maintenant accès à toutes les textures lues et à tout ce qui sort de la rastérisation, pas seulement au résultat de l'étape précédente. Pour cela, on ajoute des registres pour mémoriser ce qui sort des unités de texture, et pour ce qui sort de la rastérisation. De plus, on ajoute des registres temporaires pour mémoriser les résultats de chaque ''combiner'', de chaque étage. Il faut cependant signaler qu'il existe un ''combiner'' final, séparé des étages qui effectuent des opérations proprement dits. Il s'agit de l'étage qui applique la couleur spéculaire et les effets de brouillards. Il ne peut être utilisé qu'à la toute fin du traitement, en tant que dernier étage, on ne peut pas mettre d'opérations après lui. Sa sortie est directement connectée aux ROPs, pas à des registres. Il faut donc faire la distinction entre les '''''combiners'' généraux''' qui effectuent une opération et mémorisent le résultat dans des registres, et le ''combiner'' final qui envoie le résultat aux ROPs. L'implémentation des ''register combiners'' utilisait un processeur spécialisés dans les traitements sur des pixels, une sorte de proto-processeur de ''shader''. Le processeur supportait des opérations assez complexes : multiplication, produit scalaire, additions. Il s'agissait d'un processeur de type VLIW, qui sera décrit dans quelques chapitres. Mais ce processeur avait des programmes très courts. Les premières cartes NVIDIA, comme les cartes TNT pouvaient exécuter deux opérations à la suite, suivie par l'application de la couleurs spéculaire et du brouillard. En somme, elles étaient limitées à un ''shader'' à deux/trois opérations, mais c'était un début. Le nombre d'opérations consécutives est rapidement passé à 8 sur la Geforce 3. [[File:Architecture de base d'une carte 3D - 4.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] ===L'arrivée des ''shaders'' avec Direct X 8.0=== Les ''register combiners'' était un premier pas vers un éclairage programmable. Paradoxalement, l'évolution suivante s'est faite non pas dans l'unité de rastérisation/texture, mais dans l'unité de traitement de la géométrie. La Geforce 3 a remplacé l'unité de T&L par un processeur capable d'exécuter des programmes. Les programmes en question complétaient l'unité de T&L, afin de pouvoir rajouter des techniques d'éclairage plus complexes. Le tout a permis aussi d'ajouter des animations, des effets de fourrures, des ombres par ''shadow volume'', des systèmes de particule évolués, et bien d'autres. À partir de la Geforce 3 de Nvidia, les cartes graphiques sont devenues capables d'exécuter des programmes appelés '''''shaders'''''. Le terme ''shader'' vient de ''shading'' : ombrage en anglais. Grace aux ''shaders'', l'éclairage est devenu programmable, il n'est plus géré par des unités d'éclairage fixes mais été laissé à la créativité des programmeurs. Les programmeurs ne sont plus vraiment limités par les algorithmes d'éclairage implémentés dans les cartes graphiques, mais peuvent implémenter les algorithmes d'éclairage qu'ils veulent et peuvent le faire exécuter directement sur la carte graphique. Les ''shaders'' sont classifiés suivant les données qu'ils manipulent : '''''pixel shader''''' pour ceux qui manipulent des pixels, '''''vertex shaders''''' pour ceux qui manipulent des sommets. Les premiers sont utilisés pour implémenter l'éclairage par pixel, les autres pour gérer tout ce qui a trait à la géométrie, pas seulement l'éclairage par sommets. Direct X 8.0 avait un standard pour les shaders, appelé ''shaders 1.0'', qui correspondait parfaitement à ce dont était capable la Geforce 3. Il standardisait les ''vertex shaders'' de la Geforce 3, mais il a aussi renommé les ''register combiners'' comme étant des ''pixel shaders'' version 1.0. Les ''register combiners'' n'ont pas évolués depuis la Geforce 256, si ce n'est que les programmes sont passés de deux opérations successives à 8, et qu'il y avait possibilité de lire 4 textures en ''multitexturing''. A l'opposé, le processeur de ''vertex shader'' de la Geforce 3 était capable d'exécuter des programmes de 128 opérations consécutives et avait 258 registres différents ! Des ''pixels shaders'' plus évolués sont arrivés avec l'ATI Radeon 8500 et ses dérivés. Elle incorporait la technologie ''SMARTSHADER'' qui remplacait les ''registers combiners'' par un processeur de ''shader'' un peu limité. Un point est que le processeur acceptait de calculer des adresses de texture dans le ''pixel shader''. Avant, les adresses des texels à lire étaient fournis par l'unité de rastérisation et basta. L'avantage est que certains effets graphiques étaient devenus possibles : du ''bump-mapping'' avancé, des textures procédurales, de l'éclairage par pixel anisotrope, du éclairage de Phong réel, etc. Avec la Radeon 8500, le ''pixel shader'' pouvait calculer des adresses, et lire les texels associés à ces adresses calculées. Les ''pixel shaders'' pouvaient lire 6 textures, faire 8 opérations sur les texels lus, puis lire 6 textures avec les adresses calculées à l'étape précédente, et refaire 8 opérations. Quelque chose de limité, donc, mais déjà plus pratique. Les ''pixel shaders'' de ce type ont été standardisé dans Direct X 8.1, sous le nom de ''pixel shaders 1.4''. Encore une fois, le hardware a forcé l'intégration dans une API 3D. [[File:Architecture de la Geforce 3.png|centre|vignette|upright=1.5|Architecture de la Geforce 3]] ===Les ''shaders'' de Direct X 9.0 : de vrais ''pixel shaders''=== Avec Direct X 9.0, les ''shaders'' sont devenus de vrais programmes, sans les limitations des ''shaders'' précédents. Les ''pixels shaders'' sont passés à la version 2.0, idem pour les ''vertex shaders''. Concrètement, ils ont des fonctionnalités bien supérieures à celles des ''registers combiners''. Les ''shaders'' pouvaient exécuter une suite d'opérations arbitraire, dans le sens où elle n'était pas structurée avec tel type d'opération au début, suivie par un accès aux textures, etc. On pouvait mettre n'importe quelle opération dans n'importe quel ordre. De plus, les ''shaders'' ne sont plus écrit en assembleur comme c'était le cas avant. Ils sont dorénavant écrits dans un langage de haut-niveau, le HLSL pour les shaders Direct X et le GLSL pour les shaders Open Gl. Les ''shaders'' sont ensuite traduit (compilés) en instructions machines compréhensibles par la carte graphique. Au début, ces langages et la carte graphique supportaient uniquement des opérations simples. Mais au fil du temps, les spécifications de ces langages sont devenues de plus en plus riches à chaque version de Direct X ou d'Open Gl, et le matériel en a fait autant. Le matériel s'est alors adapté, en incorporant un véritable processeur pour les ''pixel shaders''. Les ''pixel shaders'' sont maintenant exécutés par un processeur de ''shader'' dédié, aux fonctionnalités bien supérieures à celles des ''registers combiners''. Le processeur de ''pixel shader'' incorpore l'unité de texture en sont sein, les deux sont fusionnés. La raison à cela sera expliqué dans la suite du chapitre. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=1.5|Carte 3D avec pixels et vertex shaders non-unifiés.]] ===L'après Direct X 9.0 : GPGPU et shaders unifiés=== Avant Direct X 10, les processeurs de ''shaders'' ne géraient pas exactement les mêmes opérations pour les processeurs de ''vertex shader'' et de ''pixel shader''. Les processeurs de ''vertex shader'' et de ''pixel shader''étaient séparés. Depuis DirectX 10, ce n'est plus le cas : le jeu d'instructions a été unifié entre les vertex shaders et les pixels shaders, ce qui fait qu'il n'y a plus de distinction entre processeurs de vertex shaders et de pixels shaders, chaque processeur pouvant traiter indifféremment l'un ou l'autre. [[File:Architecture de base d'une carte 3D - 6.png|centre|vignette|upright=1.5|Architecture de la GeForce 6800.]] Les GPU modernes sont capables d’exécuter des programmes informatiques qui n'ont aucun lien avec le rendu 3D, comme des calculs scientifiques, tout ce qui implique des réseaux de neurones, de l'imagerie médicale, etc. De manière générale, tout calcul faisant usage d'un grand nombre de calculs sur des matrices ou des vecteurs est concerné. L'usage d'une carte graphique pour autre chose que le rendu 3D porte le nom de '''GPGPU''', ''General Processing GPU''. En soi, le GPGPU est assez logique : les processeurs de shaders, bien que conçus avec le rendu 3D en tête, n'en restent pas moins des processeurs assez puissants. Pour ce genre d'utilisations, les GPU actuel supportent des ''shaders'' sans lien avec le rendu 3D, appelés des ''compute shader''. ==Les cartes graphiques d'aujourd'hui== Les circuits d'un GPU ont beaucoup évolué depuis l'introduction des ''shaders'', pour devenir de plus en plus programmables. Mais à côté des processeurs de ''shaders'', il reste quelques circuits non-programmables appelés des circuits fixes. La rastérisation, le placage de texture, l'élimination des pixels cachés et le mélange ''alpha'' sont gérés par des circuits fixes. [[File:3D-Pipeline.svg|centre|vignette|upright=3.0|Pipeline 3D : ce qui est programmable et ce qui ne l'est pas dans une carte graphique moderne.]] Mais pourquoi ne pas tout rendre programmable ? Ou au contraire, utiliser seulement des circuits fixes ? La réponse n'est pas la même pour les ROPs, le rastériseur, et les unités de texture. Pour simplifier, la réponse rapide est qu'il s'agit d'un compromis entre flexibilité et performance qui permet d'avoir le meilleur des deux mondes. Mais ce compromis a fortement évolué dans le temps, comme on va le voir plus bas. Rendre l'éclairage programmable permet d'implémenter facilement un grand nombre d'effets graphiques sans avoir à les implémenter en hardware. Avant les ''shaders'', les effets graphiques derniers cri n'étaient disponibles que sur les derniers modèles de carte graphique. Avec des ''vertex/pixel shaders'', ce genre de défaut est passé à la trappe. Si un nouvel algorithme de rendu graphique est inventé, il peut être utilisé dès le lendemain sur toutes les cartes graphiques modernes. De plus, implémenter beaucoup d'algorithmes d'éclairage différents avec des circuits fixes a un cout en termes de transistors, alors qu'utiliser des circuits programmable a un cout en hardware plus limité. Tout cela est à l'exact opposé de ce qu'on a avec les autres circuits, comme les circuits pour la rastérisation ou le placage de texture. Il n'y a pas 36 façons de rastériser une scène 3D et la flexibilité n'est pas un besoin important pour cette opération, alors que les performances sont cruciales. Même chose pour le placage/filtrage de textures. En conséquences, les unités de rastérisation et de texture sont toutes implémentées en matériel. Faire ainsi permet de gagner en performance sans que cela ait le moindre impact pour le programmeur. Reste à expliquer dans le détail pourquoi. Le cas du ROP est plus complexe et on en reparlera dans un chapitre dédié. Mais pour simplifier, c'est parce que les GPU actuels sont de type ''sort-last'', comme vu dans le chapitre précédent. Il trient les pixels suivant leur position à l'écran à la toute fin du pipeline, et ce tri ne peut pas être rendu programmable. ===Les unités de texture sont intégrées aux processeurs de shaders=== Avec l'arrivée des processeurs de shaders, les unités de texture ont été intégrées dans les processeurs de shaders eux-mêmes. C'est la seule unité fixe qui a subit ce traitement, et il est intéressant de comprendre pourquoi. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=2|Architecture de base d'une carte 3D.]] Pour cela, il faut faire un rappel sur ce qu'il y a dans un processeur. Un processeur contient globalement quatre circuits : * une unité de calcul qui fait des calculs ; * des registres pour stocker les opérandes et résultats des calculs ; * une unité de communication avec la mémoire ; * et un séquenceur, un circuit de contrôle qui commande les autres. L'unité de communication avec la mémoire sert à lire ou écrire des données, à les transférer de la RAM vers les registres, ou l'inverse. Lire une donnée demande d'envoyer son adresse à la RAM, qui répond en envoyant la donnée lue. Elle est donc toute indiquée pour lire une texture : lire une texture n'est qu'un cas particulier de lecture de données. Les texels à lire sont à une adresse précise, la RAM répond à la lecture avec le texel demandé. Il est donc possible d'utiliser l'unité de communication avec la mémoire comme si c'était une unité de texture. Cependant, les textures ne sont pas utilisées comme telles de nos jours. Le rendu 3D moderne utilise des techniques dites de filtrage de texture, qui permettent d'améliorer la qualité du rendu des textures. Sans ce filtrage de texture, les textures appliquées naïvement donnent un résultat assez pixelisé et assez moche, pour des raisons assez techniques. Le filtrage élimine ces artefacts, en utilisant une forme d'''antialiasing'' interne aux textures, le fameux filtrage de texture. Le filtrage de texture peut être réalisé en logiciel ou en matériel. Techniquement, il est possible de le faire dans un ''shader''. Le ''shader'' calcule les adresses des texels à lire, lit les texels, et effectue ensuite le filtrage avec des opérations de calcul. Mais ce n'est pas ce qui est fait, le filtrage de texture est toujours effectué directement en matériel. La raison est que le filtrage de texture est très simple à implémenter en hardware. Le filtrage bilinéaire ou trilinéaire demande juste des circuits d'interpolation et quelques registres, ce qui est trivial. Et la seconde raison est qu'il n'y a pas 36 façons de filtrer des textures : une carte graphique peut implémenter les algorithmes principaux existants en assez peu de circuits. Pour simplifier l'implémentation, les processeurs de ''shader'' modernes disposent d'une unité d'accès mémoire séparée de l'unité de texture. L'unité d'accès mémoire normale s'occupe des accès mémoire hors-textures, alors que l'unité mémoire s'occupe de lire les textures. L'unité de texture contient de quoi faire du filtrage de texture, mais aussi faire des calculs d'adresse spécialisées, intrinsèquement liés au format des textures, qu'on détaillera dans le chapitre sur les textures. En comparaison, les unités d'accès mémoire effectuent des calculs d'adresse plus basiques. Un dernier avantage est que l'unité de texture est reliée au cache de texture, alors que l'unité d'accès mémoire est relié au cache L1/L2. ===Le projet Larrabee d'Intel : une programmabilité maximale=== Pour finir, nous allons parler d'un ancien projet d'Intel, qui ne s'est pas matérialisé : le projet Larrabee. Il s'agissait d'un projet de GPU, qui a été annulé en 2009 avant d'être commercialisé. Le GFU avait pour particularité de limiter les circuits fixes au minimum. Il ne gardait qu'une unité de texture, les ROPs et le rastériseur étaient émulés en logiciel. L'unité de texture n'était pas intégrée aux processeurs de shader, mais en était séparée. Le GPU était composé de plusieurs centaines de processeurs, reliés entre eux avec un réseau d'interconnexion assez complexe. L'unité de texture était connectée sur ce réseau d'interconnexion, de même que le VDC et l'interface avec le bus. [[File:Larrabee slide block diagram.svg|centre|vignette|upright=2.5|Larrabee, diagramme. Les processeurs de shaders sont en orange.]] Un autre point important est que les processeurs utilisés étaient des processeurs x86, les mêmes que ceux utilisés comme CPU dans nos PCs. Le choix d'utiliser des CPU x86 peut sembler étrange, ceux-ci ayant des instructions qui ne servaient à rien pour le rendu 3D, mais qui consommaient une partie du budget en transistors. Mais cela se comprend quand on sait que le GPU était prévu à la fois pour le GPGPU et le rendu 3D. Utiliser des processeurs x86 était très intéressant pour le GPGPU, cela assurait une certaine forme de compatibilité, sans compter que les programmeurs PC sont familiers avec le x86. Pour gérer le problème mentionné plus haut avec les ROPs, Larrabee simulait un GPU de type ''Tile Based Rendering'', où l'écran est divisé en ''tiles'', et la rastérisation se fait ''tile'' par ''tile''. L'émulation logicielle des ROPs était nettement plus simple avec ce genre d'émulation. Mais le logiciel qui émulait les ROPs et le rastériseur était programmé pour éviter ce genre de problèmes. Le projet a été annulé en 2009, sans doute parce qu'il n’arrivait pas à obtenir des performances acceptables. Mais larrabee été recyclé pour donner les Xeon Phi, des cartes d'extension utilisées pour des serveurs, du calcul scientifique ou intensif, ou d'autres usages. Les circuits de rendu 3D avaient été retirées de ces cartes, qui ne faisaient que du calcul. {{NavChapitre | book=Les cartes graphiques | prev=Avant les GPUs : les cartes accélératrices 3D | prevText=Avant les GPUs : les cartes accélératrices 3D | next=Les processeurs de shaders | nextText=Les processeurs de shaders }} {{autocat}} i6idnqxrxkod6f2wvp8yeff9ijdyu1w 764881 764872 2026-04-24T17:55:49Z Mewtow 31375 /* Le projet Larrabee d'Intel : une programmabilité maximale */ 764881 wikitext text/x-wiki Il est intéressant d'étudier le hardware des cartes graphiques en faisant un petit résumé de leur évolution dans le temps. En effet, leur hardware a fortement évolué dans le temps. Et il serait difficile à comprendre le hardware actuel sans parler du hardware d'antan. En effet, une carte graphique moderne est partiellement programmable. Certains circuits sont totalement programmables, d'autres non. Et pour comprendre pourquoi, il faut étudier comment ces circuits ont évolués. Le hardware des cartes graphiques a fortement évolué dans le temps, ce qui n'est pas une surprise. Les évolutions de la technologie, avec la miniaturisation des transistors et l'augmentation de leurs performances a permis aux cartes graphiques d'incorporer de plus en plus de circuits avec les années. Avant l'invention des cartes graphiques, toutes les étapes du pipeline graphique étaient réalisées par le processeur : il calculait l'image à afficher, et l’envoyait à une carte d'affichage 2D. Au fil du temps, de nombreux circuits furent ajoutés, afin de déporter un maximum de calculs vers la carte vidéo. Le rendu 3D moderne est basé sur le placage de texture inverse, avec des coordonnées de texture, une correction de perspective, etc. Mais les anciennes consoles et bornes d'arcade utilisaient le placage de texture direct. Et cela a impacté le hardware des consoles/PCs de l'époque. Avec le placage de texture direct, il était primordial de calculer la géométrie, mais la rasterisation était le fait de VDC améliorés. Aussi, les premières bornes d'arcade 3D et les consoles de 5ème génération disposaient processeurs pour calculer la géométrie et de circuits d'application de textures très particuliers. A l'inverse, les PC utilisaient un rendu inverse, totalement différent. Sur les PC, les premières cartes graphiques avaient un circuit de rastérisation et des unités de textures, mais pas de circuits géométriques. ==Les premières cartes graphiques, pour ''mainframes'' et stations de travail== Dès les années 70-80, le rendu 3D était utilisé par de nombreuses entreprises industrielles : des applications de visualisation 3D étaient utilisées en architecture, des applications de conception assistée par ordinateur étaient déjà d'utilisation courante, sans compter les simulateurs de vol utilisés par l'armée et les instructeurs qui formaient les pilotes d'avion. Le rendu 3D était aussi étudié au niveau académique, la recherche en 3D était déjà florissante. Il existait même du matériel spécifiquement conçu pour le rendu graphique, mais celui-ci était spécifiquement dédié à des super-calculateurs ou des ''workstations'' (des sortes d'ancêtres des PC, très puissants pour l'époque, mais conçus uniquement pour les entreprises). ===Le début des années 80 : le rendu en fils de fer=== Le tout premier système de ce genre était le '''''Line Drawing System-1''''' de l'entreprise Evans & Sutherland, daté de 1969. Ce n'est ni plus ni moins que le toute premier circuit graphique séparé du processeur ayant existé. C'est en un sens la toute première carte graphique, le tout premier GPU. Il prenait la forme d'un périphérique qui se connectait à l'ordinateur d'un côté et était relié à l'écran de l'autre. Il était compatible avec un grand nombre d'ordinateurs et de processeurs existants. Il a été suivi par plusieurs successeurs, nommés ''Picture System 1, 2'' et le ''PS300 series''. [[File:Evans & Sutherland LDS-1 (1).jpg|vignette|Evans & Sutherland LDS-1 (1)]] Ils permettaient de faire du rendu en fil de fer, sans texture ni même sans polygones colorés. Un tel rendu était utile pour des applications assez limitées : architecture, dessin de molécules pour les entreprises pharmaceutique et certains centres de recherche, l'aérospatiale, etc. Ces cartes graphiques étaient utilisées de concert avec des écrans appelés '''écrans vectoriels''' (''vector display''). Pour simplifier, ils ressemblaient à des écrans CRT, sauf que le faisceau d'électron ne balayait pas l'écran ligne par ligne, mais traçait des lignes arbitraires à l'écran. On lui précisait deux points de coordonnées x1,y1 ; et x2,y2 ; puis l'écran tracait une ligne entre ces deux points. En général, la ligne tracée était maintenue pendant un long moment, entre plusieurs secondes et plusieurs minutes. L'intérieur du circuit était assez simple : un circuit de multiplication de matrice pour les calculs géométriques, un rastériser simplifié (le ''clipping diviser''), un circuit de tracé de lignes, et un processeur de contrôle pour commander les autres circuits. Le fait que ces trois circuits soient séparés permettait une implémentation en pipeline, où plusieurs portions de l'image pouvaient être calculées en même temps : pendant que l'une est dans l'unité géométrique, l'autre est dans le rastériseur et une troisième est en cours de tracé. [[File:Lds1blockdiagram05.svg|centre|vignette|upright=2|Architecture du LDS-1. Le processeur de contrôle n'est pas représenté.]] Le processeur de contrôle exécute un programme qui se charge de commander l'unité géométrique et les autres circuits. Le programme en question est fourni par le programmeur, le LDS-1 est donc totalement programmable. Il lit directement les données nécessaires pour le rendu dans la mémoire de l’ordinateur et le programme exécuté est lui aussi en mémoire principale. Il n'a pas de mémoire vidéo dédiée, il utilise la RAM de l'ordinateur principal. Le multiplieur de matrices est plus complexe qu'on pourrait s'y attendre. Il ne s'agit pas que d'un circuit arithmétique tout simple, mais d'un véritable processeur avec des registres et des instructions machine complexes. Il contient plusieurs registres, l'ensemble mémorisant 4 matrices de 16 nombres chacune (4 lignes de 4 colonnes). Un nombre est codé sur 18 bits. Les registres sont reliés à un ensemble de circuits arithmétiques, des additionneurs et des multiplieurs. Le circuit supporte des instructions de copie entre registres, pour copier une ligne d'une matrice à une autre, des instructions LOAD/STORE pour lire ou écrire dans la mémoire RAM, etc. Il supporte aussi des multiplications en 2D et 3D. Le ''clipping divider'' est un circuit assez complexe, contenant un processeur à accumulateur, une mémoire ROM pour le programme du processeur. Le programme exécuté par le processeur est un petit programme de 62 instructions, stocké dans la ROM. L'algorithme du ''clipping divider'' est décrite dans le papier de recherche "A clipping divider", écrit par Robert Sproull. Un détail assez intéressant est que le résultat en sortie de l'unité géométrique et du rastériseur peuvent être envoyés à l'ordinateur en parallèle du rendu. C'était très utile sur les anciens ordinateurs qui étaient connectés à plusieurs terminaux. Le LDS-1 calculait la géométrie et le rendu, et le tout pouvait petre envoyé à d'autres composants, comme des terminaux, une imprimante, etc. ===Les systèmes ultérieurs : rendu à triangles colorés et texturé=== Les systèmes précédents étaient très limités : ils calculaient la géométrie et n'avaient pas de ''framebuffer'', ni de tampon de profondeur, ni gestion de l'éclairage, ni quoique ce soit. De tels systèmes étaient donc des accélérateurs géométriques que de vrais systèmes graphiques complets, du fait de l'absence de ''framebuffer''. Ils étaient composés de processeurs spécialisés dans les calculs à virgule flottante, faisant des calculs géométriques, et éventuellement d'un processeur pour la rastérisation. La raison est que la RAM était très chère et que créer des circuits fixes étaient très chers et peu disponibles. Par contre, les processeurs à virgule flottante étaient peu chers et facile à trouver. Vers la fin des années 80, grâce à la baisse du prix de la RAM et la démocratisation des ASIC (des circuits fixes fait sur mesure), ajouter un ''framebuffer'' est est devenu possible. C'est alors que sont apparus les '''systèmes de rendu 3D de première génération'''. De tels systèmes ont permis d'implémenter le rendu à primitives colorées qu'on a vu il y a quelques chapitres, à savoir un rendu où les triangles sont coloriés avec une couleur unique. Les systèmes de première génération étaient simples : des processeurs pour le calcul de la géométrie, un circuit de rastérisation, une RAM pour le ''framebuffer'' et des ASIC servant de ROPs très simples. Il n'y avait pas d'élimination des pixels cachés, pas de textures, et encore moins d'éclairage par pixels. Le premier système de ce genre était le ''Shaded Picture System'', toujours par Evans & Sutherland. Il ne gérait pas la couleur et ne pouvait afficher que des images en noir et blanc, mais il gérait l'éclairage par sommet (''vertex lighting''). Il a rapidement été dépassé par les systèmes de l'entreprise ''Silicon Graphics Inc'' (SGI), ainsi que ceux de l'entreprise Apollo avec sa série Apollo DN. Les '''systèmes de seconde génération''' sont apparus vers la fin des années 80, et se distinguent des précédents par l'ajout un tampon de profondeur. Ils intègrent aussi des capacités d'éclairage par pixel, à savoir de l'éclairage plat, de Gouraud, voire de Phong ! Enfin, les '''systèmes de troisième génération''' ont acquis des capacités de placage de texture, que les systèmes précédents n'avaient pas. Ils ont aussi ajouté un support de l'antialiasing. Les systèmes SGI avec placage de texture ont déjà été abordé au chapitre précédent, dans la section sur les GPU en mode immédiat et à ''tile''. Aussi, nous ne reviendrons pas dessus. [[File:Evolution de l'architecture des premières cartes graphiques, dans les années 80-90.png|centre|vignette|upright=2.5|Evolution de l'architecture des premières cartes graphiques, dans les années 80-90]] Les systèmes de première, seconde et troisième génération avaient de nombreux points communs. En premier lieu, ils étaient fabriqués en connectant plusieurs cartes électroniques : une carte pour les calculs géométriques, une ou plusieurs cartes pour le reste du rendu graphique, une carte dédiée au VDC et avec un connecteur écran. Les transistors de l'époque n'étaient pas encore miniaturisés, ce qui fait que le système graphique ne pouvait pas tenir sur une seule carte électronique. Il n'y avait donc pas de carte graphique proprement dit, mais un équivalent éclaté sur plusieurs cartes électroniques. La carte pour la géométrie contenait typiquement une mémoire FIFO pour accumuler les commandes de rendu, un processeur de commande, et plusieurs processeurs géométriques. Les processeurs géométriques étaient parfois conçus sur mesure, comme l'a été le le ''Geometry Engine'' de SGI. Mais il est arrivé qu'ils utilisent des processeurs commerciaux comme le Weitek 3222, l'Intel i860, etc. Les processeurs pouvaient être placés en série ou en parallèle, comme expliqué dans le chapitre précédent. Le circuit de rastérisation était réalisé soit avec un processeur dédié, soit avec un circuit fixe, soit un mélange des deux. La rastérisation est en effet réalisée en plusieurs étapes, certaines peuvent être implémentées avec un processeur et d'autres avec des circuits fixes. Un point important est qu'à l'époque, le rendu n'utilisait pas que des triangles, mais des polygones en général. Ce n'est que par la suite que le rendu s'est focalisé sur les triangles et les ''quads'' (quadrilatères). Il arrivait que le système graphique gérait partiellement des polygones concaves, voire convexes. Sur les systèmes SGI, les calculs géométriques se faisaient avec des polygones, que la rastérisation découpait en triangles, le reste du rendu se faisait avec des triangles. Les stations de travail Apollo DN 10000VS découpaient les polygones en trapézoïdes orientés à l'horizontale, alignés avec des ''scanlines''. D'autres systèmes découpaient tout en triangle lors de l'étape géométrique ==Les précurseurs grand public : les bornes d'arcade== [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] L'accélération du rendu 3D sur les bornes d'arcade était déjà bien avancé dès les années 90. Les bornes d'arcade ont toujours été un segment haut de gamme de l'industrie du jeu vidéo, aussi ce n'est pas étonnant. Le prix d'une borne d'arcade dépassait facilement les 10 000 dollars pour les plus chères et une bonne partie du prix était celui du matériel informatique. Le matériel était donc très puissant et débordait de mémoire RAM comparé aux consoles de jeu et aux PC. La plupart des bornes d'arcade utilisaient du matériel standardisé entre plusieurs bornes. A l'intérieur d'une borne d'arcade se trouve une '''carte de borne d'arcade''' qui est une carte mère avec un ou plusieurs processeurs, de la RAM, une carte graphique, un VDC et pas mal d'autres matériels. La carte est reliée aux périphériques de la borne : joysticks, écran, pédales, le dispositif pour insérer les pièces afin de payer, le système sonore, etc. Le jeu utilisé pour la borne est placé dans une cartouche qui est insérée dans un connecteur spécialisé. Les cartes de bornes d'arcade étaient généralement assez complexes, elles avaient une grande taille et avaient plus de composants que les cartes mères de PC. Chaque carte contenait un grand nombre de chips pour la mémoire RAM et ROM, et il n'était pas rare d'avoir plusieurs processeurs sur une même carte. Et il n'était pas rare d'avoir trois à quatre cartes superposées dans une seule borne. Pour ceux qui veulent en savoir plus, Fabien Sanglard a publié gratuitement un livre sur le fonctionnement des cartes d'arcade CPS System, disponible via ce lien : [https://fabiensanglard.net/b/cpsb.pdf The book of CP System]. Les premières cartes graphiques des bornes d'arcade étaient des cartes graphiques 2D auxquelles on avait ajouté quelques fonctionnalités. Les sprites pouvaient être tournés, agrandit/réduits, ou déformés pour simuler de la perspective et faire de la fausse 3D. Par la suite, le vrai rendu 3D est apparu sur les bornes d'arcade. Dès 1988, la carte d'arcade Namco System 21 et Sega Model 1 géraient les calculs géométriques. Quelques années plus tard, les cartes graphiques se sont mises à supporter un éclairage de Gouraud et du placage de texture. Par exemple, le Namco System 22 et la Sega model 2 supportaient des textures 2D et comme le filtrage de texture (bilinéaire et trilinéaire), le mip-mapping, et quelques autres. Au passage, les cartes graphiques de la Namco System 22 étaient développées en partenariat avec Eans & Sutherland, qui avait commencé à se diversifier dans le marché grand public. Les cartes graphiques de l'époque faisaient les calculs géométriques sur plusieurs processeurs, généralement des processeurs de type DSP (des processeurs spécialisés dans le traitement de signal). Par exemple, la Namco System 2 utilisait 4 DSP de marque Texas Instruments TMS320C25, cadencés à 24,576 MHz. La carte d'arcade Sega Model 1 utilisait quant à elle un DSP spécialisé dans les calculs géométriques. Par la suite, les bornes d'arcade ont réutilisé le hardware des PC et autres consoles de jeux. ==La 3D sur les consoles de quatrième/cinquième génération== Les consoles avant la quatrième génération de console étaient des consoles purement 2D, sans circuits d'accélération 3D. Leur carte graphique était un simple VDC 2D, plus ou moins performant selon la console. Les premières consoles de jeu capables de rendu 3D par elles-mêmes sont les consoles dites de 5ème génération. Il y a diverses manières de classer les consoles en générations, la plus commune place la 3D à la 5ème génération, mais détailler ces controverses quant à ce classement nous amènerait trop loin. Les consoles de génération avaient une architecture assez différente des systèmes antérieurs. Les systèmes SGI et assimilés pouvaient se permettre de couter assez cher, d'utiliser beaucoup de circuits, de prendre beaucoup de place. Les bornes d'arcade sont aussi dans ce cas. Aussi, il n'était pas rare que les cartes 3D de l'époque tiennent sur plusieurs cartes électroniques séparées. Mais une console ne peut pas se permettre ce genre de folies. Aussi, les cartes 3D des consoles de l'époque tenaient dans un seul circuit intégré, comme il est d'usage de nos jours. La conséquence est que certains circuits étaient fortement simplifiés, sur les consoles de cinquième génération. Et cela a impacté l'architecture interne des GPU des consoles. Les systèmes SGI avaient plusieurs processeurs pour calculer la géométrie, couplés à plusieurs unités non-programmables pour les pixels/textures. Les cartes 3D des consoles gardaient cette organisation : processeurs pour la géométrie, circuits fixes pour le reste. Mais elles se débrouillaient souvent avec un seul processeur, voire aucun ! Dans ce dernier cas, la géométrie était calculée sur le processeur principal, le CPU. Les unités pour les pixels étaient aussi moins nombreuses, mais il y en avait plusieurs, pour profiter de l'amplification des pixels. : Les cartes 3D des consoles de jeu utilisaient le placage de texture inverse, avec quelques exceptions qui utilisaient le placage de texture direct. ===Le rendu 3D sur les consoles de quatrième génération : la SNES=== Plus haut, j'ai dit que les consoles de quatrième génération n'avaient pas de carte accélératrice 3D. Pourtant, elles ont connus quelques jeux en vraie 3D. La raison à cela est que la 3D était calculée par un GPU placé dans les cartouches du jeu ! Par exemple, les cartouches de Starfox et de Super Mario 2 contenaient un coprocesseur Super FX, qui gérait des calculs de rendu 2D/3D. En tout, il y a environ 16 coprocesseurs pour la SNES et on en trouve facilement la liste sur le net. La console était conçue pour, des pins sur les ports cartouches étaient prévues pour des fonctionnalités de cartouche annexes, dont ces coprocesseurs. Ces pins connectaient le coprocesseur au bus des entrées-sorties. Les coprocesseurs des cartouches de NES avaient souvent de la mémoire rien que pour eux, qui était intégrée dans la cartouche. Ceci étant dit, passons aux consoles de cinquième génération. ===La Nintendo 64 : un GPU avancé=== La Nintendo 64 avait le GPU le plus complexe comparé aux autres consoles, et dépassait même les cartes graphiques des PC. Il faut dire que son GPU a été conçu avec l'aide de l'entreprise SGI, dont on a vu les systèmes graphiques plus haut. Le GPU de la N64 incorporait une unité pour les calculs géométriques, un circuit de rasterisation, une unité de textures et un ROP final pour les calculs de transparence/brouillard/antialiasing, ainsi qu'un circuit pour gérer la profondeur des pixels. En somme, tout le pipeline graphique était implémenté dans le GPU de la Nintendo 64, chose très en avance sur son temps, comparé au PC ou aux autres consoles ! Le GPU est construit autour d'un processeur dédié aux calculs géométriques, le ''Reality Signal Processor'' (RSP), autour duquel on a ajouté des circuits pour le reste du pipeline graphique. L'unité de calcul géométrique est un processeur MIPS R4000, un processeur assez courant à l'époque, auquel on avait retiré quelques fonctionnalités inutiles pour le rendu 3D. Il était couplé à 4 KB de mémoire vidéo, ainsi qu'à 4 KB de mémoire ROM. Le reste du GPU était réalisé avec des circuits fixes. Un point intéressant est que le programme exécuté par le RSP pouvait être programmé ! Le RSP gérait déjà des espèces de proto-shaders, qui étaient appelés des ''[https://ultra64.ca/files/documentation/online-manuals/functions_reference_manual_2.0i/ucode/microcode.html micro-codes]'' dans la documentation de l'époque. La ROM associée au RSP mémorise cinq à sept programmes différents, aux fonctionnalités différentes. * Les microcodes gspFast3D et gspF3DNoN, implémentent un rendu 3D normal, avec des options de ''clipping'' différentes entre les deux. * Le microcode gspTurbo3D fait la même chose, mais avec moins de fonctionnalités et avec une précision réduite. Il ne gère pas le ''clipping'', l'éclairage par pixel, la correction de perspective, l'antialiasing et quelques autres fonctionnalités. Il gère cependant l'éclairage de Gouraud. Il utilise une ''display list'' simplifiée comparé aux deux microcodes précédents. * Le microcode gspZ-Sort effectue une pré-passe z, à savoir qu'il calcule le tampon de profondeur final de la scène 3D, sans rendre l'image. Cela sert à faire une élimination des pixels cachés parfaite, en logiciel. On calcule le tampon de profondeur pour déterminer quels pixels sont visibles, puis une seconde passe rend l'image en, rejetant les pixels non-visibles. * Le microcode gspSprite2D implémente un rendu 2D émulé : les sprites et arrière-plan sont des rectangles texturés. Le microcode gspS2DEX fait la même chose, mais sert à émuler le rendu de la SNES plus qu'autre chose. * Le microcode gspLine3D ne gére que des lignes, pas de triangles. Il sert pour du rendu en fil de fer. Ils géraient le rendu 3D de manière différente et avec une gestion des ressources différentes. Très peu de studios de jeu vidéo ont développé leur propre microcodes N64, car la documentation était mal faite, que Nintendo ne fournissait pas de support officiel pour cela, que les outils de développement ne permettaient pas de faire cela proprement et efficacement. ===La Playstation 1=== Sur la Playstation 1 le calcul de la géométrie était réalisé par le processeur, la carte graphique gérait tout le reste. Et la carte graphique était un circuit fixe spécialisé dans la rasterisation et le placage de textures. Elle utilisait, comme la Nintendo 64, le placage de texture inverse, qui est apparu ensuite sur les cartes graphiques. ===La 3DO et la Sega Saturn=== La Sega Saturn et la 3DO étaient les deux seules consoles à utiliser le rendu direct. La géométrie était calculée sur le processeur, même si les consoles utilisaient parfois un CPU dédié au calcul de la géométrie. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. La Sega Saturn incorpore trois processeurs et deux GPU. Les deux GPUs sont nommés le VDP1 et le VDP2. Le VDP1 s'occupe des textures et des sprites, le VDP2 s'occupe uniquement de l'arrière-plan et incorpore un VDC tout ce qu'il y a de plus simple. Ils ne gèrent pas du tout la géométrie, qui est calculée par les trois processeurs. Le troisième processeur, la Saturn Control Unit, est un processeur de type DSP, à savoir un processeur spécialisé dans le traitement de signal. Il est utilisé presque exclusivement pour accélérer les calculs géométriques. Il avait sa propre mémoire RAM dédiée, 32 KB de SRAM, soit une mémoire locale très rapide. Les transferts entre cette RAM et le reste de l'ordinateur était géré par un contrôleur DMA intégré dans le DSP. En somme, il s'agit d'une sorte de processeur spécialisé dans la géométrie, une sorte d'unité géométrique programmable. Mais la géométrie n'était pas forcément calculée que sur ce DSP, mais pouvait être prise en charge par les 3 CPU. ==L'historique des cartes graphiques pour PC== Sur PC, l'évolution des cartes graphiques a eu du retard par rapport aux consoles. Les PC sont en effet des machines multi-usage, pour lesquelles le jeu vidéo était un cas d'utilisation parmi tant d'autres. Et les consoles étaient la plateforme principale pour jouer à des jeux vidéo, le jeu vidéo PC étant plus marginal. Mais cela ne veut pas dire que le jeu PC n'existait pas, loin de là ! Un problème pour les jeux PC était que l'écosystème des PC était aussi fragmenté en plusieurs machines différentes : machines Apple 1 et 2, ordinateurs Commdore et Amiga, IBM PC et dérivés, etc. Aussi, programmer des jeux PC n'était pas mince affaire, car les problèmes de compatibilité étaient légion. C'est seulement quand la plateforme x86 des IBM PC s'est démocratisée que l'informatique grand public s'est standardisée, réduisant fortement les problèmes de compatibilité. Mais cela n'a pas suffit, il a aussi fallu que les API 3D naissent. Les API 3D comme Direct X et Open GL sont absolument cruciales pour garantir la compatibilité entre plusieurs ordinateurs aux cartes graphiques différentes. Aussi, l'évolution des cartes graphiques pour PC s'est faite main dans la main avec l'évolution des API 3D. Les fonctionnalités des cartes graphiques ont évolué dans le temps, en suivant les évolutions des API 3D. Du moins dans les grandes lignes, car il est arrivé plusieurs fois que des fonctionnalités naissent sur les cartes graphiques, pour que les fabricants forcent la main de Microsoft ou d'Open GL pour les intégrer de force dans les API 3D. Passons. ===L'introduction des premiers jeux 3D : Quake et les drivers miniGL=== L'API OpenGL est née de la main de SGI, encore eux ! SGI avait créé l'API Iris GL pour ses stations de travail Iris Graphics. Iris GL a ensuite été libéré et est devenu le standard Open GL. Open GL existait déjà avant l'apparition des cartes accélératrices 3D. Il y a avait donc déjà un terreau que les programmeurs graphiques pouvaient utiliser. Mais Open GL était surtout utilisé pour des applications industrielles, médicales (imagerie), graphiques ou militaires, pas pour le jeu vidéo. Mais cela changea avec la sortie du jeu Quake, d'IdSoftware, en 1996. Quake pouvait fonctionner en rendu logiciel, mais le programmeur responsable du moteur 3D (le célébre John Carmack) ajouta une version OpenGL du jeu. Il faut dire que le jeu était programmé sur une station de travail compatible avec OpenGL, même si aucune carte accélératrice de l'époque ne supportait OpenGL. C'était là un choix qui se révéla visionnaire. En théorie, le rendu par OpenGL aurait dû se faire intégralement en logiciel, sauf sur quelques rares stations de travail adaptées. Mais les premières cartes graphiques étaient déjà dans les starting blocks. La toute première carte 3D pour PC est la '''Rendition Vérité V1000''', sortie en Septembre 1995, soit quelques mois avant l'arrivée de la Nintendo 64. La Rendition Vérité V1000 contenait un processeur MIPS cadencé à 25 MHz, 4 mébioctets de RAM, une ROM pour le BIOS, et un RAMDAC, rien de plus. C'était un vrai ordinateur complètement programmable de bout en bout, sans aucun circuit fixe. Les programmeurs ne pouvaient cependant pas utiliser cette programmabilité avec des ''shaders'', mais elle permettait à Rendition d'implémenter n'importe quelle API 3D, que ce soit OpenGL, DirectX ou même sa son API propriétaire. La Rendition Vérité avait de bonnes performances pour ce qui est de la géométrie, mais pas pour le reste. Réaliser la rastérisation et le placage de texture en logiciel n'est pas efficace, pareil pour les opérations de fin de pipeline comme l'antialiasing. Le manque d'unités fixes très rapides pour la rastérisation, le placage de texture ou les opérations de fin de pipeline était clairement un gros défaut. Mais la Rendition Vérité était un cas à part, une exception dans le paysage des cartes 3D de l'époque, qui ne faisait rien comme les autres. Les autres cartes graphiques, sorties peu après, étaient les Voodoo de 3dfx, les Riva TNT de NVIDIA, les Rage/3D d'ATI, la Virge/3D de S3, et la Matrox Mystique. Elles avaient choisit le compromis inverse de la Rendition Vérité V1000 : de bonnes performances pour le placage de textures et la rastérization, mais pas pour les calculs géométriques. Pour rappel, les systèmes professionnels et les consoles avaient des processeurs pour la géométrie, et des circuits fixes pour le reste. Les cartes graphiques de PC se passaient des processeurs pour la géométrie, les calculs géométriques étaient réalisés par le CPU. Les toutes premières cartes 3D pour PC contenaient seulement des circuits pour gérer les textures et des ROPs. Elle géraient le ''z-buffer'' en mémoire vidéo, ainsi que des effets de brouillard. Il n'y avait même pas de circuit pour la rastérisation, qui était faite en logiciel, avec les calculs géométriques. [[File:Architecture de base d'une carte 3D - 2.png|centre|vignette|upright=1.5|Carte 3D sans rasterization matérielle.]] Les cartes suivantes ajoutèrent une gestion des étapes de ''rasterization'' directement en matériel. Les cartes ATI rage 2, les Invention de chez Rendition, et d'autres cartes graphiques supportaient la rasterisation en hardware. [[File:Architecture de base d'une carte 3D - 3.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] Pour exploiter les unités de texture et le circuit de rastérisation, OpenGL et Direct 3D étaient partiellement implémentées en logiciel, car les cartes graphiques ne supportaient pas toutes les fonctionnalités de l'API. C'était l'époque du miniGL, des implémentations partielles d'OpenGL, fournies par les fabricants de cartes 3D, implémentées dans les pilotes de périphériques de ces dernières. Les fonctionnalités d'OpenGL implémentées dans ces pilotes étaient presque toutes exécutées en matériel, par la carte graphique. Avec l'évolution du matériel, les pilotes de périphériques devinrent de plus en plus complets, au point de devenir des implémentations totales d'OpenGL. Mais au-delà d'OpenGL, chaque fabricant de carte graphique avait sa propre API propriétaire, qui était gérée par leurs pilotes de périphériques (''drivers''). Par exemple, les premières cartes graphiques de 3dfx interactive, les fameuses voodoo, disposaient de leur propre API graphique, l'API Glide. Elle facilitait la gestion de la géométrie et des textures, ce qui collait bien avec l'architecture de ces cartes 3D. Mais ces API propriétaires tombèrent rapidement en désuétude avec l'évolution de DirectX et d'OpenGL. Direct X était une API dans l'ombre d'Open GL. La première version de Direct X qui supportait la 3D était DirectX 2.0 (juin 2, 1996), suivie rapidement par DirectX 3.0 (septembre 1996). Elles dataient d'avant le jeu Quake, et elles étaient très éloignées du hardware des premières cartes graphiques. Elles utilisaient un système d'''execute buffer'' pour communiquer avec la carte graphique, Microsoft espérait que le matériel 3D implémenterait ce genre de système. Ce qui ne fu pas le cas. Direct X 4.0 a été abandonné en cours de développement pour laisser à une version 5.0 assez semblable à la 2.0/3.0. Le mode de rendu laissait de côté les ''execute buffer'' pour coller un peu plus au hardware de l'époque. Mais rien de vraiment probant comparé à Open GL. Même Windows utilisait Open GL au lieu de Direct X maison... C'est avec Direct X 6.0 que Direct X est entré dans la cours des grands. Il gérait la plupart des technologies supportées par les cartes graphiques de l'époque. ===Le ''multi-texturing'' de l'époque Direct X 6.0 : combiner plusieurs textures=== Une technologie très importante standardisée par Dirext X 6 est la technique du '''''multi-texturing'''''. Avec ce qu'on a dit dans le chapitre précédent, vous pensez sans doute qu'il n'y a qu'une seule texture par objet, qui est plaquée sur sa surface. Mais divers effet graphiques demandent d'ajouter des textures par dessus d'autres textures. En général, elles servent pour ajouter des détails, du relief, sur une surface pré-existante. Un exemple intéressant vient des jeux de tir : ajouter des impacts de balles sur les murs. Pour cela, on plaque une texture d'impact de balle sur le mur, à la position du tir. Il s'agit là d'un exemple de '''''decals''''', des petites textures ajoutées sur les murs ou le sol, afin de simuler de la poussière, des impacts de balle, des craquelures, des fissures, des trous, etc. Les textures en question sont de petite taille et se superposent à une texture existante, plus grande. Rendre des ''decals'' demande de pouvoir superposer deux textures. Direct X 6.0 supportait l'application de plusieurs textures directement dans le matériel. La carte graphique devait être capable d'accéder à deux textures en même temps, ou du moins faire semblant que. Pour cela, elle doublaient les unités de texture et adaptaient les connexions entre unités de texture et mémoire vidéo. La mémoire vidéo devait être capable de gérer plusieurs accès mémoire en même temps et devait alors avoir un débit binaire élevé. [[File:Multitexturing.png|centre|vignette|upright=2|Multitexturing]] La carte graphique devait aussi gérer de quoi combiner deux textures entre elles. Par exemple, pour revenir sur l'exemple d'une texture d'impact de balle, il faut que la texture d'impact recouvre totalement la texture du mur. Dans ce cas, la combinaison est simple : la première texture remplace l'ancienne, là où elle est appliquée. Mais les cartes graphiques ont ajouté d'autres combinaisons possibles, par exemple additionner les deux textures entre elle, faire une moyenne des texels, etc. Les opérations pour combiner les textures était le fait de circuits appelés des '''''combiners'''''. Concrètement, les ''combiners'' sont de simples unités de calcul. Les ''conbiners'' ont beaucoup évolués dans le temps, mais les premières implémentation se limitaient à quelques opérations simples : addition, multiplication, superposition, interpolation. L'opération effectuer était envoyée au ''conbiner'' sur une entrée dédiée. [[File:Multitexturing avec combiners.png|centre|vignette|upright=2|Multitexturing avec combiners]] S'il y avait eu un seul ''conbiner'', le circuit de ''multitexturing'' aurait été simplement configurable. Mais dans la réalité, les premières cartes utilisant du ''multi-texturing'' utilisaient plusieurs ''combiners'' placés les uns à la suite des autres. L'implémentation des ''combiners'' retenue par Open Gl, et par le hardware des cartes graphiques, était la suivante. Les ''combiners'' étaient placés en série, l'un à la suite de l'autre, chacun combinant le résultat de l'étage précédent avec une texture. Le premier ''combiner'' gérait l'éclairage par sommet, afin de conserver un minimum de rétrocompatibilité. [[File:Texture combiners Open GL.png|centre|vignette|upright=2|Texture combiners Open GL]] Voici les opérations supportées par les ''combiners'' d'Open GL. Ils prennent en entrée le résultat de l'étage précédent et le combinent avec une texture lue depuis l'unité de texture. {|class="wikitable" |+ Opérations supportées par les ''combiners'' d'Open GL |- ! Replace | colspan="2" | Pixel provenant de l'unité de texture |- ! Addition | colspan="2" | Additionne l'entrée au texel lu. |- ! Modulate | colspan="2" | Multiplie l'entrée avec le texel lu |- ! Mélange (''blending'') | Moyenne pondérée des deux entrées, pondérée par la composante de transparence || La couleur de transparence du texel lu et de l'entrée sont multipliées. |- ! Decals | Moyenne pondérée des deux entrées, pondérée par la composante de transparence. || La transparence du résultat est celle de l'entrée. |} Il faut noter qu'un dernier étage de ''combiners'' s'occupait d'ajouter la couleur spéculaire et les effets de brouillards. Il était à part des autres et n'était pas configurable, c'était un étage fixe, qui était toujours présent, peu importe le nombre de textures utilisé. Il était parfois appelé le '''''combiner'' final''', terme que nous réutiliserons par la suite. Mine de rien, cela a rendu les cartes graphiques partiellement programmables. Le fait qu'il y ait des opérations enchainées à la suite, opérations qu'on peut choisir librement, suffit à créer une sorte de mini-programme qui décide comment mélanger plusieurs textures. Mais il y avait une limitation de taille : le fait que les données soient transmises d'un étage à l'autre, sans détours possibles. Par exemple, le troisième étage ne pouvait avoir comme seule opérande le résultat du second étage, mais ne pouvait pas utiliser celui du premier étage. Il n'y avait pas de registres pour stocker ce qui sortait de la rastérisation, ni pour mémoriser temporairement les texels lus. ===Le ''Transform & Lighting'' matériel de Direct X 7.0=== La première carte graphique pour PC capable de gérer la géométrie en hardware fût la Geforce 256, la toute première Geforce. Son unité de gestion de la géométrie n'est autre que la bien connue '''unité T&L''' (''Transform And Lighting''). Elle implémentait des algorithmes d'éclairage de la scène 3D assez simples, comme un éclairage de Gouraud, qui étaient directement câblés dans ses circuits. Mais contrairement à la Nintendo 64 et aux bornes d'arcade, elle implémentait le tout, non pas avec un processeur classique, mais avec des circuits fixes. Avec Direct X 7.0 et Open GL 1.0, l'éclairage était en théorie limité à de l'éclairage par sommet, l'éclairage par pixel n'était pas implémentable en hardware. Les cartes graphiques ont tenté d'implémenter l'éclairage par pixel, mais cela n'est pas allé au-delà du support de quelques techniques de ''bump-mapping'' très limitées. Par exemple, Direct X 6.0 implémentait une forme limitée de ''bump-mapping'', guère plus. Un autre problème est qu'il a beaucoup d'algorithmes d'éclairages différents, aux résultats visuels différents, bien au-delà des algorithmes d'éclairage plat, de Gouraud et de Phong. Et les unités de T&L étaient souvent en retard sur les algorithmes logiciels. Les programmeurs avaient le choix entre programmer les algorithmes d’éclairage qu'ils voulaient et les exécuter en logiciel, ou utiliser ceux de l'unité de T&L. Ils choisissaient souvent la première option. Par exemple, Quake 3 Arena et Unreal Tournament n'utilisaient pas les capacités d'éclairage géométrique et préféraient utiliser leurs calculs d'éclairage logiciel fait maison. Cependant, le hardware dépassait les capacités des API et avait déjà commencé à ajouter des capacités de programmation liées au ''multi-texturing''. Les cartes graphiques de l'époque, surtout chez NVIDIA, implémentaient un système de '''''register combiners''''', une forme améliorée de ''texture combiners'', qui permettait de faire une forme limitée d'éclairage par pixel, notamment du vrai ''bump-mampping'', voire du ''normal-mapping''. Mais ce n'était pas totalement supporté par les API 3D de l'époque. Les ''registers combiners'' sont des ''texture combiners'' mais dans lesquels ont aurait retiré la stricte organisation en série. Il y a toujours plusieurs étages à la suite, qui peuvent exécuter chacun une opération, mais tous les étages ont maintenant accès à toutes les textures lues et à tout ce qui sort de la rastérisation, pas seulement au résultat de l'étape précédente. Pour cela, on ajoute des registres pour mémoriser ce qui sort des unités de texture, et pour ce qui sort de la rastérisation. De plus, on ajoute des registres temporaires pour mémoriser les résultats de chaque ''combiner'', de chaque étage. Il faut cependant signaler qu'il existe un ''combiner'' final, séparé des étages qui effectuent des opérations proprement dits. Il s'agit de l'étage qui applique la couleur spéculaire et les effets de brouillards. Il ne peut être utilisé qu'à la toute fin du traitement, en tant que dernier étage, on ne peut pas mettre d'opérations après lui. Sa sortie est directement connectée aux ROPs, pas à des registres. Il faut donc faire la distinction entre les '''''combiners'' généraux''' qui effectuent une opération et mémorisent le résultat dans des registres, et le ''combiner'' final qui envoie le résultat aux ROPs. L'implémentation des ''register combiners'' utilisait un processeur spécialisés dans les traitements sur des pixels, une sorte de proto-processeur de ''shader''. Le processeur supportait des opérations assez complexes : multiplication, produit scalaire, additions. Il s'agissait d'un processeur de type VLIW, qui sera décrit dans quelques chapitres. Mais ce processeur avait des programmes très courts. Les premières cartes NVIDIA, comme les cartes TNT pouvaient exécuter deux opérations à la suite, suivie par l'application de la couleurs spéculaire et du brouillard. En somme, elles étaient limitées à un ''shader'' à deux/trois opérations, mais c'était un début. Le nombre d'opérations consécutives est rapidement passé à 8 sur la Geforce 3. [[File:Architecture de base d'une carte 3D - 4.png|centre|vignette|upright=1.5|Carte 3D avec gestion de la géométrie.]] ===L'arrivée des ''shaders'' avec Direct X 8.0=== Les ''register combiners'' était un premier pas vers un éclairage programmable. Paradoxalement, l'évolution suivante s'est faite non pas dans l'unité de rastérisation/texture, mais dans l'unité de traitement de la géométrie. La Geforce 3 a remplacé l'unité de T&L par un processeur capable d'exécuter des programmes. Les programmes en question complétaient l'unité de T&L, afin de pouvoir rajouter des techniques d'éclairage plus complexes. Le tout a permis aussi d'ajouter des animations, des effets de fourrures, des ombres par ''shadow volume'', des systèmes de particule évolués, et bien d'autres. À partir de la Geforce 3 de Nvidia, les cartes graphiques sont devenues capables d'exécuter des programmes appelés '''''shaders'''''. Le terme ''shader'' vient de ''shading'' : ombrage en anglais. Grace aux ''shaders'', l'éclairage est devenu programmable, il n'est plus géré par des unités d'éclairage fixes mais été laissé à la créativité des programmeurs. Les programmeurs ne sont plus vraiment limités par les algorithmes d'éclairage implémentés dans les cartes graphiques, mais peuvent implémenter les algorithmes d'éclairage qu'ils veulent et peuvent le faire exécuter directement sur la carte graphique. Les ''shaders'' sont classifiés suivant les données qu'ils manipulent : '''''pixel shader''''' pour ceux qui manipulent des pixels, '''''vertex shaders''''' pour ceux qui manipulent des sommets. Les premiers sont utilisés pour implémenter l'éclairage par pixel, les autres pour gérer tout ce qui a trait à la géométrie, pas seulement l'éclairage par sommets. Direct X 8.0 avait un standard pour les shaders, appelé ''shaders 1.0'', qui correspondait parfaitement à ce dont était capable la Geforce 3. Il standardisait les ''vertex shaders'' de la Geforce 3, mais il a aussi renommé les ''register combiners'' comme étant des ''pixel shaders'' version 1.0. Les ''register combiners'' n'ont pas évolués depuis la Geforce 256, si ce n'est que les programmes sont passés de deux opérations successives à 8, et qu'il y avait possibilité de lire 4 textures en ''multitexturing''. A l'opposé, le processeur de ''vertex shader'' de la Geforce 3 était capable d'exécuter des programmes de 128 opérations consécutives et avait 258 registres différents ! Des ''pixels shaders'' plus évolués sont arrivés avec l'ATI Radeon 8500 et ses dérivés. Elle incorporait la technologie ''SMARTSHADER'' qui remplacait les ''registers combiners'' par un processeur de ''shader'' un peu limité. Un point est que le processeur acceptait de calculer des adresses de texture dans le ''pixel shader''. Avant, les adresses des texels à lire étaient fournis par l'unité de rastérisation et basta. L'avantage est que certains effets graphiques étaient devenus possibles : du ''bump-mapping'' avancé, des textures procédurales, de l'éclairage par pixel anisotrope, du éclairage de Phong réel, etc. Avec la Radeon 8500, le ''pixel shader'' pouvait calculer des adresses, et lire les texels associés à ces adresses calculées. Les ''pixel shaders'' pouvaient lire 6 textures, faire 8 opérations sur les texels lus, puis lire 6 textures avec les adresses calculées à l'étape précédente, et refaire 8 opérations. Quelque chose de limité, donc, mais déjà plus pratique. Les ''pixel shaders'' de ce type ont été standardisé dans Direct X 8.1, sous le nom de ''pixel shaders 1.4''. Encore une fois, le hardware a forcé l'intégration dans une API 3D. [[File:Architecture de la Geforce 3.png|centre|vignette|upright=1.5|Architecture de la Geforce 3]] ===Les ''shaders'' de Direct X 9.0 : de vrais ''pixel shaders''=== Avec Direct X 9.0, les ''shaders'' sont devenus de vrais programmes, sans les limitations des ''shaders'' précédents. Les ''pixels shaders'' sont passés à la version 2.0, idem pour les ''vertex shaders''. Concrètement, ils ont des fonctionnalités bien supérieures à celles des ''registers combiners''. Les ''shaders'' pouvaient exécuter une suite d'opérations arbitraire, dans le sens où elle n'était pas structurée avec tel type d'opération au début, suivie par un accès aux textures, etc. On pouvait mettre n'importe quelle opération dans n'importe quel ordre. De plus, les ''shaders'' ne sont plus écrit en assembleur comme c'était le cas avant. Ils sont dorénavant écrits dans un langage de haut-niveau, le HLSL pour les shaders Direct X et le GLSL pour les shaders Open Gl. Les ''shaders'' sont ensuite traduit (compilés) en instructions machines compréhensibles par la carte graphique. Au début, ces langages et la carte graphique supportaient uniquement des opérations simples. Mais au fil du temps, les spécifications de ces langages sont devenues de plus en plus riches à chaque version de Direct X ou d'Open Gl, et le matériel en a fait autant. Le matériel s'est alors adapté, en incorporant un véritable processeur pour les ''pixel shaders''. Les ''pixel shaders'' sont maintenant exécutés par un processeur de ''shader'' dédié, aux fonctionnalités bien supérieures à celles des ''registers combiners''. Le processeur de ''pixel shader'' incorpore l'unité de texture en sont sein, les deux sont fusionnés. La raison à cela sera expliqué dans la suite du chapitre. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=1.5|Carte 3D avec pixels et vertex shaders non-unifiés.]] ===L'après Direct X 9.0 : GPGPU et shaders unifiés=== Avant Direct X 10, les processeurs de ''shaders'' ne géraient pas exactement les mêmes opérations pour les processeurs de ''vertex shader'' et de ''pixel shader''. Les processeurs de ''vertex shader'' et de ''pixel shader''étaient séparés. Depuis DirectX 10, ce n'est plus le cas : le jeu d'instructions a été unifié entre les vertex shaders et les pixels shaders, ce qui fait qu'il n'y a plus de distinction entre processeurs de vertex shaders et de pixels shaders, chaque processeur pouvant traiter indifféremment l'un ou l'autre. [[File:Architecture de base d'une carte 3D - 6.png|centre|vignette|upright=1.5|Architecture de la GeForce 6800.]] Les GPU modernes sont capables d’exécuter des programmes informatiques qui n'ont aucun lien avec le rendu 3D, comme des calculs scientifiques, tout ce qui implique des réseaux de neurones, de l'imagerie médicale, etc. De manière générale, tout calcul faisant usage d'un grand nombre de calculs sur des matrices ou des vecteurs est concerné. L'usage d'une carte graphique pour autre chose que le rendu 3D porte le nom de '''GPGPU''', ''General Processing GPU''. En soi, le GPGPU est assez logique : les processeurs de shaders, bien que conçus avec le rendu 3D en tête, n'en restent pas moins des processeurs assez puissants. Pour ce genre d'utilisations, les GPU actuel supportent des ''shaders'' sans lien avec le rendu 3D, appelés des ''compute shader''. ==Les cartes graphiques d'aujourd'hui== Les circuits d'un GPU ont beaucoup évolué depuis l'introduction des ''shaders'', pour devenir de plus en plus programmables. Mais à côté des processeurs de ''shaders'', il reste quelques circuits non-programmables appelés des circuits fixes. La rastérisation, le placage de texture, l'élimination des pixels cachés et le mélange ''alpha'' sont gérés par des circuits fixes. [[File:3D-Pipeline.svg|centre|vignette|upright=3.0|Pipeline 3D : ce qui est programmable et ce qui ne l'est pas dans une carte graphique moderne.]] Mais pourquoi ne pas tout rendre programmable ? Ou au contraire, utiliser seulement des circuits fixes ? La réponse n'est pas la même pour les ROPs, le rastériseur, et les unités de texture. Pour simplifier, la réponse rapide est qu'il s'agit d'un compromis entre flexibilité et performance qui permet d'avoir le meilleur des deux mondes. Mais ce compromis a fortement évolué dans le temps, comme on va le voir plus bas. Rendre l'éclairage programmable permet d'implémenter facilement un grand nombre d'effets graphiques sans avoir à les implémenter en hardware. Avant les ''shaders'', les effets graphiques derniers cri n'étaient disponibles que sur les derniers modèles de carte graphique. Avec des ''vertex/pixel shaders'', ce genre de défaut est passé à la trappe. Si un nouvel algorithme de rendu graphique est inventé, il peut être utilisé dès le lendemain sur toutes les cartes graphiques modernes. De plus, implémenter beaucoup d'algorithmes d'éclairage différents avec des circuits fixes a un cout en termes de transistors, alors qu'utiliser des circuits programmable a un cout en hardware plus limité. Tout cela est à l'exact opposé de ce qu'on a avec les autres circuits, comme les circuits pour la rastérisation ou le placage de texture. Il n'y a pas 36 façons de rastériser une scène 3D et la flexibilité n'est pas un besoin important pour cette opération, alors que les performances sont cruciales. Même chose pour le placage/filtrage de textures. En conséquences, les unités de rastérisation et de texture sont toutes implémentées en matériel. Faire ainsi permet de gagner en performance sans que cela ait le moindre impact pour le programmeur. Reste à expliquer dans le détail pourquoi. Le cas du ROP est plus complexe et on en reparlera dans un chapitre dédié. Mais pour simplifier, c'est parce que les GPU actuels sont de type ''sort-last'', comme vu dans le chapitre précédent. Il trient les pixels suivant leur position à l'écran à la toute fin du pipeline, et ce tri ne peut pas être rendu programmable. ===Les unités de texture sont intégrées aux processeurs de shaders=== Avec l'arrivée des processeurs de shaders, les unités de texture ont été intégrées dans les processeurs de shaders eux-mêmes. C'est la seule unité fixe qui a subit ce traitement, et il est intéressant de comprendre pourquoi. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=2|Architecture de base d'une carte 3D.]] Pour cela, il faut faire un rappel sur ce qu'il y a dans un processeur. Un processeur contient globalement quatre circuits : * une unité de calcul qui fait des calculs ; * des registres pour stocker les opérandes et résultats des calculs ; * une unité de communication avec la mémoire ; * et un séquenceur, un circuit de contrôle qui commande les autres. L'unité de communication avec la mémoire sert à lire ou écrire des données, à les transférer de la RAM vers les registres, ou l'inverse. Lire une donnée demande d'envoyer son adresse à la RAM, qui répond en envoyant la donnée lue. Elle est donc toute indiquée pour lire une texture : lire une texture n'est qu'un cas particulier de lecture de données. Les texels à lire sont à une adresse précise, la RAM répond à la lecture avec le texel demandé. Il est donc possible d'utiliser l'unité de communication avec la mémoire comme si c'était une unité de texture. Cependant, les textures ne sont pas utilisées comme telles de nos jours. Le rendu 3D moderne utilise des techniques dites de filtrage de texture, qui permettent d'améliorer la qualité du rendu des textures. Sans ce filtrage de texture, les textures appliquées naïvement donnent un résultat assez pixelisé et assez moche, pour des raisons assez techniques. Le filtrage élimine ces artefacts, en utilisant une forme d'''antialiasing'' interne aux textures, le fameux filtrage de texture. Le filtrage de texture peut être réalisé en logiciel ou en matériel. Techniquement, il est possible de le faire dans un ''shader''. Le ''shader'' calcule les adresses des texels à lire, lit les texels, et effectue ensuite le filtrage avec des opérations de calcul. Mais ce n'est pas ce qui est fait, le filtrage de texture est toujours effectué directement en matériel. La raison est que le filtrage de texture est très simple à implémenter en hardware. Le filtrage bilinéaire ou trilinéaire demande juste des circuits d'interpolation et quelques registres, ce qui est trivial. Et la seconde raison est qu'il n'y a pas 36 façons de filtrer des textures : une carte graphique peut implémenter les algorithmes principaux existants en assez peu de circuits. Pour simplifier l'implémentation, les processeurs de ''shader'' modernes disposent d'une unité d'accès mémoire séparée de l'unité de texture. L'unité d'accès mémoire normale s'occupe des accès mémoire hors-textures, alors que l'unité mémoire s'occupe de lire les textures. L'unité de texture contient de quoi faire du filtrage de texture, mais aussi faire des calculs d'adresse spécialisées, intrinsèquement liés au format des textures, qu'on détaillera dans le chapitre sur les textures. En comparaison, les unités d'accès mémoire effectuent des calculs d'adresse plus basiques. Un dernier avantage est que l'unité de texture est reliée au cache de texture, alors que l'unité d'accès mémoire est relié au cache L1/L2. ===Le projet Larrabee d'Intel : une programmabilité maximale=== Pour finir, nous allons parler d'un ancien projet d'Intel, qui ne s'est pas matérialisé : le projet Larrabee. Il s'agissait d'un projet de GPU, qui a été annulé en 2009 avant d'être commercialisé. Le GFU avait pour particularité de limiter les circuits fixes au minimum. Il ne gardait qu'une unité de texture, les ROPs et le rastériseur étaient émulés en logiciel. L'unité de texture n'était pas intégrée aux processeurs de shader, mais en était séparée. Le GPU était composé de plusieurs centaines de processeurs, reliés entre eux avec un réseau d'interconnexion assez complexe. L'unité de texture était connectée sur ce réseau d'interconnexion, de même que le VDC et l'interface avec le bus. [[File:Larrabee slide block diagram.svg|centre|vignette|upright=2.5|Larrabee, diagramme. Les processeurs de shaders sont en orange.]] Un autre point important est que les processeurs utilisés étaient des processeurs x86, les mêmes que ceux utilisés comme CPU dans nos PCs. Le choix d'utiliser des CPU x86 peut sembler étrange, ceux-ci ayant des instructions qui ne servaient à rien pour le rendu 3D, mais qui consommaient une partie du budget en transistors. Mais cela se comprend quand on sait que le GPU était prévu à la fois pour le GPGPU et le rendu 3D. Utiliser des processeurs x86 était très intéressant pour le GPGPU, cela assurait une certaine forme de compatibilité, sans compter que les programmeurs PC sont familiers avec le x86. Pour gérer le problème mentionné plus haut avec les ROPs, Larrabee simulait un GPU de type ''Tile Based Rendering'', où l'écran est divisé en ''tiles'', et la rastérisation se fait ''tile'' par ''tile''. L'émulation logicielle des ROPs était nettement plus simple avec ce genre d'émulation. Mais le logiciel qui émulait les ROPs et le rastériseur était programmé pour éviter ce genre de problèmes. Le projet a été annulé en 2009, sans doute parce qu'il n’arrivait pas à obtenir des performances acceptables. Mais larrabee été recyclé pour donner les Xeon Phi, des cartes d'extension utilisées pour des serveurs, du calcul scientifique ou intensif, ou d'autres usages. Les circuits de rendu 3D avaient été retirées de ces cartes, qui ne faisaient que du calcul. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Avant les GPUs : les cartes accélératrices 3D | prevText=Avant les GPUs : les cartes accélératrices 3D | next=Les processeurs de shaders | nextText=Les processeurs de shaders }}{{autocat}} </noinclude> ep9y3995ykedvqkttjpybhj3kjkgd01 Les cartes graphiques/Le pipeline géométrique : évolution 0 67393 764889 763463 2026-04-24T17:57:42Z Mewtow 31375 /* L'historique de la tesselation sur les cartes 3D */ 764889 wikitext text/x-wiki Le pipeline graphique a beaucoup changé dans le temps et est devenu de plus en plus programmable. Et cela s'est beaucoup ressentit dans la partie du pipeline graphique dédiée au traitement de la géométrie. De circuits fixes de T&L, il a intégré des ''vertex shaders'', puis des ''geometry shaders'', ''hull shaders'', ''domain shaders'', ''primitive shaders'', ''mesh shaders'' et bien d'autres. Dans ce chapitre, nous allons décrire l'évolution de ce pipeline et décrire comment elle s'est déroulée. L'évolution du pipeline géométrique s'est faite en plusieurs grandes périodes, qu'on peut distinguer très nettement. Et pour distinguer ces périodes, nous devons faire quelques rappels sur comment est calculée la géométrie d'une scène 3D. Pour rappel, le pipeline géométrique regroupe les étapes suivantes : * L'étape de '''transformation''' effectue des changements de coordonnées pour chaque sommet. Premièrement, elle place les objets au bon endroit dans la scène 3D, ce qui demande de mettre à jour les coordonnées de chaque sommet de chaque modèle. C'est la première étape de calcul : l'''étape de transformation des modèles 3D''. Ensuite, elle effectue un changement de coordonnées pour centrer l'univers sur la caméra, dans la direction du regard. C'est l'étape de ''transformation de la caméra''. * La phase d''''éclairage''' (en anglais ''lighting'') attribue une couleur à chaque sommet, qui dit si le sommet est fortement éclairé ou dans l'ombre. * La phase d''''assemblage des primitives''' regroupe les sommets en triangles. Chaque étape peut être prise en charge par un processeur de shader, ou par un circuit fixe spécialisé. Les étapes peuvent être regroupées. L'évolution dans le temps se traduit par des changements sur ce qui était programmables et ne l'était pas. Ceci étant dit, voyons comment ces 4 étapes ont variées dans le temps. Dans ce chapitre, nous allons voir l'ancien pipeline géométrique. Il ne traitait que des sommets, les triangles n'existaient qu'une fois l'assemblage de primitive effectué. Le pipeline géométrique après Direct X 10 fonctionne sur un principe totalement différent, mais ce sera le sujet du prochain chapitre. ==La période des ''mainframes'' et ''workstations'' : les années 70-90== La toute première période est celle des années 70 à 90, où le rendu 3D n'était possible que sur des ordinateurs très puissants, comme des ''mainframes'' et stations de travail. L'informatique grand public n'existait pas encore, et le rendu 3D était utilisé pour des simulateurs de vol pour l'armée, de l'imagerie médicale, des applications industrielles, l'architecture, etc. Les jeux vidéos n'existaient pas vraiment, sauf sur consoles et il n'y avait que du rendu 2D sur celles-ci. Les cartes graphiques étaient alors faites sur mesure pour un ordinateur bien précis, qui n'était vendu qu'à moins d'une centaine d'exemplaires. Les API graphiques n'existaient pas encore, ce qui fait que chaque modèle d'ordinateur faisait un peu à sa sauce. Les cartes graphiques étant réalisées presque sur mesure, il y avait une grand diversité d'implémentations, toutes différentes. Et n'oublions pas que tout était à concevoir, le rendu 3D n'en était qu'à ses débuts. Les toutes premières ne géraient pas le placage de textures, les fonctionnalités étaient limitées, la rastérisation utilisait des polygones, etc. ===Les processeurs à virgule flottante pour la géométrie=== Durant cette époque, le traitement de la géométrie était réalisé avec des processeurs à virgule flottante. Le chargement des sommets/triangles était le fait du processeur de commandes, le reste était le fait d'un ou de plusieurs processeurs. Il faut noter que les shaders n'existaient pas encore. Les processeurs étaient programmés avec un "microcode", qui est un terme trompeur pour ceux qui ont déjà lu des cours d'architecture des ordinateurs. En réalité, il s'agissait plus d'un ''firmware''. Les processeurs étaient connectés à une mémoire ROM, qui contenait un programme à exécuter. Le programme faisait tous les calculs nécessaires pour rendre un triangle/polygone. Parmi les processeurs utilisés dans cette période, on trouve le ''geometry engine'' de SGI, l'Intel i860, des processeurs Weitek, etc. Les processeurs en question avaient souvent des fonctionnalités utiles pour le rendu 3D. Au minimum, ils géraient quelques instructions utiles pour le rendu 3D, comme des opérations MAD (''Multiply And Accumulate''), des opérations trigonométriques, une opération pour calculer 1/x, des opérations transcendantales, etc. Le processeur Intel i860 était un processeur un peu particulier dans cette liste. Il gérait à la fois des calculs sur des entiers et à virgule flottante. Il disposait de deux modes : un mode normal où il fonctionnait comme un processeur classique, et un mode "VLIW" où il exécutait en même temps une opération flottante et une opération entière. Les instructions n'étaient pas encodées de la même manière dans les deux modes. ===Le ''geometry engine'' de SGI=== Le ''geometry engine'' de SGI était lui bien différent des autres processeurs. Il était conçu sur mesure pour les calculs géométriques. Le processeur était un processeur de type SIMD, c’est-à-dire qu'il faisait plusieurs opérations identiques, sur des opérandes différents. Il pouvait donc faire 4 additions/soustraction en même temps, chacune étant réalisée dans une unité de calcul séparée. Pour cela, il contenait 4 unités séparées, contenant chacune : * une unité de calcul capable de réaliser les 4 opérations ; * un registre flottant de 29 bits : un bit de signe, un exposant de 8 bits et une mantisse de 20 bits ; * une pile d'opérande de 8 niveaux, dont on reparlera dans la suite. L'unité de calcul gère naturellement les additions et soustraction. Elle dispose aussi d'un support limité des multiplications et divisions. Ces deux opérations sont réalisées en enchainant des additions/soustractions, avec l'aide du microcode. Pour simplifier l'implémentation, chaque unité de calcul contient trois registres entiers pour simplifier l'implémentation des multiplications et divisions. Ils sont appelés l'accumulateur, le ''shift up'' et le ''shift down''. Voyons à quoi ils servent. Pour rappel, une multiplication multiplie un multiplicande par un multiplieur. Le registre accumulateur mémorise les résultats intermédiaires de la multiplication/division, les fameux produits partiels. Les deux autres registres mémorisent le multiplieur ou le diviseur. Ils étaient décalés d'un rang par cycle d'horloge, ce qui facilitait l'implémentation des multiplications et divisions. Le registre ''shift up'' était décalé d'un rang vers la gauche, le registre ''shift down'' l'était d'un rang vers la droite. Les registres flottants sont en réalité chacun composés de deux registres séparés : un pour l'exposant, un autre pour les mantisses. Et l'unité de calcul était elle aussi découpée en deux : une portion gérait les exposants, l'autre les calculs sur les mantisses. Entre les deux, se trouvait toute la logique de contrôle du processeur, avec le décodeur, le ''program counter'', le microcode, etc. [[File:Exemple d'une machine à pile qui code ses entiers sur 4 Bytes.png|vignette|Exemple d'une pile/file d'opérandes, chaque opérande étant codée sur 4 Bytes.]] La pile d'opérande est une petite mémoire qui mémorise plusieurs opérandes. Les opérandes sont organisés en pile (LIFO), à savoir que les opérandes sont ajoutés les unes après l'autre dans cette pile, et que la mémoire mémorise leur ordre d'ajout. De plus, on ne peut accéder qu'à l'opérande la plus récemment ajouté. Il est possible de faire une analogie avec une pile d'assiette : les opérandes sont empilés comme des assiettes, seul l'opérande au sommet de cette pile est accessible. Le processeur gère plusieurs opérations. Premièrement, il peut ajouter un opérande au sommet de la pile, ou au contraire la retirer. Il s'agit des opérations PUSH et POP. Le processeur peut aussi faire une opération entre l’opérande dans les registres, et celle au sommet de la pile. L'opération retire l'opérande de la pile, et la remplace par le résultat de l’opération. La pile d'opérande permet de mémoriser une pile de matrice directement dans les 4 ''geometry engine''. Une matrice 4 par 4 est éclatée sur les différents ''geometry engine'' : ses 4 lignes sont réparties sur 4 processeurs, les 4 nombres par ligne sont dans les registres pour la pile. Il était initialement prévu de mettre cette pile de matrice en dehors du ''geometry engine'', dans une mémoire séparée. Mais Le pipeline géométrique était implémenté en utilisant 10/12 processeurs de ce type, enchainés l'un à la suite de l'autre. Les 4 premiers faisaient une multiplication par une matrice 4*4, les 6 suivants faisaient les opérations de ''clipping/culling'', les deux derniers faisaient la rastérisation proprement dite. Les quatre premiers processeurs prenaient en charge la multiplication d'un sommet par une matrice de 4 par 4. La matrice était découpée en 4 lignes ou colonnes, chacune étant mémorisée dans un processeur : 4 processeurs pour 4 lignes/colonnes, 4 nombres par ligne pour 4 registres flottants par processeur. La mise à jour de la matrice se faisait avec l'aide du processeur de commande. Il était responsable de la mise à jour simultanée des registres de tous les processeurs. Il disposait pour cela de plusieurs commandes, qui étaient toutes à destination des 4 premiers processeurs, sauf la dernière : * LoadMM pour charger une matrice dans les 16 registres des 4 processeurs géométriques ; * StoreMM pour sauvegarder cette matrice dans la RAM ; * MultMM pour multiplier la matrice avec une matrice au sommet de la pile ; * PushMM pour sauvegarder la matrice dans la pile ; * PopMM pour charger la matrice de la pile vers les 4 processeurs géométriques ; * LoadVP pour configurer les registres de ''viewport'' pour le ''clipping'' et la rastérisation. La multiplication demande de faire des additions et des multiplications. Le processeur avait bien une instruction de multiplication, mais celle-ci était réalisée en enchainant des additions et décalages à l'intérieur du processeur (l'instruction était microcodée). Il y avait le même problème pour les deux processeurs dédiés à la rastérisation. L'un était en charge de la coordonnée de profondeur, l'autre des coordonnées x et y à l'écran. Et les deux avaient besoin de faire des divisions, pour des histoires de correction de perspective détaillées dans un prochain chapitre sur la rastérisation. Les divisions étaient microcodées elles aussi, à savoir que le processeur les émulait avec des soustractions successives en interne. Les processeurs pour le ''clipping'' prenaient en charge le ''frustrum clipping'', à savoir qu'ils éliminaient ce qui était en-dehors du champ de vision. Pour rappel, le champ de vision est délimité par 6 plans : gauche, droite, haut, bas, ''near plane'', ''far plane''. Il y avait 6 processeurs pour 6 plans : chaque processeur clippait les triangles pour un plan bien précis. Il était possible de se passer du ''clipping'' pour le ''near'' et le ''far'' plane, ce qui réduisait le nombre de processeur à 5 ou 4. Le fait de clipper un plan à la fois peut paraitre étonnant, mais ce choix est justifié dans le document "Structuring a VLSI architecture", qui décrit le ''geometry engine'' en détail. La conception du chip s'est inspiré du circuit ''Clipping Divider'', utilisé dans le ''Line Drawing System-1'' de l'entreprise Evans & Sutherland. Le circuit en question ne faisait que du ''clipping'' et rien d'autre. Il faisait les calculs de ''clipping'' pour 4 plans en même temps et combinait les 4 résultats. Mais une implémentation similaire avec un circuit intégré aurait posé des problèmes de câblage, les interconnexions auraient pris trop de place. Une implémentation série/pipeline, qui clippe un plan à la fois, n'avait pas de problème. Elle permettait aussi de gérer à la fois des polygones et des lignes, si programmée correctement. : Une description complète du ''Geometry Engine'' et de la carte géométrique des IRIS est disponible ici : [https://cseweb.ucsd.edu/~ravir/6160-fall04/papers/p127-clark.pdf The Geometry Engine : A VLSI Geometry System for Graphics]. ===La station de travail Appollo DN 10000 VS=== Les processeur de l'époque incorporaient diverses optimisations pour accélérer les calculs géométriques. Par exemple, la station de travail Appollo DN 10000 VS faisait les calculs géométriques et de ''clipping'' sur le processeur, pas sur la carte graphique. C'était un choix pas très courant pour l'époque, il n'est pas représentatif. La station de travail incorporait 4 processeurs principaux et une carte graphique qui s'occupait uniquement de la rastérisation et des textures. Les calculs géométriques étaient distribués sur les 4 processeurs, s'ils étaient libres. Toute la difficulté tenait à éviter que les 4 processeurs se marchent dessus. Il fallait synchroniser les processeur et la carte graphique ensemble. Une première synchronisation tient dans l'entrée des triangles dans les processeurs. Les processeurs traitent chaque triangle un par un. L'ordinateur a, dans sa RAM, un pointeur vers le prochain triangle. Les processeurs peuvent lire ce pointeur pour charger le prochain triangle à traiter, et l'incrémentent pour passer au triangle suivant. Mais il ne doit être modifié que par un seul processeur à la fois. Les programmes exécutés sur les 4 processeurs utilisent des mécanismes de synchronisation (des mutex/spinlock) pour éviter que deux processeurs tentent de modifier ce pointeur en même temps. Une autre synchronisation a lieu pour l'accès à la carte graphique. Quand un processeur a finit son travail, il envoie le triangle finalisé à la carte graphique. Mais elle ne peut recevoir qu'un triangle à la fois. Si deux processeurs finissent leur travail presque en même temps, ils vont vouloir envoyer leur résultat en même temps. Il y a alors un conflit d’accès à la carte graphique : plusieurs processeurs veulent communiquer avec en même temps. Là encore, un mécanisme de synchronisation est prévu, lui aussi logiciel et basé sur des mutex/spinlock/autres. Le processeur ajoutait des instructions spéciales pour accélérer le ''clipping''. Les opérations de ''clipping'' en question élimine les pixels situés en-dehors du champ de vision de la caméra, en-dehors du ''view frustrum''. Une implémentation naïve demande d'enchainer 6 paires de calculs, avec chacune une comparaison et un branchement. L'optimisation mémorise les résultats des comparaisons dans un registre de 6 bits (un bit par comparaison). Les 6 bits de résultats sont ensuite analysés par un unique branchement. Ainsi, on passe de 6 comparaisons + 6 branchements à 6 comparaisons + 1 branchement. ==Les cartes accélératrices des PC grand publics : les années 90-2000== La seconde période est celle de l'arrivée des accélérateurs 3D sur les PC grand public et les consoles. Au début de cette période, les cartes graphiques se débrouillaient sans circuits géométriques. Le calcul de la géométrie était réalisé sur le processeur, la carte graphique s'occupait de la rastérisation et de ce qui arrive après. Sur PC, la Geforce 256 a été la première à intégrer une unité non-programmable pour gérer transformation et éclairage, appelée l''''unité de T&L''' (''Transform & Lighting''). L'unité de T&L incorporait un ou plusieurs circuits de multiplication de matrices spécialisés pour l'étape de transformation. Ils sont composés d'un gros paquet de multiplieurs et d'additionneurs flottants. En plus de l'unité de T&L, il y avait deux circuits supplémentaires : un ''input assembler'' et un circuit d'assemblage des primitives. L'''input assembler'' charge les vertices depuis la mémoire vidéo, l'assembleur de primitive regroupe les sommets en triangles avant la rastérisation. : Dans les tableaux qui vont suivre, les circuits non-programmables sont indiqués en rouge. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | class="f_rouge" | ''Input assembly'' | class="f_rouge" | ''Transform & Lighting'' | class="f_rouge" | ''Primitive assembly'' |} Les autres cartes graphiques de l'époque avaient une implémentation similaire, sur PC et console. Soit elles ne faisaient pas de calculs géométriques, soit elles avaient une unité de T&L. Précisons cependant une exception notable : la Nintendo 64, qui avait un processeur de shader pour la géométrie. La Geforce 3 a remplacé l'unité de T&L par un processeur de ''vertex shader'' programmable. Il s'occupait donc des phases de transformation et d'éclairage, comme les circuits de T&L qu'ils remplaçaient. Les autres GPU de l'époque ont suivi le mouvement. Les processeurs de ''shaders'' étaient toujours accompagnés de l''''input assembler'' et de l'assembleur de primitive. {|class="wikitable" |- ! colspan="4" | Après la Geforce 3, avant DirectX 10 |- | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | class="f_rouge" | ''Primitive assembly'' |} S'en est suivi une longue période où le traitement de la géométrie se résumait aux ''vertex shaders''. Durant cette période, le pipeline graphique ne manipulait que des sommets, les triangles n'existaient qu'en sortie du pipeline géométrique. Mais DirectX 10 a changé la donne, avec l'introduction des ''geometry shader''. Nous détaillerons ces shaders dans le prochain chapitre. Tout ce que nous dirons est que ces shaders ne travaillent pas sur des sommets isolés, mais travaillent sur des primitives, des triangles. Ils peuvent ajouter, retirer ou modifier des triangles. Mais le résultat était assez désastreux. Les ''geometry shaders'' étaient trop limitées et les programmeurs avaient beaucoup de mal à les utiliser, ce qui fait que ces technologies ont été peu utilisées. {|class="wikitable" |- ! colspan="7" | DirectX 10 |- | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | colspan="4" | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |} Par la suite, des shaders dédiés aux techniques de tesselations ont été introduits. Nous verrons cela dans quelques chapitres, mais les techniques de tesselations visent à augmenter les détails géométriques d'un modèle 3D, en ajoutant des sommets à la volée. Des shaders dédiés ajoutent des sommets à un modèle, en suivant un certain algorithme. {|class="wikitable" |- ! colspan="7" | DirectX 11 |- | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Hull shader'' | class="f_rouge" | Tesselation | ''Domain shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |} L'arrivée des ''primitive shaders'' d'AMD et des ''mesh shaders'' de NVIDIA a modifié en profondeur le pipeline géométrique, qui est devenu plus simple, plus puissant et plus flexible. Ces shaders sont des ''geometry shaders'' améliorés, à savoir qu'ils peuvent travailler sur des primitives directement, voire sur des paquets de primitives. Concrètement, ils reçoivent des paquets de 32 sommets et exécutent des calculs dessus. Les calculs ne traitent pas chaque sommet isolément, ce qui permet de travailler sur des plusieurs triangles à la fois. Avec de tels shaders, les étapes d'assemblage de primitives et d'''input assembly'' sont inutiles, et ont disparues. Avec les ''primitive shaders'', l'implémentation exacte dépend de si la tesselation est activée ou non. Si la tesselation n'est pas activée, le ''vertex shader'' et le ''geométry shader'' sont fusionnés en un seul ''primitive shader''. {|class="wikitable" |+ Comparaison entre les pipelines géométriques de DirectX 11 et 12, sans tesselation |- ! DirectX 11 | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |- | colspan="4" | |- ! DirectX 12 | colspan="4" | ''Primitive shader'' (AMD) |} Avec la tesselation activée, les ''geometry shaders'' et les ''domain shaders'' en un seul ''shader''. De même, les ''vertex shaders'' et les ''hull shaders'' sont fusionnés en un seul ''shader'', nommé l{{'}}''amplification shader''. Ainsi, le pipeline graphique est grandement simplifié, avec seulement deux ''shaders'' et un étage fixe, au lieu de quatre ''shaders'' différents. {|class="wikitable" |+ Comparaison entre les pipelines géométriques de DirectX 11 et 12, avec tesselation |- ! DirectX 11 | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Hull shader'' | class="f_rouge" | Tesselation | ''Domain shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |- | colspan="7" | |- ! DirectX 12 | colspan="3" | * ''Amplification shader'' (AMD) | class="f_rouge" | Tesselation | colspan="3" | * ''Primitive shader'' (AMD) |} ==La tessellation== La '''tessellation''' est une technique qui permet d'ajouter des triangles à une surface à la volée. Les techniques de tesselation décomposent chaque triangle en sous-triangles plus petits, et modifient les coordonnées des sommets créés lors de ce processus. L'algorithme de découpage des triangles et la modification des coordonnées varie beaucoup selon la carte graphique ou le logiciel utilisé. Typiquement, les cartes graphiques actuelles ont un algorithme matériel pour le découpage des triangles qui est juste configurable, mais la modification des coordonnées des nouveaux sommets est programmable depuis DirectX 11. [[File:Tesselation pipeline.svg|centre|vignette|upright=2.0|Tessellation.]] Elle permet d'obtenir un bon niveau de détail géométrique, sans pour autant remplir la mémoire vidéo de sommets pré-calculés. Lire des sommets depuis la mémoire vidéo est une opération couteuse, même si les caches de sommets limitent la casse. La tesselation permet de lire un nombre limité de sommets depuis la mémoire vidéo, mais ajoute des sommets supplémentaires dans les unités de gestion de la géométrie. Les détails géométriques ajoutés par la tesselation demandent donc de la puissance de calcul, mais réduisent les accès mémoire. ===L'historique de la tesselation sur les cartes 3D=== Les premières tentatives utilisaient des algorithmes matériels de tesselation, et non des ''shaders''. Par exemple, la première carte graphique commerciale avec de la tesselation matérielle était la Radeon 8500, de l'entreprise ATI (aujourd'hui rachetée par AMD), avec la technologie de tesselation TrueForm. Elle utilisait un circuit non-programmable, qui tessellait certaines surfaces et interpolait la forme de la surface entre les sommets. ATI améliora ensuite le TrueForm pour que des informations de tesselation soient lues depuis une texture, ce qui permet une implémentation de la technologie dite du ''displacement mapping''. En même temps, Matrox ajouta un algorithme de tesselation basé sur la technique de N-patch dans ses cartes graphiques. Mais ces techniques se basaient sur des algorithmes matériels non-programmables, ce qui rendait ces technologies insuffisamment flexibles et impraticables. De plus, c'était des technologies propriétaires, que les autres fabricants de cartes graphiques n'ont pas adopté. Elles sont donc tombées en désuétude. La tesselation a eu un regain d'intérêt à l'arrivée des '''''geometry shaders''''' dans DirectX 10 et OpenGL 3.2. Et il y avait de quoi, de tels shaders pouvant en théorie implémenter une forme limitée de tesselation. Mais le cout en performance est trop important, sans compter que les limitations de ces shaders n'a pas permis leur usage pour de la tesselation généraliste. : Dans les tableaux qui vont suivre, les circuits non-programmables sont indiqués en rouge. {|class="wikitable" |- ! colspan="4" | DirectX 9 |- | class="f_rouge" | ''Input assembly'' | colspan="2" | ''Vertex shader'' | class="f_rouge" | ''Primitive assembly'' |- ! colspan="4" | DirectX 10 |- | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |} Une nouvelle étape a été franchie avec l'AMD Radeon HD2000 et le GPU de la Xbox 360, qui permettaient une tesselation partiellement programmable. La tesselation se faisait en deux étapes : une étape de découpage des triangles et une étape de modification des sommets créés. La première étape était un algorithme matériel configurable mais non-programmable, alors que la seconde était programmable. Mais le manque de support logiciel, le fait qu'on ne pouvait pas utiliser la tesselation en même temps que les ''geometry shader'', ainsi que la non-utilisation de cette technique par NVIDIA, a fait que cette technique n'a pas été reprise dans les GPU suivants. Il fallut attendre l'arrivée des '''tesselation shaders''' dans OpenGL 4.0 et DirectX 11 pour que des shaders adéquats arrivent sur le marché commercial. La tesselation sur ces cartes graphiques se fait en trois étapes : deux ''shaders'' et un algorithme matériel fixe entre les deux. Dans le détail, un ''hull shader'' est suivi par un étage fixe de tesselation, lui-même suivi par un ''domain shader''. L'étage fixe est là où se situe le découpage des triangles par l'unité matérielle configurable. La tesselation est suivie par la modification de la place des vertices créées, mais il y a aussi un shader avant la génération des nouveaux triangles. {|class="wikitable" |- ! colspan="7" | Avant DirectX 11 |- | class="f_rouge" | ''Input assembly'' | colspan="4" | ''Vertex shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |- ! colspan="7" | DirectX 11 |- | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Hull shader'' | class="f_rouge" | Tesselation | ''Domain shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |} Les ''geometry shaders'' et les ''tesselation shaders'' étaient très limités, ce qui fait qu'ils ont été peu utilisés. Les programmeurs avaient beaucoup de mal à les utiliser de manière performante, sans compter que ces ''shaders'' s'intégraient très mal au pipeline graphique existant. Les cartes graphiques avaient du mal à les intégrer au hardware, sauf à recourir à des méthodes quelque peu tordues, comme on le verra dans ce qui suit. Pour résumer, le pipeline géométrique des PC est donc assez différent de ce qu'on avait sur les ''mainframes''. Le pipeline géométrique a beaucoup évolué dans le temps. Les étapes d'''input assembler'' et d'assemblage des primitives sont restées des circuits fixes, pour quasiment disparaitre sur les GPU modernes. Par contre, les étapes de transformation et d'éclairage ont elles beaucoup évoluées. Elles sont passées de circuits fixes à des circuits programmables. Et de nombreuses étapes ont été rajoutées. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=La répartition du travail sur les unités de shaders | prevText=La répartition du travail sur les unités de shaders | next=Le pipeline géométrique d'un GPU | nextText=Le pipeline géométrique d'un GPU }}{{autocat}} </noinclude> rfpa8dr45pudava3tdhkh09lcyzj290 Les cartes graphiques/Les Render Output Target 0 67394 764891 763940 2026-04-24T17:58:22Z Mewtow 31375 /* Le traitement parallèle des fragments sur les GPU sort-last */ 764891 wikitext text/x-wiki Pour rappel, les étapes précédentes du pipeline graphiques manipulaient non pas des pixels, mais des fragments. Pour rappel, la distinction entre fragment et pixel est pertinente quand plusieurs objets sont l'un derrière l'autre. Si vous tracez une demi-droite dont l'origine est la caméra, et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points. La couleur finale dépend de la couleur de tous ces points d'intersection. Intuitivement, l'objet le plus proche est censé cacher les autres et c'est donc lui qui décide de la couleur du pixel, mais cela demande de déterminer quel est l'objet le plus proche. De plus, certains objets sont transparents et la couleur finale est un mélange de la couleur de plusieurs points d'intersection. Tout demande de calculer un pseudo-pixel pour chaque point d'intersection et de combiner leurs couleurs pour obtenir le résultat final. Les pseudo-pixels en question sont des '''fragments'''. Chaque fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont donc combinés pour obtenir la couleur finale de ce pixel. Pour résumer, la profondeur des fragments doit être gérée, de même que la transparence, etc. Et c'est justement le rôle de l'étage du pipeline que nous allons voir maintenant. Ces opérations sont réalisées dans un circuit qu'on nomme le '''Raster Operations Pipeline''' (ROP), aussi appelé ''Render Output Target'', situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo. ==Les fonctions des ROP== Les ROP incorporent plusieurs fonctionnalités qui sont assez diverses. Leur seul lien est qu'il est préférable de les implémenter en matériel plutôt qu'en logiciel, et en dehors des unités de textures. Il s'agit de fonctionnalités assez simples, basiques, mais nécessaires au fonctionnement de tout rendu 3D. Elles ont aussi pour particularité de beaucoup accéder à la mémoire vidéo. C'est la raison pour laquelle le ROP est situé en fin de pipeline, proche de la mémoire vidéo. Voyons quelles sont ces fonctionnalités. ===Le mélange ''alpha'' et le ''z-buffer''=== Sa fonction la plus importante est l'élimination des pixels cachés, grâce au tampon de profondeur. Pour chaque fragment, il lit le pixel correspondant dans le tampon de profondeur, fait la comparaison de profondeur, et met à jour le tampon de profondeur. Nous en avons déjà beaucoup parlé dans les chapitres précédents, notamment dans le chapitre sur les bases du rendu 3D et dans celui sur le rastériseur (avec l'élimination précoce des pixels cachés). Une autre fonction est le mélange ''alpha'', pour gérer la transparence, qu'on a là encore vu dans le chapitre sur les bases du rendu 3D. Là encore, les ROPs lisent, pour chaque fragment, le pixel correspondant dans le ''framebuffer'', font le mélange ''alpha'', et enregistrent le résultat dans le ''framebuffer''. Le mélange ''alpha'' est supporté sur tous les ROPs, depuis les premières cartes graphiques, et est encore supporté jusqu'à ce jour. Par contre, ce n'est pas le cas qui est du test ''alpha''. Ce dernier était pris en charge dans les ROPs jusqu'à DirectX 9, mais est maintenant émulé dans les ''pixel shaders'' depuis DirectX 10. Il en est de même pour les effets de brouillard. Ils impliquent à la fois du mélange ''alpha'' mais aussi la coordonnée de profondeur, ce qui en fait que leur implémentation dans les ROPs parait logique. Aussi, les premières cartes graphiques calculaient le brouillard dans les ROP, en fonction de la coordonnée de profondeur du fragment. De nos jours, il est calculé par les ''pixel shaders'' et les ROP n'incorporent plus de technique de brouillard spécialisée. Les ROPs ont d'autres fonctions, plus méconnues, qu'on n'a pas abordé dans les chapitres précédents. ===Le tampon de ''stencil''=== Le '''''stencil''''' est une fonctionnalité des API graphiques qui existe depuis très longtemps. Il sert pour générer des effets graphiques très variés, qu'il serait vain de lister ici. Il a notamment été utilisé pour calculer des ombres volumétriques (le moteur de DOOM 3 en faisait grand usage à la base), des réflexions simples, des ''shadowmaps'', et bien d'autres. Pour le résumer, on peut le voir comme une sorte de tampon de profondeur où la coordonnée z est remplacée par u octet dont le programmeur peut faire ce qu'il veut. L'idée est que chaque pixel/fragment se voit attribuer une valeur entière, généralement codée sur un octet, que les programmeurs peuvent faire varier à loisir. L'octet ajouté est appelé l''''octet de ''stencil'''''. Il a une certaine valeur, qui est calculée par la carte graphique, généralement par les ''shaders''. Il ne remplace pas la coordonnée de profondeur, mais s'ajoute à celle-ci. Les octets de ''stencil'' sont placés dans le tampon de profondeur. L'ensemble forme un tableau qui associe 32 bits à chaque" pixel : 24 bits pour une coordonnée z, 8 pour l'octet de ''stencil''. Lors du passage d'un fragment les ROPs, la carte graphique lit le pixel correspondant, dans le tampon de profondeur. Il récupère la coordonnée z, mais aussi l'octet de ''stencil''. Puis il compare l'octet de ''stencil'' avec celui du fragment traité. Si le test échoue, le fragment ne passe pas à l'étape de test de profondeur et est abandonné. S'il passe, le tampon de ''stencil'' est mis à jour. Par mis à jour, on veut dire que le ROP peut faire diverses manipulations dessus : l'incrémenter, le décrémenter, le mettre à 0, inverser ses bits, remplacer par l'octet de ''stencil'' du fragment, etc. Les opérations possibles sont bien plus nombreuses qu'avec le tampon de profondeur, qui se contente de remplacer la coordonnée z par celle du fragment. ===Les fonctions héritées des ''blitters'' 2D=== Les ROPS implémentent aussi des techniques utilisées sur les ''blitters'' des anciennes cartes d'affichage 2D, comme l'application d''''opérations logiques''' sur chaque pixel enregistré dans le ''framebuffer''. Les opérations logiques en question peuvent prendre une à deux opérandes. Les opérandes sont soit un pixel lu dans le ''framebuffer'', soit un fragment envoyé au ROP. Les opérations logiques à un opérande peuvent inverser, mettre à 0 ou à 1 le pixel dans le ''framebuffer'', ou faire la même chose sur le fragment envoyé en opérande. Les opérations à deux opérandes lisent un pixel dans le framebuffer, et font un ET/OU/XOR avec le fragment opérande (un opérande peut être inversé). Elles sont utilisées pour faire du traitement d'image ou du rendu 2D, rarement pour du rendu 3D. Les ROPs gèrent aussi des '''masques d'écritures''', qui permettent de décider si un pixel doit être écrit ou non en mémoire. Il est possible d'inhiber certaines écritures dans le ''framebuffer'', le tampon de profondeur ou le tampon de stencil. Inhiber la mise à jour d'un pixel dans le tampon de profondeur est utile pour gérer la transparence. Si un pixel est transparent, même partiellement, il ne faut pas mettre à jour le tampon de profondeur, et cela peut être géré par ce système de masquage. Les masquages des couleurs permettent de ne modifier qu'une seule composante R/G/B au lieu de modifier les trois en même temps, pour faire certains effets visuels. ==L'architecture matérielle d'un ROP== Les ROP contiennent des circuits pour gérer la profondeur des fragments. Ils effectuent un test de profondeur, à savoir que les fragments correspondant à un même pixel sont comparés pour savoir lequel est devant l'autre. Ils contiennent aussi des circuits pour gérer la transparence des fragments. Le ROP gère aussi l'antialiasing, de concert avec l'unité de rastérisation. D'autres fonctionnalités annexes sont parfois implémentées dans les ROP. Par exemple, les vielles cartes graphiques implémentaient les effets de brouillards dans les ROPs. Le tout est suivi d'une unité qui enregistre le résultat final en mémoire, où masques et opérations logiques sont appliqués. Les différentes opérations du ROP doivent se faire dans un certain ordre. Par exemple, gérer la transparence demande que les calculs de profondeur se fassent globalement après ou pendant le mélange ''alpha''. Ou encore, les masques et opérations logiques se font à la toute fin du rendu. L'ordre des opérations est censé être le suivant : test ''alpha'', test du ''stencil'', test de profondeur, mélange ''alpha''. Du moins, la carte graphique doit donner l'impression que c'est le cas. Elle peut optimiser le tout en traitant le tampon de profondeur, de couleur et de ''stencil'' en même temps, mais donner les résultats adéquats. Un ROP est typiquement organisé comme illustré ci-dessous. Notons que les circuits de gestion de la profondeur et de la transparence sont séparés dans les schémas, mais il s'agit là d'une commodité qui ne reflète pas forcément l'implémentation matérielle. Et si ces deux circuits sont séparés, ils communiquent entre eux, notamment pour gérer la profondeur des fragments transparents. [[File:Render Output Pipeline-processor.png|centre|vignette|upright=2|Render Output Pipeline-processor]] Les ROPs récupèrent les fragments calculés par les pixels shaders et/ou les unités de texture, via un circuit d'interconnexion spécialisé. Chaque ROP est connecté à toutes les unités de ''shader'', même si la connexion n'est pas forcément directe. Toute unité de ''shader'' peut envoyer des pixels à n'importe quel ROP. Les circuits d'interconnexion sont généralement des réseaux d'interconnexion de type ''crossbar'', comme illustré ci-contre (le premier rectangle rouge). Le ROP effectue beaucoup de lectures et écritures en mémoire vidéo. Or, la bande passante mémoire est limitée, ce qui fait que le ROP est un goulot d'étranglement assez important pour le rendu 3D. Heureusement, de nombreuses optimisations permettent d'optimiser le tout. Elles agissent sur la lecture du tampon de profondeur, mais aussi sur le ''framebuffer''. ===Le ''fast clear'' du ''framebuffer''=== Une première optimisation porte sur le ''framebuffer''. Le ''framebuffer''est souvent réutilisé d'une image sur l'autre. Quand une image a été envoyée à l'écran, le ''framebuffer'' est remis à zéro pour accueillir une nouvelle image. Et ce avec ou sans ''double buffering''. La mise à zéro est censée se faire en remettant réellement le ''framebuffer'' à zéro, en écrivant des 0 pour chaque pixel du ''framebuffer''. Mais il y a moyen de s'en passer. Pour cela, l'idée est que le ''framebuffer'' est découpé en ''tiles'', des carrés de 4, 8, 16 pixels de côté. Les ''tiles'' ont généralement la même taille que les ''tiles'' utilisées pour la rastérisation, mais passons sur ce détail. L'idée est de mémoriser, pour chaque ''tile'', si elle est mise à 0 ou non. Il suffit de cela d'un seul bit par ''tile'', appelé le bit RESET. L'ensemble des bits RESET est mémorisé dans une petite mémoire SRAM, intégrée aux ROPs. Lorsqu'on souhaite remettre à zéro le ''framebuffer'', il suffit de mettre à 0 tous les bits RESET dans cette SRAM, pas besoin d’accéder à la mémoire vidéo. Avant toute lecture dans le ''framebuffer'', le ROP lit cette SRAM pour vérifier si la ''tile'' en question a été remise à 0. Si ce n'est pas le cas, il lit le pixel voulu depuis le ''framebuffer''. Mais si c'est le cas, alors le ROP ne fait pas la lecture et fournit un pixel à zéro à la place, qui est utilisé pour le mélange ''alpha'' ou autre. La moindre écriture dans une ''tile'' met le bit RESET à 0 : la ''tile'' entière est considérée comme non-remise à zéro, même si un seul pixel a été modifié dedans. Notons que l'usage d'une granularité par ''tile'' est un compromis. On peut ne peut pas utiliser un bit par pixel, car cela demanderait d'utiliser une SRAM énorme. De même, utiliser un seul bit pour tout le ''framebuffer'' ruinerait totalement l'optimisation : le ''framebuffer'' entier serait considéré comme non-RESET dès la première écriture d'un pixel dedans, on ne sauverait qu'un nombre trop limité d'accès mémoire. ===La z-compression=== La technique de '''z-compression''' compresse le tampon de profondeur. Plus précisément, elle découpe le tampon de profondeur en ''tiles'', en blocs carrés, qui sont compressés séparément les uns des autres. La taille des ''tiles'' est souvent la même que celle utilisée par le rastériseur pour la rastérisation grossière. Par exemple, la ''z-compression'' des cartes graphiques ATI radeon 9800, découpait le tampon de profondeur en ''tiles'' de 8 * 8 fragments, et les encodait avec un algorithme nommé DDPCM (''Differential differential pulse code modulation''). Précisons que cette compression ne change pas la taille occupée par le tampon de profondeur, mais seulement la quantité de données lue/écrite. La raison est que les ''tiles'' doivent avoir une place fixe en mémoire. Par exemple, si une ''tile'' non-compressée prend 64 octets, on trouvera une ''tile'' tous les 64 octets en mémoire vidéo, afin de simplifier les calculs d'adresse, afin que le ROP sache facilement où se trouve la ''tile'' à lire/écrire. Avec une vraie compression, les ''tiles'' se trouveraient à des endroits très variables d'une image à l'autre. Par contre, la z-compression réduit la quantité de données écrite dans le tampon de profondeur. Par exemple, au lieu d'écrire une ''tile'' non-compressée de 64 octets, on écrira une ''tile'' de seulement 6 octets, les 58 octets restants étant pas lus ou écrits. On obtient un gain en performance, pas en mémoire. [[File:AMD HyperZ.svg|centre|vignette|upright=2|AMD HyperZ]] Le format de compression ajoute un bit par ''tile'', qui indique si elle est compressée ou non. Le bit qui indique si la ''tile'' est compressée permet de laisser certaines ''tiles'' non-compressés, dans le cas où la compression ne permet pas de gagner de la place. La compression ajoute souvent un second bit, qui indique si la ''tile'' est à zéro ou non, sur le même modèle que pour le ''framebuffer''. Il accélère la remise à zéro du tampon de profondeur. Au lieu de réellement remettre tout le tampon de profondeur à 0, il suffit de réécrire un bit par ''tile''. Le gain en nombre d'accès mémoire peut se révéler assez impressionnant. Les deux bits en question peuvent être placés à deux endroits différents. La première solution serait d'utiliser une portion de la mémoire vidéo, mais cela demanderait de faire deux lectures par accès au tampon de profondeur. La vraie solution est d'utiliser une SRAM reliée aux ROPs, qui est assez grande pour mémoriser tout le tampon de profondeur, du moins avec deux bits par ''tile''. ===Le cache de profondeur=== Une optimisation complémentaire ajoute une ou plusieurs mémoires caches dans le ROP, dans le circuit de profondeur. Ce '''cache de profondeur''' stocke des portions du tampon de profondeur qui ont été lues ou écrite récemment. Comme cela, pas besoin de les recharger plusieurs fois : on charge un bloc une fois pour toutes, et on le conserve pour gérer les fragments qui suivent. Sur certaines cartes graphiques, les données dans le cache de profondeur sont stockées sous forme compressées dans le cache de profondeur, là encore pour augmenter la taille effective du cache. D'autres cartes graphiques ont un cache qui stocke des données décompressées dans le cache de profondeur. Tout est question de compromis entre accès rapide au cache et augmentation de la taille du cache. Il faut savoir que les autres unités de la carte graphique peuvent lire le tampon de profondeur, en théorie. Cela peut servir pour certaines techniques de rendu, comme pour le ''shadowmapping''. De ce fait, il arrive que le cache de profondeur contienne des données qui sont copiées dans d'autres caches, comme les caches des processeurs de shaders. Le cache de profondeur n'est pas gardé cohérent avec les autres caches du GPU, ce qui signifie que les écritures dans le cache de profondeur ne sont pas propagées dans les autres caches du GPU. Si on modifie des données dans ce cache, les autres caches qui ont une copie de ces données auront une version périmée de la donnée. C'est souvent un problème, sauf dans le cas du cache de profondeur, pour lequel ce n'est pas nécessaire. Cela évite d'implémenter des techniques de cohérence des caches couteuses en circuits et en performance, alors qu'elles n'auraient pas d'intérêt dans ce cas précis. ===Le ''z-fast pass''=== Le ''z-fast pass'' améliore la performance des '''prépasses z''', une technique utilisée par de nombreux moteurs de jeux vidéo. L'idée est que le moteur de jeu effectue plusieurs passes, chacune faisant un truc précis, la prépasse z étant l'une de ces passes. Lors d'une prépasse z, le moteur de jeu calcule la scène 3D, rastérise l'image, et remplit le tampon de profondeur uniquement. Il ne place pas de textures, ne calcule pas de pixels shaders, il se préoccupe uniquement des coordonnées de profondeur des pixels. Au final, le rendu ne donne que le tampon de profondeur, qui est utilisé par les passes suivantes. L'utilité est très variable, mais il y a deux raisons pour effectuer une prépasse z : la performance, mais aussi certains effets graphiques. Par exemple, les effets d'occlusion ambiante "''screen space''" utilisent le tampon de profondeur pour faire leur travail. Il en est de même pour les ''shadowmaps'', qui effectuent une prépasse z par ombre à afficher. Une autre utilisation est que cela permet d'utiliser élimination des pixels cachés très performante. On effectue une prépasse z pour calculer le tampon de profondeur final, qui est ensuite utilisé par les passes suivantes pour éliminer les pixels cachés. Ainsi, les pixels cachés ne sont pas texturés et pixel shadés, avec certitude. Toujours est-il qu'une prépasse z utilise les ROP "à moitié", dans le sens où seul le tampon de profondeur est utilisé, par la gestion des couleurs. Mais il se trouve que les circuits qui servent pour le mélange ''alpha'' peuvent être réutilisés pour faire les comparaisons de profondeur ! Le résultat est que les ROP peuvent fonctionner à double vitesse lors d'une prépasse z ! Cela demande cependant de concevoir les circuits du ROP pour en profiter. L'optimisation est parfois appelée le '''''z-fast pass'''''. Tous les GPU depuis la Geforce FX en sont capables. Il y a cependant quelques contraintes. Premièrement, le ROP doit être configuré de manière à n’accéder qu'au tampon de profondeur, ils ne doivent pas dessiner dans le ''framebuffer''. Le mélange '''alpha'' doit être désactivé, de même que l'alpha-test. D'autres contraintes supplémentaires sont parfois présentes, surtout sur les vieux GPUs. Par exemple, l'antialiasing doit être désactivé lors de la prépasse z. Et mine de rien, cela ne marche que pour les prépasses z pures. Par exemple, certaines techniques de rendu différé augmentent la prépasse z pour que celle-ci ne calcule pas que le tampon de profondeur, mais aussi d'autres informations comme les normales : elles ne profitent pas de cette optimisation. ==Pourquoi ne pas émuler les ROPs dans les ''pixel shader'' ?== Les ROPs effectuent plusieurs opérations basiques, mais les deux plus importantes sont la gestion du tampon de profondeur et de la transparence. Par transparence, on veut parler du mélange ''alpha''. Pour la gestion du tampon de profondeur, on veut parler du ''z-test'', qui compare la profondeur de deux pixels/fragments. Il s'agit d'opérations simples, qu'un processeur de shader peut faire sans problèmes. Par exemple, le ''z-test'' demande de faire plusieurs étapes : * calculer l'adresse du pixel dans le tampon de profondeur ; * lire le pixel dans le tampon de profondeur ; * Faire la comparaison entre profondeurs ; * Si le résultat de la comparaison est okay : ** écrire la nouvelle valeur z dans le tampon de profondeur, et écrire le nouveau pixel dedans. Le mélange ''alpha'' demande lui de : * calculer l'adresse du pixel dans le ''framebuffer'' ; * lire le pixel dans le ''framebuffer'' ; * faire des additions et multiplications pour le mélange ''alpha'' : * écrire le nouveau pixel dans le ''framebuffer''. Pour résumer il faut pouvoir faire : calcul d'adresse, lecture, écriture, addition, multiplication et comparaisons. Et toutes ces opérations sont supportées nativement par les processeurs de shaders, ce sont des instructions communes. Il est donc possible d'émuler les ROPs dans les pixels shaders. En pratique, c'est assez rare, et il y a une bonne explication à cela. ===Les GPU de type ''sort-last'' doivent "trier les pixels"=== Émuler les ROPs dans un ''pixel shader'' est trivial, comme on vient de le voir. Sauf que cela ne marche que si le GPU fait le rendu un pixel à la fois. Le tampon de profondeur est conçu pour traiter un pixel à la fois, idem pour le mélange ''alpha''. Mais si on ne traite pas l'image pixel par pixel, alors les deux algorithmes dysfonctionnent. Donc, tout va bien s'il n'y a qu'un seul processeur de ''pixel shader'', et que celui-ci est conçu pour ne traiter qu'un pixel à la fois, qu'une seule instance de ''shader''. Mais cela ne marche pas sur les GPU modernes, qui ont non seulement près d'une centaine de processeurs de shaders, chacun étant conçu pour traiter une centaine de fragments/pixels en même temps ! Pour donner un exemple, imaginons la situation illustrée ci-dessous. Supposons que l'on ait assez de processeurs de shaders pour traiter plusieurs triangles en même temps. Par malchance, les processeurs rendent en même temps deux triangles opaques qui se recouvrent à l'écran. Là où ils se recouvrent, les deux triangles vont générer deux fragments par pixel, et un seul sera le bon. Pas de chance, les deux fragments sont rendus en parallèle dans deux processeurs séparés. Les deux processeurs lisent la même donnée dans le tampon de profondeur et les deux fragments passent le ''z-test'', car ils n'ont aucun moyen de savoir la coordonnée z en cours de traitement dans l'autre processeur. Les deux processeurs vont alors écrire leur résultat en mémoire et c'est premier arrivé, premier servi. Le résultat n'est pas forcément celui attendu : le pixel le plus proche peut être écrit avant le plus lointain, ou inversement. [[File:Situation où faire le z-test dans les pixel shaders dysfonctionne.png|centre|vignette|upright=2|Situation où faire le z-test dans les pixel shaders dysfonctionne]] Pour obtenir un bon rendu, le GPU doit forcer le z-test à se faire fragment par fragment, du moins quand on regarde un pixel individuel. Il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. En utilisant des processeurs de shaders qui travaillent en parallèle, cette contrainte est parfois brisée et le rendu donne des résultats incorrects. Le tampon de profondeur n'est pas conçu pour être parallélisé, idem pour le mélange ''alpha''. Il faut donc une sorte de point de synchronisation dans le pipeline pour éviter tout problème. Et c'est à ça que servent les ROPs. Une explication alternative est la suivante. Les fragments doivent être rendus dans l'ordre de soumission. C'est à dire que des pixels qui sortent du rastériseur dans un certain ordre doivent être enregistré en mémoire dans ce même ordre. Et les pixels ne quittent pas le rastériseur dans le désordre non plus : des triangles arrivant au rastériseur dans un certain ordre seront traité dans ce même ordre. Le problème est que les GPU étant massivement parallèle, les triangles et pixels seront traités dans le désordre, avant que leurs résultats soient remis en ordre. Pour les triangles/sommets, la remise en ordre se fait au niveau de l'assemblage de primitives, juste avant le rastériseur. Pour les fragments, la remise en ordre se fait dans les ROPs, en sortie des ''shaders'', à la fin du pipeline. Du moins, sur les GPU de type ''sort-last''. Les ROPs ne font donc pas que faire le ''z-test'' et le mélange ''alpha'', ils ont des circuits de remise en ordre pour ça, qui sont de plus fortement mélés au tampon de profondeur et au ''framebuffer''. ===Le traitement parallèle des fragments sur les GPU ''sort-last''=== Plus haut, j'ai dit qu'il doit être impossible de traiter en même temps deux fragments d'un même pixel. Mais il reste possible de traiter des pixels différents en parallèle, mais pas deux fragments d'un même pixel. Reste à faire en sorte de ne pas envoyer deux fragments d'un même pixel dans les processeurs de shaders. Une solution pour cela serait de mémoriser, pour chaque pixel, si un ''pixel shader'' est en train de le traiter. Il suffit de mémoriser un bit par pixel pour cela, dans une table d'utilisation, concrètement une petite mémoire. Elle serait mise à jour par les processeurs de shaders, et consultée par le rastériseur. Quand le rastériseur génère un fragment, il consulte cette table, pour vérifier s'il y a conflit avec les fragments en cours de traitement. Il attend si c'est le cas, le pixel shader finira par finir de traiter le pixel au bout d'un moment. Mais l'inconvénient de cette solution est qu'elle a besoin d'une mémoire partagée par tous les processeurs de shaders, qui est difficile à concevoir sans faire des concessions en termes de performances. Une autre solution serait de mémoriser tous les pixels en cours de traitement. Quand le rastériseur génère un fragment, il mémorise les coordonnées x,y de ce fragment à l'écran, dans une '''table des pixels occupés'''. Dès qu'un pixel shader se termine, la table des pixels occupés est mise à jour. Le rastériseur consulte cette table quand il génère un fragment, afin de détecter les conflits. S'il y a conflit, le rastériseur attend que le fragment conflictuel, en cours de traitement dans le pixel shader, soit traité. L’inconvénient de la solution précédente est que la table des pixels occupés est techniquement une mémoire associative, une sorte de mémoire cache, qui est plus complexe qu'une simple RAM. Il est très difficile de créer une mémoire de ce genre qui soit capable de mémoriser plusieurs dizaines ou centaine de milliers de pixels, pour gérer une centaine de processeurs de shaders. Par contre, elle fonctionne pas trop mal pour un petit nombre de processeurs de shaders, qui fonctionnent à basse fréquence. Cela explique que les GPU pour PC ont des ROPs séparés des processeurs de ''shaders'' : ces GPU ont beaucoup trop de processeurs de shaders. Par contre, quelques cartes graphiques destinées les smartphones et autres appareils mobiles émulent les ROPs dans les ''pixel shaders''. Mais il y a une bonne raison à cela : non seulement, ils n'ont que très peu de processeurs de shader, mais ce sont aussi des GPU en rendu à tuiles. L'avantage est qu'ils rendent une tile à la fois, ce qui fait qu'il y a besoin de tester les conflits entre fragments à l'intérieur d'une tile, pas pour l'écran complet. Et cela simplifie grandement les circuits de test, notamment la table des pixels occupés, qui est bien plus petite. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les unités de texture | prevText=Les unités de texture | next=Les écritures en VRAM hors ROPs | nextText=Les écritures en VRAM hors ROPs }}{{autocat}} </noinclude> fb6dc0kmr0z7opyhw88v5hcoy8zqt40 Les cartes graphiques/Les unités de texture 0 67395 764890 763954 2026-04-24T17:58:07Z Mewtow 31375 /* L'implémentation : logicielle versus matérielle */ 764890 wikitext text/x-wiki [[File:Texture mapping.png|vignette|''Texture mapping'']] Les '''textures''' sont des images que l'on va plaquer sur la surface d'un objet, du papier peint en quelque sorte. Les cartes graphiques supportent divers formats de textures, qui indiquent comment les pixels de l'image sont stockés en mémoire : RGB, RGBA, niveaux de gris, etc. Une texture est donc composée de "pixels", comme toute image numérique. Pour bien faire la différence entre les pixels d'une texture, et les pixels de l'écran, les pixels d'une texture sont couramment appelés des ''texels''. ==Le placage de textures inverse== Pour rappel, plaquer une texture sur un objet consiste à attribuer un texel à chaque sommet, ce qui est fait lorsque les créateurs de jeu vidéo conçoivent le modèle de l'objet. Chaque sommet est associé à des '''coordonnées de texture''', qui précisent quelle texture appliquer, mais aussi où se situe le texel à appliquer dans la texture. Par exemple, la coordonnée de texture peut dire : je veux le pixel qui est à ligne 5, colonne 27 dans cette texture. Dans les faits, on n'utilise pas de coordonnées entières de ce type. Les coordonnées de texture sont deux nombres flottants compris entre 0 et 1. La coordonnée 0,0 correspond au texel en bas à gauche, celui de coordonnée 1,1 est tout en haut à droite. Les deux coordonnées de texture sont notées u,v avec DirectX, ou encore s,t dans le cas général : u est la coordonnée horizontale, v la verticale. Le nom donnée à cette technique de description des coordonnées de texture s'appelle l''''''UV Mapping'''''. [[File:UVMapping.png|centre|vignette|upright=2|UV Mapping]] Les API 3D modernes gèrent des textures en trois dimensions, ce qui ajoute une troisième coordonnée de texture notée w. Dans ce qui va suivre, nous allons passer les textures en trois dimensions sous silence. Elles ne sont pas très utilisées, la quasi-totalité des jeux vidéo et applications 3D utilisant des textures en deux dimensions. Par contre, le matériel doit gérer les textures 3D, ce qui le rend plus complexe que prévu. Il faut ajouter quelques circuits pour, de quoi gérer la troisième coordonnée de texture, etc. Lors de la rastérisation, chaque fragment se voit attribuer un sommet, et donc la coordonnée de texture qui va avec. Si un pixel est situé pile sur un sommet, la coordonnée de texture de ce sommet est attribuée au pixel. Si ce n'est pas le cas, la coordonnée de texture finale est interpolée à partir des coordonnées des trois sommets du triangle rastérisé. L'interpolation en question a lieu dans l'étape de rastérisation, comme nous l'avons vu dans le chapitre précédent. Le fait qu'il y ait une interpolation fait que les coordonnées du pixel gagent à être des nombres flottants. On pourrait faire une interpolation avec des coordonnées de texture entières, mais les arrondis et autres imprécisions de calcul donneraient un résultat graphiquement pas terrible, et empêcheraient d'utiliser les techniques de filtrage de texture que nous verrons dans ce chapitre. À partir de ces coordonnées de texture, la carte graphique calcule l'adresse du texel qui correspond, et se charge de le lire. Et toute la magie a lieu dans ce calcul d'adresse, qui part de coordonnées de texture flottante, pour arriver à une adresse mémoire. Le calcul de l'adresse du texel se fait en plusieurs étapes, que nous allons voir ci-dessous. La première étape convertit les coordonnées flottantes en coordonnées entières, qui disent à quel ligne et colonne se trouve le texel voulu dans la texture. L'étape suivante transforme ces coordonnées x,y entières en adresse mémoire. ===La normalisation des coordonnées=== J'ai dit plus haut que les coordonnées de texture sont des coordonnées flottantes, comprises entre 0 et 1. Mais il faut savoir que les pixels shaders peuvent modifier celles-ci pour mettre en œuvre certains effets graphiques. Et le résultat peut alors se retrouver en-dehors de l'intervalle 0,1. C'est quelque chose de voulu et qui est traité par la carte graphique automatiquement, sans que ce soit une erreur. Au contraire, la manière dont la carte graphique traite cette situation permet d'implémenter des effets graphiques comme des textures en damier ou en miroir. [[File:Clamp tile.jpg|vignette|Clamp tile]] Il existe globalement trois méthodes très simples pour gérer cette situation, qui sont appelés des '''modes d'adressage de texture'''. La première méthode est de faire en sorte que le résultat sature. Si une coordonnée est inférieur à 0, alors on la remplace par un zéro. Si elle est supérieure à 1, on la ramène à 1. Avec cette méthode, tout se passe comme si les bords de la texture étaient étendus et remplissaient tout l'espace autour de la texture. Le tout est illustré ci-dessous. Ce mode d'accès aux textures est appelé le '''''clamp'''''. Une autre solution retire la partie entière de la coordonnée, elle coupe tout ce qui dépasse 1. Pour le dire autrement, elle calcule le résultat modulo 1 de la coordonnée. Le résultat est que tout se passe comme si la texture était répétée à l'infini et qu'elle pavait le plan. Une autre méthode remplit les coordonnées qui sortent de l’intervalle 0,1 avec une couleur préétablie, configurée par le programmeur. ===La conversion des coordonnées de textures flottantes en adresse mémoire=== Une fois la normalisation effectuée, les coordonnées de texture sont utilisées pour lire le texel voulu. Pour cela, les coordonnées de texte sont transformées en adresse mémoire, adresse qui pointe sur le texel ayant ces cordonnées. Pour cela, la première étape est de transformer les coordonnées flottantes u,v en coordonnées entières x,y qui pointent sur un texel. Pour cela, il suffit de multiplier les coordonnées flottantes u,v par la résolution de la texture accédée. Pour un écran de résolution <math>\text{height,width}</math>, le calcul est le suivant : : <math>x = u \times \text{width}</math> : <math>y = v \times \text{height}</math> Le résultat est un nombre avec une partie entière et une partie fractionnaire. La partie entière des deux coordonnées donne la position x,y voulue, et la partie fractionnaire est conservée pour le filtrage de textures, mais passons cela sous silence pour le moment. La seconde étape prend les coordonnées entières x,y et calcule l'adresse mémoire du texel. L'adresse dépend de la position de la texture en mémoire, précisément de son début, son premier texel, mais aussi de la position du texel par rapport au début de la texture. Et calculer cette position intra-texture dépend de la manière dont les texels sont stockés en mémoire. ====Les textures naïves==== Les programmeurs qui lisent ce cours s'attendent certainement à ce que la texture soit stockée en mémoire ligne par ligne, ou colonne par colonne. Cela veut dire que le premier pixel en partant d'en haut à gauche est stocké en premier, puis celui immédiatement à sa droite, puis celui encore à droite, et ainsi de suite. Une fois qu'on arrive à la fin d'une ligne, on passe à la ligne suivante, en-dessous. Cette organisation ligne par ligne s'appele l'organisation '''''row major order'''''. On peut faire pareil, mais colonne par colonne, ce qui donne le '''''column major order'''''. [[File:Speicheranordnung Feld.svg|centre|vignette|upright=2|Row et column major order.]] Maintenant, supposons que la texture commence à l'adresse <math>A_\text{texture}</math>, qui est l'adresse du premier texel. La texture a une résolution de <math>\text{width}</math> texels de large et <math>\text{height}</math> texels de haut. Par définition, les coordonnées X et Y des texels commencent à 0, ce qui fait que le pixel en haut à gauche a les coordonnées 0,0. L'adresse du pixel se calcule comme suit : : <math>A_\text{pixel} = A_\text{texture} + (\text{taille d'une ligne en octets} \times Y) + (\text{taille d'un texel en octets} \times X)</math> La taille d'un pixel en mémoire est notée T. La taille d'une ligne en mémoire est de <math>width \times T</math>, par définition, vu qu'elle fait <math>width</math> texels. On a donc : : <math>A_\text{pixel} = A_\text{texture} + (width \times T \times Y) + (T \times X)</math> La formule se réécrit comme suit : : <math>A_\text{pixel} = A_\text{texture} + T \times (width \times Y + X)</math> Le calcul d'adresse est donc assez simple. Malheureusement, les textures ne sont pas stockées de cette manière en mémoire vidéo. En effet, elle se marie mal avec les opérations de filtrage de texture que nous allons voir dans ce qui suit. Le filtrage d'un texel dépend de ses voisins du dessus et du dessous. Le fait que la texture n'est pas forcément parcourue ligne par ligne fait que stocker une texture ligne par ligne n'est pas l'idéal. De même, les textures sont déformées par la perspective. L'affichage de la texture ne se fait alors pas ligne par ligne, mais en parcourant la texture en diagonale, l'angle de la diagonale correspondant approximativement à l'angle que fait la verticale de la texture avec le regard. Vu qu'on ne connait pas à l'avance l'angle que fera la diagonale de parcours, on doit ruser. ====Les textures tilées==== Une première solution à ce problème est celle des '''textures tilées'''. Avec ces textures, l'image de la texture est découpée en ''tiles'', des rectangles ou en carrés de taille fixe, généralement des carrés de 4 pixels de côté. Les tiles ont une largeur et une longueur égales, afin de simplifier les calculs : on divise X et Y par le même nombre. De plus, leur largeur et leur longueur sont une puissance de deux, afin de simplifier les calculs d'adresse. Les ''tiles'' sont alors mémorisée les unes après les autres dans le fichier de la texture. [[File:Texture tilée.png|centre|vignette|upright=2|Texture tilée]] La formule de calcul d'adresse vue plus haut doit être adaptée pour tenir compte des tiles. Pour cela, il faut remplacer la taille d'un texel par la taille d'une tile, et que la largeur de la texture soit exprimée en nombre de tiles. De plus, on doit adapter les coordonnées des texels pour donner des coordonnées de tile. Généralement, les tiles sont des carrés de N pixels de côté, ce qui fait qu'on peut regrouper les lignes et les colonnes par paquets de N. Il suffit donc de diviser Y et X pour obtenir les coordonnées de la tile, de même que la larguer. La formule pour calculer la position de la énième tile est alors la suivante : : <math>\text{adresse d'une tile} = \text{adresse du début de la texture} + \text{Taille mémoire d'une tile} \times \left( {\text{Width} \over N} \times {Y \over N} + {X \over N} \right)</math> On peut réécrire le tout comme suit : : <math>\text{adresse d'une tile} = \text{adresse du début de la texture} + K \times \left( {Y \over N} + X \right)</math>, avec K une constante connue à la compilation des shaders. Vu que les tiles sont carrées avec une largeur qui est une puissance de deux, la multiplication par la taille d'une tile en mémoire se simplifie : on passe d'une multiplication entière à des décalages de bits. Même chose pour le calcul de l'adresse de la tile à partir des coordonnées x,y : ils impliquent des divisions par une puissance de deux, qui deviennent de simples décalages. La position d'un pixel dans une tile dépend du format de la texture, mais peut se calculer avec quelques calculs arithmétiques simples. Dans les cas les plus simples, les pixels sont mémorisés ligne par ligne, ou colonne par colonne. Mais ce n'est pas systématiquement le cas. Toujours est-il que les calculs pour déterminer l'adresse sont simples, et ne demandent que quelques additions ou multiplications. Mais avec les formats de texture utilisés actuellement, les tiles sont chargées en entier dans le cache de texture, sans compter que diverses techniques de compression viennent mettre le bazar, comme on le verra dans la suite de cours. Un avantage de l'organisation en tiles est qu'elle se marie bien avec le parcours des textures. On peut parcourir une texture dans tous les sens, horizontal, vertical, ou diagonal, on sait que les prochains pixels ont de fortes chances d'être dans la même tile. Si on rentre dans une tile par la gauche en haut, on a encore quelques pixels à parcourir dans la tile, par exemple. De même, le filtrage de textures est facilité. On verra dans ce qui va suivre que le filtrage de texture a besoin de lire des blocs de 4 texels, des carrés de 2 pixels de côté. Avec l'organisation en tile, on est certain que les 4 texels seront dans la même tile, sauf s'ils ont le malheur d'être tout au bord d'une tile. Ce dernier cas est assez rare, et il l'est d'autant plus que les tiles sont grandes. Enfin, un dernier avantage est que les tiles sont généralement assez petites pour tenir tout entier dans une ligne de cache. Le cache de texture est donc utilisé à merveille, ce qui rend les accès aux textures plus rapides. ====Les textures basées sur des ''z-order curves''==== Les formats de textures théoriquement optimaux utilisent une '''''Z-order curve''''', illustrée ci-dessous. L'idée est de découper la texture en quatre rectangles identiques, et de stocker ceux-ci les uns à la suite des autres. L'intérieur de ces rectangles est lui aussi découpé en quatre rectangles, et ainsi de suite. Au final, l'ordre des pixels en mémoire est celui illustré ci-dessous. [[File:Z-CURVE.svg|centre|vignette|upright=2|Construction d'une ''Z-order curve''.]] Les texels sont stockés les uns à la suite des autres dans la mémoire, en suivant l'ordre donnée par la ''Z-order curve''. Le calcul d'adresse calcule la position du texel en mémoire, par rapport au début de la texture, et ajoute l'adresse du début de la texture. Mais tout le défi est de calculer la position d'un texel en mémoire, à partir des coordonnées x,y. Le calcul peut sembler très compliqué, mais il n'en est rien. Le calcul demande juste de regarder les bits des deux coordonnées et de les combiner d'une manière particulièrement simple. Il suffit de placer le bit de poids fort de la coordonnée x, suivi de celui de la coordonnée y, et de faire ainsi de suite en passant aux bits suivants. [[File:Zcurve45bits.png|centre|vignette|upright=1.5|Calcul de la position d'un élément dans une ''Z-order curve'' à partir des coordonnées x et y.]] L'avantage d'une telle organisation est que la textures est découpées en ''tiles'' rectangulaires d'une certaine taille, elles-mêmes découpées en ''tiles'' plus petites, etc. Et il se trouve que cette organisation est parfaite pour le cache de texture. L'idéal pour le cache de texture est de charger une ''tile'' complète dans le cache de textures. Quand on accède à un texel, on s'assure que la ''tile'' complète soit chargée. Mais cela demande de connaitre à l'avance la taille d'une ''tile''. Les formats de texture fournissent généralement une ''tile'' carré de 4 pixels de côté, mais cela donnerait un cache trop petit pour être vraiment utile. Avec cette méthode, on s'assure qu'il y ait une ''tile'' avec la taille optimale. Les ''tiles'' étant découpées en ''tiles'' plus petites, elles-mêmes découpées, et ainsi de suite, on s'assure que la texture est découpées en ''tiles'' de taille variées. Il y aura au moins une ''tile'' qui rentrera tout pile dans le cache. ==L'implémentation matérielle du placage de textures== Pour résumer, la lecture d'un texel demande d'effectuer plusieurs étapes. Dans le cas le plus simple, sans ''mip-mapping'' ou ''cubemapping'', on doit effectuer les étapes suivantes : * Il faut d'abord normaliser les coordonnées de texture pour qu'elles tombent dans l'intervalle [0,1] en fonction du mode d'adressage désiré. * Ensuite, les coordonnées u,v doivent être converties en coordonnées entières, ce qui demande une multiplication flottante. * Enfin, l'adresse finale est calculée à partir des coordonnées entières et en ajoutant l'adresse de base de la texture (et éventuellement avec d'autres calculs arithmétiques suivant le format de la texture). Tout cela pourrait être fait par le pixel shaders, mais cela implique beaucoup de calculs répétitifs et d'opérations arithmétiques assez lourdes, avec des multiplications flottantes, des additions et des multiplications entières, etc. Faire faire tous ces calculs par les shaders serait couteux en performance, sans compter que les shaders deviendraient plus gros et que cela aurait des conséquences sur le cache d'instruction. De plus, certaines de ces étapes peuvent se faire en parallèle, comme les deux premières, ce qui colle mal avec l'aspect sériel des shaders. Aussi, l'unité de texture des processeurs de shaders incorpore une unité de calcul d'adresse spéciale pour faire ces calculs directement en matériel. L'unité de texture contient donc au minimum deux circuits : un circuit de calcul d'adresse, et un circuit d'accès à la mémoire. Toute la difficulté tient dans le calcul d'adresse, plus que dans le circuit de lecture. Le calcul d'adresse est conceptuellement réalisé en deux étapes. La première étape qui transforme les coordonnées u,v en coordonnées x,y qui donne le numéro de la ligne et de la colonne du texel dans la texture. La seconde étape prend ces deux coordonnées x,y et l'adresse de la texture, puis détermine l'adresse de la tile à lire. [[File:Unité de texture simple.png|centre|vignette|upright=2|Unité de texture simple]] ===La gestion des accès mémoire=== L'unité de texture doit tenir compte du fait que la mémoire vidéo met du temps à lire une texture. En théorie, l'unité de texture ne devrait pas accepter de nouvelle demande de lecture tant que celle en cours n'est pas terminée. Mais faire ainsi demanderait de bloquer tout le pipeline, de l'''input assembler'' au unités de''shaders'', ce qui est tout sauf pratique et nuirait grandement aux performances. La solution est de mettre en attente les lectures de texture pendant que la mémoire est occupée. La manière la plus simple est de les mettre en attente dans une mémoire FIFO. Cela implique que les accès mémoire s’exécutent dans l'ordre demandé par le ''shader'' et/ou l'unité de rastérisation, il n'y a pas de réorganisation des accès mémoire ou d’exécution dans le désordre des accès mémoire. [[File:Texture prefetching.png|centre|vignette|upright=1.5|Accès mémoire simultanés.]] Évidemment, quand la mémoire FIFO est pleine, l'unité de texture est totalement bloquée. Le rasteriseur est prévenu que l'unité de texture ne peut pas accepter de nouvelle lecture de texture. En pratique, la FIFO est généralement d'une taille respectable et permet de mettre en attente beaucoup de lectures. Il faut de plus noter qu'il y a une FIFO par processeur de ''shader'' sur les cartes graphiques modernes. Quand elle est pleine, le processeur cesse d'exécuter de nouveaux accès mémoire, mais peut continuer à exécuter des ''shaders'' dans les autres unités de calcul, pas besoin de bloquer complétement le pipeline. ===L'intégration du cache de textures=== Il faut noter que les unités de texture incorporent aussi un cache de texture, voire plusieurs. L'intégration des caches de texture avec la mémoire FIFO précédente est quelque peu compliqué, car il faut garantir que les lectures de texture se fassent dans le bon ordre. On ne peut pas exécuter une lecture dans le cache alors que des lectures précédentes sont en attente de lecture en mémoire vidéo. Et cela pose un gros problème : une lecture dans le cache de texture prend quelques dizaines de cycles d'horloge, alors qu'une lecture en mémoire vidéo en prend facilement 400 à 800 cycles, parfois plus. Et cela fait que l'ordre des accès mémoire peut s'inverser. Prenons par exemple un accès au cache précédé et suivi par deux accès en mémoire vidéo. Le premier démarre au cycle 1, et se termine au cycle numéro 400. L'accès au cache commence au cycle 2 et se termine 20 cycles après, au cycle numéro 22. En clair, la lecture dans le cache s'est terminée avant l'accès mémoire qui le précède. Les textures ne sont donc plus lues dans l'ordre. Et il faut trouver une solution pour éviter cela. La solution est de retarder les lectures dans le cache tant que tous les accès précédents ne sont pas terminés. Mais pour retarder les lectures en question, il faut d'abord savoir si la lecture atterrit dans le cache ou non, ce qui demande d'accéder au cache. On fait face à un dilemme : on veut retarder les accès au cache, mais les différencier des lectures déclenchant des accès mémoire demande d'accéder au cache en premier lieu. La solution est décrite dans l'article "Prefetching in a Texture Cache Architecture" par Igehy et ses collègues. Elle se base sur deux idées combinées ensemble. La première idée est de séparer l'accès au cache en deux : une étape qui vérifie si les texels à lire sont dans le cache, et une étape qui accède aux données dans le cache lui-même. Un cache de texture est donc composé de deux circuits principaux. Le premier vérifie la présence des texels dans le cache. Il reçoit l'adresse mémoire à lire, et détermine si une copie de la donnée associée est dans le cache ou non. Pour cela, il utilise un système de tags qu'on ne détaillera pas ici, mais qui donne son nom à l'unité de vérification : l''''unité de tag'''. Ensuite, en plus de l'unité de tags, il y a une mémoire qui stocke les données, la mémoire cache proprement dite. Par simplicité, cette mémoire est une simple mémoire RAM adressable avec des adresses mémoires des plus normales, chaque ligne de cache correspondant à une adresse. Ce genre de cache séparé en deux mémoires est appelé un ''phased cache'', pour ceux qui veulent en savoir plus. [[File:Phased cache.png|centre|vignette|upright=1.5|Phased cache]] La seconde idée est de retarder l'accès au cache entre les deux phases. La première étape d'un accès mémoire vérifie si la donnée est dans le cache ou non. Puis, on retarde la lecture des données, pour attendre que toutes les lectures précédentes soient terminées. Et enfin, troisième étape : la lecture des texels dans la mémoire cache proprement dite. Les accès mémoire passant par la mémoire vidéo se font de la même manière, à une différence près : la lecture dans le cache est remplacée par la lecture en mémoire vidéo. Tout démarre avec une demande à l'unité de tags, qui vérifie si le texel est dans le cache ou non. Puis on retarde l'accès tant que la mémoire vidéo est occupée, puis on effectue la lecture en mémoire vidéo. Si ce n'est pas le cas, l'accès mémoire est envoyé à la mémoire vidéo comme précédemment, à savoir qu'il est mis en attente dans une mémoire FIFO, puis envoyé à la mémoire vidéo dès que celle-ci est libre. Mais en sortie de la mémoire, la donnée lue est envoyée dans le cache de texture, par dans l'unité de filtrage. Pour savoir où placer la donnée lue, l'unité de tag a réservé une ligne de cache précise, une adresse bien précise. L'adresse en question est disponible en lisant une autre mémoire FIFO, qui a mis en attente l'adresse en question, en attendant que l'accès mémoire se termine. La donnée est alors écrite dans le cache, puis lue par l'unité de filtrage de textures. Pour une lecture dans le cache, le déroulement est similaire, mais sans le passage par la mémoire. La lecture fait une demande à l'unité de tag, et celle-ci répond que la donnée est bien dans le cache. Elle place alors l'adresse à lire dans la file d'attente. Une fois que les accès mémoire précédents sont terminés, l'adresse sort de la file d'attente et est envoyée à la mémoire de données. La lecture s'effectue, les texels sont envoyés à l'unité de filtrage de textures. La seule différence avec un ''phased cache'' normal est l'insertion de l'adresse à lire dans une FIFO qui vise à mettre en attente [[File:Unité de texture avec un cache de texture.png|centre|vignette|upright=2.0|Unité de texture avec un cache de texture]] Pour résumer, l'implémentation précédente garantit une exécution des lectures dans leur ordre d'arrivée. Et pour cela, elle retarde les lectures dans le cache tant que les lectures en mémoire précédentes ne sont pas terminées. L'accès au cache est plus rapide que l'accès en mémoire vidéo, mais le retard ajouté pour garantir l'ordre des lectures fait que le temps d'accès est très long. ==Le mip-mapping== Le '''mip-mapping''' a pour but de légèrement améliorer les graphismes des objets lointains, tout en rendant les calculs de texture plus rapides. Formellement, le ''mip-mapping'' est une technique de filtrage de texture, mais nous l'abordons maintenant car elle est surtout liée au calcul d'adresse. Les unités de texture ont des circuits de filtrage de texture séparés des circuits de ''mip-mapping'' et de calcul d'adresse, d'où le fait que nous en parlons séparément. Le problème résolu par le ''mip-mapping'' est le rendu des textures lointaines. Si une texture est plaquée sur un objet lointain, une bonne partie des détails est invisible pour l'utilisateur. Un pixel de l'écran est associé à plusieurs texels. Idéalement, la carte graphiques devrait lire tous ces texels et en faire une sorte de moyenne pondérée, pour calculer la couleur finale du pixel. Mais dans les faits, ce serait très gourmand et compliqué à implémenter en hardware. Une solution serait de ne garder que quelque texels, mais cela a tendance à créer des artefacts visuels (les textures affichées ont tendance à pixeliser). Le ''mip-mapping'' permet de réduire ces deux problèmes en même temps en précalculant cette moyenne pondérée pour des distances prédéfinies. L'idée est d'utiliser plusieurs exemplaires d'une même texture à des résolutions différentes, chaque exemplaire étant adapté à une certaine distance. Par exemple, une texture sera stocké avec un exemplaire de 512 * 512 pixels, un autre de 256 * 256, un autre de 128 * 128 et ainsi de suite jusqu’à un dernier exemplaire de 32 * 32 pixel. Chaque exemplaire correspond à un '''niveau de détail''', aussi appelé ''Level Of Detail'' (abrévié en LOD). La résolution utilisée diminue d'autant plus que l'objet est situé loin de la caméra. Les objets proches seront rendus avec la texture 512*512, ceux plus lointains seront rendus avec la texture de résolution 256*256, les textures 128*128 seront utilisées encore plus loin, et ainsi de suite jusqu'aux objets les plus lointains qui sont rendus avec la texture la plus petite de 32*32. [[File:MipMap Example STS101.jpg|centre|vignette|upright=2|Exemples de mip-maps.]] Le ''mip-mapping'' améliore grandement la qualité d'image. L'image d'exemple ci-dessous le montre assez bien. [[File:Mipmapping example.png|centre|vignette|upright=2|Exemple de mipmapping.]] Pour faciliter les calculs d'adresse, les LOD d'une même texture sont stockées les uns après les autres en mémoire (dans un tableau, comme diraient les programmeurs). Ainsi, pas besoin de se souvenir de la position en mémoire de chaque LOD : l'adresse de la texture de base, et quelques astuces arithmétiques suffisent. Prenons le cas où la texture de base a une taille L. le premier exemplaire est à l'adresse 0, le second niveau de détail est à l'adresse L, le troisième à l'adresse L + L/4, le suivant à l'adresse L + L/4 + L/16, et ainsi de suite. Le calcul d'adresse demande juste connaître le niveau de détails souhaité et l'adresse de base de la texture. Le niveau de détail voulu est calculé par les pixel shaders, en fonction de la coordonnée de profondeur du pixel à traiter. Évidemment, cette technique consomme de la mémoire vidéo, vu que chaque texture est dupliquée en plusieurs exemplaires, en plusieurs LOD. Dans le détail, la technique du mip-mapping prend au maximum 33% de mémoire en plus (sans compression). Cela vient du fait qu'en prenant une texture dexu fois plus petite, elle prend 4 fois moins de mémoire : 2 fois moins de pixels en largeur, et 2 fois moins en hauteur. Donc, si je pars d'une texture de base contenant X pixels, la totalité des LODs, texture de base comprise, prendra X + (X/4) + (X/16) + (X/256) + … Un petit calcul de limite donne 4/3 * X, soit 33% de plus. ===L'implémentation du mip-mapping dans l'unité de texture=== Le ''mip-mapping'' est lui aussi pris en charge par l'unité de calcul d'adresse, car cette technique change l'adresse de base de la texture. La gestion du ''mip-mapping'' est cependant assez complexe. Il est possible de laisser le pixel shader calculer quel niveau de détail utiliser, en fonction de la coordonnée de profondeur z du pixel à afficher. La carte graphique détermine alors automatiquement quelle texture lire, quel niveau de détail, automatiquement. Elle détermine aussi la bonne résolution pour la texture, qui est égal à la résolution de la texture de base, divisée par le niveau de détail. Pour résumer, le niveau de détail est envoyé aux unités de texture, qui s'occupent de calculer l'adresse de base et la résolution adéquates. Quelques calculs arithmétiques simples, donc, qui s'implémentent facilement avec quelques circuits. Mais une autre méthode laisse la carte graphique déterminer le niveau de détail par elle-même. Dans ce cas, cela demande, outre les deux coordonnées de texture, de calculer la dérivée de ces deux coordonnées dans le sens horizontal et vertical, ce qui fait quatre dérivées (deux dérivées horizontales, deux verticales). Les quatre dérivées sont les suivantes : : <math>\frac{du}{dx}</math>, <math>\frac{dv}{dx}</math>, <math>\frac{du}{dy}</math>, <math>\frac{dv}{dy}</math> Un bon moyen pour obtenir les dérivées demande de regrouper les pixels par groupes de 4 et de faire la différence entre leurs coordonnées de texture respectives. On peut calculer les deux dérivées horizontales en comparant les deux pixels sur la même ligne, et les deux dérivées verticales en comparant les deux pixels sur la même colonne. Mais cela demande de rastériser les pixels par groupes de 4, par ''quads''. Et c'est ce qui est fait sur les cartes graphiques actuelles, qui rastérisent des groupes de 4 pixels à la fois. [[File:Texture sampler unit with mipmapping.png|centre|vignette|upright=2.0|Unité de texture avec mipmapping.]] Malheureusement, le calcul exact utilisé pour le choix de la mip-map dépend du GPU considéré et peu de chose est connu quant à ces algorithmes. Il est possible d'inférer le comportement à partir d'observations, mais guère plus. Pour ceux qui veulent en savoir plus, je conseille la lecture de cet article de blog : * [https://pema.dev/2025/05/09/mipmaps-too-much-detail/ Mipmap selection in too much detail] ==Le filtrage de textures== Plaquer des textures sans autre forme de procès ne suffit pas à garantir des graphismes d'une qualité époustouflante. La raison est que les sommets et les texels ne tombent pas tout pile sur un pixel de l'écran : le sommet associé au texel peut être un petit peu trop en haut, ou trop à gauche, etc. Une explication plus concrète fait intervenir les coordonnées de texture. Souvenez-vous que lorsque l'on traduit une coordonnée de texture u,v en coordonnées x,y, on obtient un résultat qui ne tombe pas forcément juste. Souvent, le résultat a une partie fractionnaire. Si celle-ci est non-nulle, cela signifie que le texel/sommet n'est pas situé exactement sur le pixel voulu et que celui-ci est situé à une certaine distance. Concrètement, le pixel tombe entre quatre texels, comme indiqué ci-dessous. [[File:Filtrage texture.png|centre|vignette|upright=2.0|Position du pixel par rapport aux texels.]] Pour résoudre ce problème, on doit utiliser différentes techniques d'interpolation, aussi appelées techniques de '''filtrage de texture''', qui visent à calculer la couleur du pixel final en fonction des texels qui l'entourent. Il existe de nombreux types de filtrage de textures, qu'il s'agisse du filtrage linéaire, bilinéaire, trilinéaire, anisotropique et bien d'autres. Tous ont besoin d'avoir certaines informations qui sont généralement fournies par les circuits de calcul d'adresse. La première est clairement la partie fractionnaire des coordonnées x,y. La seconde est la dérivée de ces deux coordonnées dans le sens horizontal et vertical., ce qui fait quatre dérivées (deux dérivées horizontales, deux verticales). Toujours est-il que le filtrage de texture est une opération assez lourde, qui demande beaucoup de calculs arithmétiques. On pourrait en théorie le faire dans les pixels shaders, mais le cout en performance serait absolument insoutenable. Aussi, les cartes graphiques intègrent toutes un circuit dédié au filtrage de texture, le ''texture sampler''. Même les plus anciennes cartes graphiques incorporent une unité de filtrage de texture, ce qui nous montre à quel point cette opération est importante. [[File:Texture unit.png|centre|vignette|upright=2.0|Unité de texture.]] On peut configurer la carte graphique de manière à ce qu'elle fasse soit du filtrage bilinéaire, soit du filtrage trilinéaire, on peut configurer le niveau de filtrage anisotropique, etc. Cela peut se faire dans les options de la carte graphique, mais cela peut aussi être géré par l'application. La majorité des jeux vidéos permettent de régler cela dans les options. Ces réglages ne concernent pas la texture elle-même, mais plutôt la manière dont l'unité de texture doit fonctionner. Ces réglages sur l''''état de l'unité de texture''' sont mémorisés quelque part, soit dans l'unité de texture elle-même, soit fournies avec la ressource de texture elle-même, tout dépend de la carte graphique. Certaines cartes graphiques mémorisent ces réglages dans les unités de texture ou dans le processeur de commande, et tout changement demande alors de réinitialiser l'état des unités de texture, ce qui prend un peu de temps. D'autres placent ces réglages dans les ressources de texture elles-mêmes, ce qui rend les modifications de configuration plus rapides, mais demande plus de circuits. D'autres cartes graphiques mélangent les deux options, certains réglages étant globaux, d'autres transmis avec la texture. Bref, difficile de faire des généralités, tout dépend du matériel et le pilote de la carte graphique cache tout cela sous le tapis. Maintenant que cela est dit, voyons quelles sont les différentes méthodes de filtrage de texture et comment la carte graphique fait pour les calculer. ===Le filtrage au plus proche=== La méthode de filtrage la plus simple consiste à colorier avec le texel le plus proche. Cela revient tout simplement à ne pas tenir compte de la partie fractionnaire des coordonnées x,y, ce qui est très simple à implémenter en matériel. C'est ce que l'on appelle le '''filtrage au plus proche''', aussi appelé ''nearest filtering''. Autant être franc, le résultat est assez pixelisé et peu agréable à l’œil. Par contre, le résultat est très rapide à calculer, vu qu'il ne demande aucun calcul à proprement parler. Elle ne fait pas appel à la parti fractionnaire des coordonnées entières de texture, ni aux dérivées de ces coordonnées. On peut combiner cette technique avec le mip-mapping, ce qui donne un résultat bien meilleur, bien que loin d'être satisfaisant. Au passage, toutes les techniques de filtrage de texture peuvent se combiner avec du mip-mapping, certaines ne pouvant pas faire sans. [[File:Interpolation-nearest.svg|centre|vignette|Filtrage de texture au plus proche.]] ===Le filtrage linéaire=== Le filtrage le plus simple est le '''filtrage linéaire'''. Il effectue une interpolation linéaire entre deux mip-maps, deux niveaux de détails. Pour comprendre l'idée, nous allons prendre une situation très simple, avec une texture carrée de 512 texels de côté. Le mip-mapping crée plusieurs textures : une de 256 texels de côté, une de 128 texels, une de 64, etc. Maintenant, la texture est sur un objet à une certaine distance de l'écran, vu de face. Le résultat est qu'elle correspond à l'écran à un carré de 300 pixels de côté (pas d'erreur : pixels, pas texels). Dans ce cas, la texture se trouve entre deux mip-maps : celle de 512 pixels de côté, celle de 256. Laquelle choisir ? Le filtrage au plus proche prend la texture de 512 pixels de côté. Le filtrage linéaire lui, fait autrement. Vu que la texture est entre deux mip-maps, l'idée est de prendre le texel au plus proche dans chaque texture et de faire une sorte de moyenne appelée l'interpolation linéaire. L'interpolation par du principe que la couleur varie entre les deux texels en suivant une fonction affine, illustrée ci-dessous. Ce ne serait évidemment pas le cas dans le monde réel, mais on supposer cela donne une bonne approximation de ce à quoi ressemblerait une texture à plus haute résolution. On peut alors calculer la couleur du pixel par une simple moyenne pondérée par la distance. Le résultat est que les transitions entre deux niveaux de détails sont plus lisses, moins abruptes. [[File:Lin interp -é.png|centre|vignette|upright=2.0|Interpolation linéaire.]] ===Le filtrage bilinéaire=== Le filtrage bilinéaire effectue une sorte de moyenne pondérée des quatre texels les plus proches du pixel à afficher. Pour cela, rappelez-vous ce qui a été dit plus haut : les coordonnées x,y d'un pixel ont une partie entière et une partie fractionnaire. Le filtrage au plus proche élimine les parties fractionnaires, ce qui donne une coordonnée x,y. Avec le filtrage bilinéaire, on prend les texels de coordonnées (x,y) ; (x+1,y) ; (x,y+1) ; (x+1,y+1), le pixel étant entre ces 4 texels. Mais le filtrage ne fait pas qu'une simple moyenne, il prend en compte les parties fractionnaires pour faire la moyenne. En effet, le pixel n'est pas au milieu du carré de texel, il est quelque part mais est souvent plus proche d'un texel que des autres. Et il faut donc pondérer la moyenne par les distances aux 4 texels. Pour cela, la moyenne est calculée à partir d'interpolations linéaires. Avec 4 pixels, nous allons devoir calculer la couleur de deux points intermédiaires. La couleur de ces deux points se calcule par interpolation linéaire, et il suffit d'utiliser une troisième interpolation linéaire pour obtenir le résultat. [[File:Bilin3.png|centre|vignette|upright=2|Filtrage bilinéaire de texture.]] Le circuit qui permet de faire l'interpolation bilinéaire est particulièrement simple. On trouve un circuit de chaque pour chaque composante de couleur de chaque texel : un pour le rouge, un pour le vert, un pour le bleu, et un pour la transparence. Chacun de ces circuit est composé de sous-circuits chargés d'effectuer une interpolation linéaire, reliés comme suit. [[File:Texture sampler unit.png|centre|vignette|Unité de filtrage bilinéaire.]] Vous noterez que le filtrage bilinéaire accède à 4 pixels en même temps. Fort heureusement, les textures sont stockées de manière à ce qu'on puisse charger les 4 pixels en une fois, comme on l'a vu plus haut. Le filtrage bilinéaire a de fortes chances que les 4 pixels filtrés soient dans la même ''tile'', la seule exception étant quand ils sont tout juste sur le bord d'une ''tile''. : La console de jeu Nintendo 64 n'utilise que trois pixels au lieu de quatre dans son interpolation bilinéaire, qui en devient une interpolation quasi-bilinéaire. La raison derrière ce choix est une question de performances, comme beaucoup de décisions de ce genre. Le résultat est un rendu imparfait de certaines textures. ===Le filtrage trilinéaire=== Avec le filtrage bilinéaire, des discontinuités apparaissent sur certaines surfaces. Par exemple, pensez à une texture de sol : elle est appliquée plusieurs fois sur toute la surface du sol. A une certaine distance, le LOD utilisé change brutalement et passe par exemple de 512*512 à 256*256, ce qui est visible pour un joueur attentif. De telles transitions sont lissées grâce au filtrage linéaire, il n'y a plus qu'à le combiner avec le filtrage bilinéaire. Rien d’incompatible : le premier filtre l'intérieur d'une mip-map, le second combine deux mip-maps. Le filtrage trilinéaire prend les deux mip-maps les plus proches, fait un filtrage bilinéaire avec chacune, puis fait une « une moyenne » pondérée entre les deux résultats. Le circuit de filtrage trilinéaire existe en plusieurs versions. La plus simple, illustrée ci-dessous, effectue deux filtrages bilinéaires en parallèle, dans deux circuits séparés, puis combine leurs résultats avec un circuit d'interpolation linéaire. Mais ce circuit nécessite de charger 8 texels simultanément. Qui plus est, ces 8 texels ne sont pas consécutifs en mémoire, car ils sont dans deux niveaux de détails/mip-maps différents. [[File:Parallel trilinear filtering.png|centre|vignette|upright=2.0|Unité de filtrage trilinéaire parallèle.]] Vu qu'on lit des texels dans deux mip-maps, les texels sont lus en deux fois : 4 texels provenant de la première mip-map, suivis par les 4 texels de l'autre mip-map. Les 4 premiers texels doivent donc être mis en attente dans des registres, en attendant que les 4 autres arrivent. Une amélioration du circuit précédent gère cela en ajoutant des registres. Il lit les 4 premiers texels, les filtre avec une interpolation bilinéaire, et mémorise le résultat dans un registre. Puis, il lit les 4 autres texels, les filtre, et met le résultat dans un second registre. A ce moment là, un circuit d'interpolation linéaire finit le travail. On économise donc un circuit d'interpolation bilinéaire, sans que les performances soient trop impactées. [[File:Filtrage trilineaire.png|centre|vignette|upright=1.0|Unité de filtrage trilineaire série.]] Modifier le circuit de filtrage ne suffit pas. Comme je l'ai dit plus haut, la dernière étape d'interpolation linéaire utilise des coefficients, qui lui sont fournis par des registres. Seul problème : entre le temps où ceux-ci sont calculés par l'unité de mip-mapping, et le moment où les texels sont chargés depuis la mémoire, il se passe beaucoup de temps. Le problème, c'est que les unités de texture sont souvent pipelinées : elles peuvent démarrer une lecture de texture sans attendre que les précédentes soient terminées. À chaque cycle d'horloge, une nouvelle lecture de texels peut commencer. La mémoire vidéo est conçue pour supporter ce genre de chose. Cela a une conséquence : durant les 400 à 800 cycles d'attente entre le calcul des coefficients, et la disponibilité des texels, entre 400 et 800 coefficients sont produits : un par cycle. Autant vous dire que mémoriser 400 à 800 ensembles de coefficient prend beaucoup de registres. ===Le filtrage anisotrope=== D'autres artefacts peuvent survenir lors de l'application d'une texture, la perspective pouvant déformer les textures et entraîner l'apparition de flou. La raison à cela est que les techniques de filtrage de texture précédentes partent du principe que la texture est vue de face. Prenez une texture carrée, par exemple. Vue de face, elle ressemble à un carré sur l'écran. Mais tournez la caméra, de manière à voir la texture de biais, avec un angle, et vous verrez que la forme de la texture sur l'écran est un trapèze, pas un carré. Cette déformation liée à la perspective n'est pas prise en compte par les méthodes de filtrage de texture précédentes. Pour le dire autrement, les techniques de filtrage précédentes partent du principe que les 4 texels qui entourent un pixel forment un carré, ce qui est vrai si la texture est vue de face, sans angle, mais ne l'est pas si la texture n'est pas perpendiculaire à l'axe de la caméra. Du point de vue de la caméra, les 4 texels forment un trapèze d'autant moins proche d'un carré que l'angle est grand. Pour corriger cela, les chercheurs ont inventé le '''filtrage anisotrope'''. En fait, je devrais plutôt dire : LES filtrages anisotropes. Il en existe un grand nombre, dont certains ne sont pas utilisés dans les cartes graphiques actuelles, soit car ils trop gourmand en accès mémoires et en calculs pour être efficaces, soit car ils ne sont pas pratiques à mettre en œuvre. Il est très difficile de savoir quelles sont les techniques de filtrage de texture utilisées par les cartes graphiques, qu'elles soient récentes ou anciennes. Beaucoup de ces technologies sont brevetées ou gardées secrètes, et il faudrait vraiment creuser les brevets déposés par les fabricants de GPU pour en savoir plus. Les algorithmes en question seraient de plus difficiles à comprendre, les méthodes mathématiques cachées derrière ces méthodes de filtrage n'étant pas des plus simple. [[File:Anisotropic filtering en.png|centre|vignette|upright=2|Exemple de filtrage anisotrope.]] ==La compression de textures== Les textures les plus grosses peuvent aller jusqu'au mébioctet, ce qui est beaucoup. Pour limiter la casse, les textures sont compressées. La '''compression de texture''' réduit la taille des textures, ce qui peut se faire avec ou sans perte de qualité. Elle entraîne souvent une légère perte de qualité lors de la compression. Toutefois, cette perte peut être compensée en utilisant des textures à résolution plus grande. Mais il s'agit là d'une technique très simple, beaucoup plus simple que les techniques que nous allons voir dans cette section. Nous allons voir quelque algorithmes de compression de textures de complexité intermédiaire, mais n'allons pas voir l'état de l'art. Il existe des formats de texture plus récents que ceux qui nous allons aborder, comme l{{'}}''Ericsson Texture Compression'' ou l{{'}}''Adaptive Scalable Texture Compression'', plus complexes et plus efficaces. Notons que les textures sont compressées dans les fichiers du jeu, mais aussi en mémoire vidéo. Les textures sont décompressées lors de la lecture. Pour cela, la carte graphique contient alors un circuit, capable de décompresser les textures lorsqu'on les lit en mémoire vidéo. Les cartes graphiques supportent un grand nombre de formats de textures, au niveau du circuit de décompression. Du fait que les textures sont décompressées à la volée, les techniques de compression utilisées sont assez particulières. La carte graphique ne peut pas décompresser une texture entière avant de pouvoir l'utiliser dans un ''pixel shader''. A la place, on doit pouvoir lire un morceau de texture, et le décompresser à la volée. On ne peut utiliser les méthodes de compression du JPEG, ou d'autres formats de compression d'image. Ces dernières ne permettent pas de décompresser une image morceau par morceau. Pour permettre une décompression/compression à la volée, les textures sont des textures tilées, généralement découpées en tiles de 4 * 4 texels. Les ''tiles'' sont compressées indépendamment les unes des autres. Et surtout, avec ou sans compression, la position des tiles en mémoire ne change pas. On trouve toujours une tile tous les T octets, peu importe que la tile soit compressée ou non. Par contre, une tile compressée n'occupera pas T octets, mais moins, là où une tile compressée occupera la totalité des T octets. En clair, compresser une tile fait qu'il y a des vides entre deux tiles dans al mémoire vidéo, mais ne change rien à leur place en mémoire vidéo qui est prédéterminée, peu importe que la texture soit compressée ou non. L'intérêt de la compression de textures n'est pas de réduire la taille de la texture en mémoire vidéo, mais de réduire la quantité de données à lire/écrire en mémoire vidéo. Au lieu de lire T octets pour une tile non-compressée, on pourra en lire moins. ===La palette indicée et la technique de ''Vector quantization''=== La technique de compression des textures la plus simple est celle de la '''palette indicée''', que l'on a entraperçue dans le chapitre sur les cartes d'affichage. La technique de '''''vector quantization''''' peut être vue comme une amélioration de la palette, qui travaille non pas sur des texels, mais sur des ''tiles''. À l'intérieur de la carte graphique, on trouve une table qui stocke toutes les ''tiles'' possibles. Chaque ''tile'' se voit attribuer un numéro, et la texture sera composé d'une suite de ces numéros. Quelques anciennes cartes graphiques ATI, ainsi que quelques cartes utilisées dans l’embarqué utilisent ce genre de compression. ===Les algorithmes de ''Block Truncation coding''=== La première technique de compression élaborée est celle du '''''Block Truncation Coding''''', qui ne marche que pour les images en niveaux de gris. Le BTC ne mémorise que deux niveaux de gris par ''tile'', que nous appellerons couleur 1 et couleur 2, les deux niveaux de gris n'étant pas le même d'une ''tile'' à l'autre. Chaque pixel d'une ''tile'' est obligatoirement colorié avec un de ces niveaux de gris. Pour chaque pixel d'une ''tile'', on mémorise sa couleur avec un bit : 0 pour couleur 1, et 1 pour couleur 2. Chaque ''tile'' est donc codée par deux entiers, qui codent chacun un niveau de gris, et une suite de bits pour les pixels proprement dit. Le circuit de décompression est alors vraiment très simple, comme illustré ci-dessous. [[File:Block Truncation coding.jpg|centre|vignette|upright=2.0|Block Truncation coding.]] La technique du BTC peut être appliquée non pas du des niveaux de gris, mais pour chaque composante Rouge, Vert et Bleu. Dans ces conditions, chaque ''tile'' est séparée en trois sous-''tiles'' : un sous-bloc pour la composante verte, un autre pour le rouge, et un dernier pour le bleu. Cela prend donc trois fois plus de place en mémoire que le BTC pur, mais cela permet de gérer les images couleur. ===Le format de compression S3TC / DXTC=== L'algorithme de '''Color Cell Compression''', ou CCC, améliore le BTC pour qu'il gère des couleurs autre que des niveaux de gris. Ce CCC remplace les deux niveaux de gris par deux couleurs. Une ''tile'' est donc codée avec un entier 32 bits par couleur, et une suite de bits pour les pixels. Le circuit de décompression est identique à celui utilisé pour le BTC. [[File:Color Cell Compression.jpg|centre|vignette|Color Cell Compression.]] [[File:Dxt1-memory-layout.png|vignette|Dxt1 et ''color cell compression''.]] Le format de compression de texture utilisé de base par Direct X, le DXTC, est une version amliorée de l'algorithme précédent. Il est décliné en plusieurs versions : DXTC1, DXTC2, etc. La première version du DXTC est une sorte d'amélioration du CCC : il ajoute une gestion minimale de transparence, et découpe la texture à compresser en ''tiles'' de 4 pixels de côté. La différence, c'est que la couleur finale d'un texel est un mélange des deux couleurs attribuée au bloc. Pour indiquer comment faire ce mélange, on trouve deux bits de contrôle par texel. Si jamais la couleur 1 < couleur2, ces deux bits sont à interpréter comme suit : * 00 = Couleur1 * 01 = Couleur2 * 10 = (2 * Couleur1 + Couleur2) / 3 * 11 = (Couleur1 + 2 * Couleur2) / 3 Sinon, les deux bits sont à interpréter comme suit : * 00 = Couleur1 * 01 = Couleur2 * 10 = (Couleur1 + Couleur2) / 2 * 11 = Transparent [[File:DXTC.jpg|centre|vignette|DXTC.]] Le circuit de décompression du DXTC ressemble alors à ceci : [[File:Circuit de décompression du DXTC.jpg|centre|vignette|upright=2.0|Circuit de décompression du DXTC.]] ===Les format DXTC 2, 3, 4 et 5 : l'ajout de la transparence=== Pour combler les limitations du DXT1, le format DXT2 a fait son apparition. Il a rapidement été remplacé par le DXT3, lui-même replacé par le DXT4 et par le DXT5. Dans le DXT3, la transparence fait son apparition. Pour cela, on ajoute 64 bits par ''tile'' pour stocker des informations de transparence : 4 bits par texel. Le tout est suivi d'un bloc de 64 bits identique au bloc du DXT1. [[File:Dxt23-memory-layout.png|centre|vignette|Dxt 2 et 3.]] Dans le DXT4 et le DXT5, la méthode utilisée pour compresser les couleurs l'est aussi pour les valeurs de transparence. L'information de transparence est stockée par un en-tête contenant deux valeurs de transparence, le tout suivi d'une matrice qui attribue trois bits à chaque texel. En fonction de la valeur des trois bits, les deux valeurs de transparence sont combinées pour donner la valeur de transparence finale. Le tout est suivi d'un bloc de 64 bits identique à celui qu'on trouve dans le DXT1. [[File:Dxt45-memory-layout.png|centre|vignette|Dxt 4 et 5.]] ===Le format de compression PVRTC=== Passons maintenant à un format de compression de texture un peu moins connu, mais pourtant omniprésent dans notre vie quotidienne : le PVRTC. Ce format de texture est utilisé notamment dans les cartes graphiques de marque PowerVR. Vous ne connaissez peut-être pas cette marque, et c'est normal : elle travaille surtout dans les cartes graphiques embarquées. Ses cartes se trouvent notamment dans l'ipad, l'iPhone, et bien d'autres smartphones actuels. Avec le PVRTC, les textures sont encore une fois découpées en ''tiles'' de 4 texels par 4, mais la ressemblance avec le DXTC s’arrête là. Chacque ''tile'' est codée avec : * une couleur codée sur 16 bits ; * une couleur codée sur 15 bits ; * 32 bits qui servent à indiquer comment mélanger les deux couleurs ; * et un bit de modulation, qui permet de configurer l’interprétation des bits de mélange. Les 32 bits qui indiquent comment mélanger les couleurs sont une collection de 2 paquets de 2 bits. Chacun de ces deux bits permet de préciser comment calculer la couleur d'un texel du bloc de 4*4. ==Annexe : le ''normal-mapping'' hardware== [[File:Graphics lightmodel ptsource.png|vignette|Normale de la surface.]] Maintenant, parlons un peu du ''normal mapping'' et de son implémentation dans les unités de texture. Pour rappel, les techniques de ''normal mapping'' permettent d'ajouter du relief et des détails sur des surfaces planes en jouant sur l'éclairage. Elles permettent ainsi de simplifier grandement la géométrie rendue, tout en utilisant l'éclairage pour compenser. Et pour comprendre quel est le rapport avec les textures, nous allons devoir faire quelques rappels sur l'éclairage par pixel. [[File:WallSimpleAndNormalMapping.png|centre|vignette|upright=2|Différence sans et avec ''normal-mapping''.]] L'éclairage se fait en utilisant de nombreux calculs, qu'on a détaillé dans le chapitre sur les bases du rendu 3D. Ceux-ci utilisent la normale d'un sommet, à savoir un vecteur orienté à la verticale de la surface. En théorie, il y a une normale par sommet, ce qui fait que les calculs d'éclairage doivent se faire au niveau géométrique, avant la rastérisation. Mais pour obtenir un éclairage de meilleure qualité, il y a des techniques qui calcule l'éclairage d'une scène 3D pixel par pixel. Une première technique d'éclairage par pixel interpole les normales lors de l'étape de rastérisation. On obtient alors un éclairage de Phong. Une autre solution est celle du ''normal mapping''. Le '''''normal mapping''''' précalcule les normales d'une surface dans une texture, appelée la ''normal map''. L'éclairage est alors réalisé par un pixel shader, qui lit les normales depuis cette texture et fait les calculs d'éclairage avec. ===L'usage de textures non-compressées pour les ''normal maps''=== La ''normal map'' est une texture, donc. Mais ce n'est pas une texture comme une autre. Elle mémorise un vecteur pour chaque texel, pas une couleur. Il est possible d'utiliser les formats de textures non-compressés, même si cela ne donne pas de bons résultats. Après tout, un vecteur est codé par trois coordonnées x,y,z, il est possible de coder chacune avec un octet et de packager cela dans une texture RGB classique. La coordonnée x va dans la composante Rouge, la coordonnée Y dans la composante Bleu, et la coordonnée z dans la composante z. Une première optimisation est de ne pas mémoriser les trois coordonnées, mais seulement deux d'entre elles et de calculer la troisième. En effet, les normales sont des vecteurs ''normalisés'', c'est à dire que leur longueur vaut 1, par construction. Vu que la taille est connue à l'avance, on peut en déduire la coordonnée z à partir des coordonnées x et y, avec l'usage du théorème de Pythagore. Par définition, <math>z^2 = 1 - x^2 - y^2</math>. Le calcul peut être fait dans le ''pixel shader'' sans problème. : Pour être précis, il faut que les normales soient définies d'une certaine manière pour que ça marche. Les normales ne sont pas définies dans le même système de coordonnées que le modèle 3D, mais dans un autre système appelé l'''espace tangent''. Notons que l'accès à la ''normal map'' se fait comme pour n'importe quelle texture : les texels sont lus en mémoire vidéo, puis le filtrage de texture est appliqué, et enfin le tout est envoyé au ''pixel shader''. En théorie, le filtrage effectue une sorte d'interpolation des normales automatique, ce qui permet de trouver la normale à un pixel précis, même s'il n'est pas sur un texel. Les solutions précédentes demandent d'utiliser des textures non-compressées, qui utilisent beaucoup de mémoire vidéo. Utiliser des textures compressées pourrait sembler résoudre le problème. Mais l'usage de textures compressées marche très mal pour les ''normal maps'', elles ne permettent pas d'obtenir une qualité ou une compression suffisante. Aussi, des formats de texture dédiés aux ''normal maps'' ont été inventés. ===Le format de texture 3Dc=== Le problème est que le rendu final n'est pas très beau. Et les opérations de filtrage ne donnent pas de très bons résultats. Pour remédier à ces problèmes, des formats de texture spécialisés pour les ''normal map'' ont été inventés. Le premier d'entre eux est le '''3Dc''', aussi appelé BC5 pour ''Block Compression 5''. Il utilise un octet par texel, au lieu de trois avec une texture RGB normale non-compressée. Et surtout : il est géré en matériel, directement dans l'unité de texture, qui peut décompresser les textures 3Dc et les filtrer ! Avec le 3Dc, seules coordonnées sont mémorisées, la troisième est calculée, comme dit plus haut. Pour le reste, la compression de la ''normal map'' ressemble un peu à celle des textures. La ''normal map'' est découpée en blocs de 4 par 4 texels de côté, chacune étant encodée en tenant compte de certaines redondances. Dans un bloc, les coordonnées x sont dans un certain intervalle, allant de <math>x_{min}</math> à <math>x_{max}</math>, idem pour la coordonnée y qui est dans l'intervalle <math>y_{min}</math>, <math>y_{max}</math>. L'intervalle <math>x_{min}</math> à <math>x_{max}</math> est coupé en 8 parts égales, ce qui fait 8 valeurs possibles dans cet intervalle, chacune correspondant à une valeur x possible pour une normale du bloc. La normale est donc encodée en précisant quelle valeur est la bonne, en utilisant un indice de 3 bits pour cela. La valeur exacte de la coordonnée x se calcule à partir de l'indice comme suit : : <math>x = x_{min} + \left( \frac{x_{min} - x_{min}}{8} \right) \times \text{indice} </math> Pour encoder un bloc de 4 par 4 normales, il faut donc : * Un octet pour chaque coordonnée <math>x_{min}</math>, <math>x_{max}</math>, <math>y_{min}</math>, <math>y_{max}</math>. * 6 bits par normale : 3 pour encoder le décalage de la coordonnée x, 3 pour la coordonnée y. Le tout permet d'encoder un bloc de 16 normales en seulement 128 bits, soit un octet par normale. Le ''pixel shader'' se débrouille pour décompresser un bloc. Il effectue notamment le calcul du dessus, pour retrouver la coordonnée x. Les calculs étant particulièrement simples, le cout en performance est très faible. Et ce d'autant plus qu'ils demandent juste de faire des additions et des multiplications entières, que l'unité scalaire peut faire en parallèle d'autres opérations plus gourmandes. Et le cout en calculs est de toute façon compensé par l'économie de mémoire et de bande passante lié à la compression : diviser la taille des données par trois, ca a un sacré impact ! ==Annexe : les ''shadowmap'' hardware== Les anciens GPU, notamment la Geforce FX, avaient des fonctionnalités spécifiques pour le calcul des ombres. Dans la plupart des jeux vidéos de l'époque, et même de maintenant, les ombres sont calculées avec la technique des ''shadowmap''. L'idée est assez simple sur le principe : un pixel est dans l'ombre quand il est invisible depuis une source de lumière. L'idée est que le rendu est réalisé en plusieurs passes, avec une passe par source de lumière et une passe finale pour calculer l'image finale. Nous allons expliquer la technique avec une seule source de lumière, et allons utiliser l'exemple de la scène ci-dessous. [[File:7fin.png|centre|vignette|Scène 3D d'exemple.]] ===La technique du ''shadowmapping''=== [[File:2shadowmap.png|vignette|Résultat de la première passe : ''shadowmap''..]] La première passe rend l'image depuis le point de vue de la source de lumière. Cette première passe ne rend pas les couleurs de la scène, elle ne s'intéresse qu'à la profondeur des pixels. Le résultat est que l'image ne rend que le tampon de profondeur. Celui-ci est ensuite réutilisé comme texture pour la passe suivante. La texture en question est appelée la '''''shadownmap'''''. La perspective utilisée, ainsi que le ''view frustrum'', dépend de la source de lumière. Pour une source de lumière qui émet un cône de lumière, le ''view frustrum'' de l'image rendue doit contenir tout le cone de lumière, et doit coller le plus possible à celui-ci. Pour une source directionnelle, comme le soleil, une perspective orthographique est utilisée. La seconde passe rend l'image du point de vue de la caméra, pour rendre l'image finale. Elle rend l'image finale, qui est composée de pixels, chacun ayant une position à l'écran x,y, et une profondeur z. Les coordonnées sont transformées pour obtenir la position de ce pixel depuis le point de vue de la caméra. Une simple multiplication de matrice suffit, rien de bien compliqué, un shader peut le faire. [[File:5failed.png|vignette|Résultat du test des comparaisons.]] Après cette étape, on a alors les coordonnées x,y,z de ce pixel du point de vue de la caméra, et la ''shadowmap''. Il est alors possible d'accéder à la ''shadowmap'' au même endroit, à la même place que le pixel testé, aux mêmes coordonnées x,y. Si la profondeur du pixel est supérieure à celle de la shadowmap au même endroit, alors le pixel est situé derrière la surface visible, donc est dans l'ombre. Sinon, il n'est pas dans l'ombre. Le même procédé est répété sur chaque pixel de l'écran. ===Les optimisations hardware du ''shadowmapping''=== La technique des ''shadowmap'' demande donc de calculer une texture ''shadowmap'', puis de lire celle-ci et de faire des comparaisons de profondeur. Les GPU comme la Geforce FX intégraient du matériel dans les unités de texture pour faciliter ce travail. Les unités de texture pouvaient lire les ''shadowmap'', et faire la comparaison de profondeur toutes seules, elles avaient des circuits pour. Il suffisait de leur fournir le pixel à tester, ses coordonnées x,y,z, et l'adresse de la ''shadowmap''. Les unités de texture renvoyaient alors un résultat valant 0 ou 1 : 1 si le pixel est dans l'ombre, 0 sinon. Elles pouvaient même effectuer du filtrage de texture sur les ''shadowmap''. Mais le filtrage était différent de celui utilisé sur les autres textures : moyenner des valeurs de profondeur ne marche pas bien. Elles utilisaient des techniques de filtrage différentes : elles faisaient les tests de comparaison, puis faisaient la moyenne des résultats. Ainsi, pour du filtrage bilinéaire, elles lisaient 4 texels dans la ''shadowmap'', puis faisaient 4 tests de comparaison, et moyennaient les 4 résultats. ==Annexe : le cube-mapping== [[File:Cube mapped reflection example 2.JPG|vignette|Exemple de reflets environnementaux.]] L''''environnement-mapping''' simule les réflexions et autres effets graphiques sur une surface ou un objet 3D. L'idée est de plaquer une texture pré-calculée pour simuler l'effet de l'environnement sur un modèle 3D. Il en existe plusieurs versions différentes, mais la seule utilisée de nos jours est le ''cube-mapping'', où la texture de l'environnement est plaquée sur un cube, d'où son nom. Le cube en question est utilisé différemment suivant ce que l'on cherche à faire avec le ''cube-mapping''. ===Les utilisations du ''cubemapping''=== Les deux utilisations principales sont le rendu du ciel et des décors, et les réflexions sur la surface des objets. Dans les deux cas, l'idée est de précalculer ce que l'on voit du point de vue de la caméra. On place la caméra dans la scène 3D, on place un cube centré sur la caméra, le cube est texturé avec ce que l'on voit de l'environnement depuis la caméra/l'objet de son point de vue. [[File:Panorama cube map.png|centre|vignette|upright=2|L'illustration montre en premier lieu une ''cubemap'' avec les six faces mises en évidence, puis quel environnement 3D elle permet de simuler, le troisième illustration montrant comment la ''cubemap'' est utilisée pour simuler l'environnement.]] Le rendu du ciel et des décors lointains dans les jeux vidéo se base sur des '''''skybox''''', à savoir un cube centré sur la caméra, sur lequel on ajoute des textures de ciel ou de décors lointains. Le cube est recouvert par une texture, qui correspond à ce que l'on voit quand on dirige le regard de la caméra vers cette face. Contrairement à ce qu'on pourrait croire, la skybox n'est pas les limites de la scène 3D, les limites du niveau d'un jeu vidéo ou quoique ce soit d'autre de lié à la physique de la scène 3D. La skybox est centrée sur la caméra, elle suit la caméra dans son mouvement. Centrer la skybox sur la caméra permet de simuler des décors très lointains, suffisamment lointain pour qu'on n'ait pas l'illusion de s'en rapprocher en se déplaçant dans la map. De plus, cela évite d'avoir à faire trop de calculs à chaque fois que l'on bouge la caméra. La texture plaquée sur le cube est une texture unique, elle-même découpée en six sous-textures, une par face du cube. [[File:Skybox example.png|centre|vignette|upright=2|Exemple de Skybox.]] [[File:Cube mapped reflection example.jpg|vignette|Réflexions calculées par une ''cubemap''.]] Le ''cube-mapping'' est aussi utilisé pour des reflets. L'idée est de simuler les reflets en plaquant une texture pré-calculée sur l'objet réflecteur. La texture pré-calculée est un dessin de l'environnement qui se reflète sur l'objet, un dessin du reflet à afficher. En la plaquant la texture sur l'objet, on simule ainsi des reflets de l'environnement, mais on ne peut pas calculer d'autres reflets comme les reflets objets mobiles comme les personnages. Et il se trouve que la texture pré-calculée est une ''cubemap''. Pour les environnements ouverts, c'est la ''skybox'' qui est utilisée, ce qui permet de simuler les reflets dans les flaques d'eau ou dans des lacs/océans/autres. Pour les environnements intérieurs, c'est une cubemap spécifique qui utilisée. Par exemple, pour l'intérieur d'une maison, on a une ''cubemap'' par pièce de la maison. Les reflets se calculent en précisant quelle ''cubemap'' appliquer sur l'objet en fonction de la direction du regard. [[File:Cube map level.png|centre|vignette|Cube map de l'intérieur d'une pièce d'un niveau de jeux vidéo.]] ===L'implémentation matérielle du ''cubemapping''=== Toujours est-il que les textures utilisées pour le ''cubemapping'', appelées des ''cubemaps'', sont en réalité la concaténation de six textures différentes. En mémoire vidéo, la ''cubemap'' est stockée comme six textures les unes à la suite des autres. Lors du rendu, on doit préciser quelle face du cube utiliser, ce qui fait 6 possibilités. On a le même problème qu'avec les niveaux de détail, sauf que ce sont les faces d'une ''cubemap'' qui remplacent les textures de niveaux de détails. L'accès en mémoire doit donc préciser quelle portion de la ''cubemap'' il faut accéder. Et l'accès mémoire se complexifie donc. Surtout que l'accès en question varie beaucoup suivant l'API graphique utilisée, et donc suivant la carte graphique. Le support des ''cubemaps'' dépend de l'API 3D, et surtout de si elle date ou si elle est récente : * Les API 3D très anciennes ne gérent pas nativement les ''cubemaps'', qui doivent être émulées en logiciel en utilisant six textures différentes. Le pixel shader décide donc quelle ''cubemap'' utiliser, avec quelques calculs sur la direction du regard. * Les API 3D récentes gèrent nativement les ''cubemaps''. Pour les versions les plus vielles de ces API, les six faces sont numérotées et l'accès à une ''cubemap'' précise quel face utiliser en donnant son numéro. La carte graphique choisit alors automatiquement la bonne texture. Mais cela demande de laisser le calcul de la bonne face au pixel shader. * Dans les API 3D modenres, les ''cubemap'' sont gérées comme des textures en trois dimensions, adressées avec trois coordonnées u,v,w. La carte graphique utilise ces trois coordonnées de manière à en déduire quelle est la face pertinente, mais aussi les coordonnées u,v dans la texture de la face. ==Annexe : les textures virtuelles== Les '''textures virtuelles''' sont une optimisation des textures normales, qui visent à accélérer le rendu de terrains de grande taille. Imaginez par exemple un monde assez ouvert, comme un environnement en forêt ou en montagne, avec une grande distance de visibilité. Avec de tels terrains, le "sol" est recouvert par une texture de sol unique qui recouvre tout le terrain. Elle ne se répète pas, est de très grande taille, et peut parfois recouvrir toute la map ! Mais il n'y a pas assez de mémoire vidéo pour mémoriser la texture toute entière. La seule solution est la suivante : une partie de la texture est placée en mémoire vidéo, le reste est soit placé en mémoire RAM ou sur le disque dur. Pour cela, le moteur de jeu utilise une optimisation ingénieuse, basée sur une observation assez basique : une bonne partie de la texture est visible, mais le reste est caché par des arbres, des habitations ou d'autres obstacles. Une optimisation possible de ne garder en mémoire vidéo que les portions visibles de la texture, pas les portions cachées. Une autre optimisation mélange textures virtuelles et ''mip-mapping''. L'idée est que pour les portions lointaines d'une texture, la texture utilisée est une ''mip-map'' de basse résolution. L'idée est alors de ne charger que la ''mip-map'' adéquate, pas les autres niveaux de détail. En clair, la texture de base n'est pas chargée en mémoire vidéo, mais la ''mip-map'' basse résolution l'est. ===Une texture à deux niveaux=== L'implémentation des textures virtuelles découpe les méga-textures en ''tiles'', en morceaux rectangulaires de taille modeste. En clair, le terrain est découpé en morceau rectangulaires/carrés. Seules les tiles nécessaires sont chargées en mémoire vidéo, pas les autres. Par exemple, les ''tiles'' non-visibles ne sont pas placées en mémoire vidéo, seules les ''tiles'' visibles le sont. De même, il y a une ''tile'' par niveau de mip-map : seul la tile correspondant le niveau adéquat est en mémoire vidéo, les autres niveaux de détail ne sont pas chargés. On peut faire une analogie avec la mémoire virtuelle, où les données sont découpées en pages, qui sont chargées en mémoire RAM à la demande, suivant les besoins, les données pouvant être swappées sur le disque dur si elles sont peu utilisées. Sauf qu'ici, il s'agit de textures qui sont découpées en pages chargées à la demande en mémoire vidéo, depuis la RAM système. Une texture virtuelle est en réalité un système à deux niveaux : une liste de ''tiles'' et les ''tiles'' elles-mêmes. La liste de ''tiles'' est appelée un '''atlas de texture''', c'est un peu l'équivalent de la ''tilemap'' pour le rendu 2D. Rendre une texture demande de calculer quelle ''tile'' contient le texel à afficher, consulter la ''tile'' en question, puis récupérer le texel adéquat dans cette ''tile''. La ''tile'' est donc une texture, mais la texture à charger est choisie parmi un ensemble, qui est ici l'atlas de texture. ===L'implémentation : logicielle versus matérielle=== Les textures virtuelles ont été utilisées pour la première fois par les jeux Rage 1 et 2 d'IdSoftware, et quelques jeux ultérieurs comme DOOM 2016. IdSoftware les appelait des '''''mega-textures'''''. L'optimisation permettait des gains en performance assez impressionnants. Le jeu Rage 1 utilisait une texture carrée unique de 128k pixels de côté pour rendre le terrain. En théorie, une telle texture devrait prendre 64 giga-octets, mais le jeu tournait correctement avec 512 méga-octets de RAM, poussivement avec seulement 256 méga-octets de RAM. De nos jours, les textures virtuelles sont supportées par beaucoup de jeux vidéos, les moteurs les plus courants gèrent de telles textures de manière logicielles. Mais quelques GPU récents supportent les textures virtuelles. Sur les GPU récents, l'atlas de texture est géré nativement par le matériel. Le GPU choisit quelle ''tile'', quelle texture choisir pour rendre le texel adéquat. Pour cela, le GPU calcule quelle ''tile'' charger, consulte l'atlas de texture, et lit la texture de ''tile'' adéquate. Mais l'implémentation sur les GPU récents a de nombreuses limitations. La limitation la plus importante est que la taille des textures virtuelles ne peut pas dépasser la taille d'une texture normale, soit 32768 pixels de côté pour une texture carrée environ sur les GPU de 2020. De plus, le chargement d'une ''tile'' est très lent. En clair, dès qu'on veut changer de niveau de mip-map pour une tile, ou dès qu'une tile devient visible, le chargement de la tile peut facilement prendre plusieurs centaines de millisecondes. Le filtrage de texture est très complexe avec des textures virtuelles, ce qui fait que le filtrage de texture virtuelle est souvent soumis à des limitations que les textures normales n'ont pas, notamment pour le filtrage anisotropique. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le rasterizeur | prevText=Le rasterizeur | next=Les Render Output Target | nextText=Les Render Output Target }}{{autocat}} </noinclude> bl7d40zc8dxape19ghbkieqogqj6ckp Les cartes graphiques/Le Video Display Controler 0 67397 764859 762333 2026-04-24T17:39:50Z Mewtow 31375 /* La génération des raster interrupts et des bits de blanking */ 764859 wikitext text/x-wiki Dans les années 70-80, un système vidéo pouvait être fabriqué de deux grandes manières différentes. La première concevait la carte d'affichage à partir de composants très simples, comme des portes logiques ou des transistors, à partir de zéro, sans réutiliser de matériel existant. De telles cartes vidéos avaient des performances et des fonctionnalités très variables, mais étaient très complexes à concevoir et coutaient cher. La seconde catégorie utilisait des '''''Video Display Controler ''''' (VDC), des circuits déjà tout près, placés dans un boitier, produits en masse, qu'il suffisait de compléter avec une mémoire vidéo et quelques autres circuits pour obtenir un système vidéo. De tels circuits permettaient d'obtenir des performances décentes, voire très bonnes, pour un prix nettement inférieur. Les deux fonctionnent de la même manière, peu importe qu'il s'agisse d'un VDC ou d'un circuit fait main. Les deux contiennent globalement les mêmes circuits, ils fonctionnent de la même manière. Dans le chapitre sur les cartes d'affichage, nous avons vu qu'une carte d'affichage contient trois à quatre circuits distincts : un ''framebuffer'', un circuit de contrôle, le circuit d’interfaçage électrique avec l'écran (le RAMDAC) et éventuellement une connexion avec le bus. Le VDC correspond au circuit de contrôle. Les fonctionnalités d'un VDC sont très variables. Ils s'occupent des choses de base, comme gérer la résolution, l'envoi de l'image à afficher à l'écran, ce genre de choses. Il ne s'occupe pas de la transmission avec le bus, il ne gère pas vraiment l’interfaçage électrique. [[File:Architecture d'une carte d'affichage avec VDC.png|centre|vignette|upright=1.5|Architecture d'une carte d'affichage avec VDC]] Si la plupart des VDC communiquent avec la mémoire vidéo, il existe quelques exceptions qui se débrouillent sans mémoire vidéo, comme les ''Video shifters'' dont nous parlerons dans quelques chapitres. La meilleure manière d'aborder les VDC est de d'abord les voir comme des espèces de boite noire, dont on ne se préoccupe pas du contenu en premier lieu. Un VDC communique avec l'écran, le processeur et avec la mémoire vidéo. Dans ce chapitre, nous allons voir comment il communique avec l'écran et le processeur. Nous laissons de côté l'interface avec la mémoire vidéo, car elle dépend du VDC et n'est pas la même selon que la carte d'affichage utilise ou non un ''framebuffer''. Le tout est illustré ci-dessous. L'interface VDC-écran correspond aux flèches en rouge et sera vue dans la première section. L'interface VDC-processeur correspond aux flèches en bleu et est le sujet de la seconde section. Enfin, l'interface entre mémoire vidéo et processeur correspond aux flèches en vert. En soi, elle n'est pas liée directement au VDC, mais nous allons quand même la voir dans ce chapitre. [[File:Interface VDC.png|centre|vignette|upright=2|Interface d'un VDC.]] ==L'interface du VDC avec l'écran== [[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]] Un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Les écrans LCD sont bel et bien conçus comme cela, c'est plus compliqué sur les écrans CRT, mais cela ne change rien du point de vue de la carte graphique. Chaque pixel est localisé sur l'écran par deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. ===Le balayage progressif et l'entrelacement=== L'écran peut afficher une image en utilisant deux modes principaux : le balayage progressif, et le balayage entrelacé. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. Le balayage progressif est utilisé sur tous les écrans LCD moderne, mais il était plus adapté aux écrans CRT. Sur les écrans plats, l'image est transmise à l'écran, mais est affichée une fois qu'elle est intégralement reçue, d'un seul coup. Mais sur les anciens écrans de télévision, les choses étaient différentes. Les vieux écrans CRT fonctionnaient sur ce principe : un canon à électrons balayait l'écran en commençant en haut à gauche, et balayait l'écran ligne par ligne. Ce ''scan progressif'' de l'image faisait apparaître l'image progressivement et profitait de la persistance rétinienne pour former une image fixe. L'image était donc affichée en même temps qu'elle était envoyée et le scan progressif correspondait à l'ordre d'allumage des pixels à l'écran. [[File:CRT color.png|centre|vignette|upright=2|Intérieur d'un écran CRT. En 1, on voit le canon à électron. En 2, on voit le faisceau d'électron associé à chaque couleur. En 3, les faisceaux d'électrons sont déviés par des électroaimants, pour atterrir sur le pixel à éclairer. En 4, le faisceau d'électrons frappe la surface de l'écran, composée de phosphore, qui s'illumine alors. En 5, on voit que les trois faisceaux ne frappent exactement au même endroit : l'un frappe sur une zone colorée en bleu, l'autre sur du vert, l'autre sur du rouge. Les trois zones combinées affichent une couleur par mélange du rouge, du vert et du bleu. Ne vous trompez pas : le faisceau d'électron n'a pas de couleur, comme indiqué sur le schéma, la couleur a été ajoutée pour faire comprendre qu'un faisceau est dirigé sur les pixels rouges, un autre sur les pixels bleus, et l'autre sur les pixels verts.]] [[File:CRT image creation animation.gif|vignette|upright=0.5|Illustration de l'entrelacement.]] La technique du balayage progressif n'avait pas de défauts particuliers, ce qui fait que tous les écrans d’ordinateurs CRT l'utilisait. Mais les télévisions de l'époque utilisaient une méthode différente, appelée l''''entrelacement'''. Avec elle, l'écran faisait un scan pour les lignes paires, suivi par un scan pour les lignes impaires. Le tout est illustré dans l'animation ci-contre. [[File:Interlace zoom.gif|vignette|Illustration de l'entrelacement et de ses effets sur la perception.]] L'entrelacement donne l'illusion de doubler la fréquence d'affichage, ce qui est très utile sur les écrans à faible fréquence de rafraîchissement. Pour comprendre pourquoi, il faut comparer ce qui se passe entre un écran à scan progressif non-entrelacé et un écran entrelacé. Avec l'écran non-entrelacé, l'image met un certain temps à s'afficher, qui correspond au temps que met le canon à électron à balayer la totalité de l'écran, ligne par ligne. Avec l'entrelacement, le temps mis pour balayer l'écran est le même, car le nombre de lignes à balayer reste le même, seul l'ordre change. Sur l'écran entrelacé, l'image s'affiche à moitié une première fois (sur les lignes paires) avant que l'image complète s'affiche. La moitié d'image affichée par l'écran entrelacé a une résolution suffisante pour que le cerveau humain soit trompé et perçoive une image presque complète. En clair, le cerveau verra deux images par balayage complet : une image partielle lors du balayage des lignes paires et une image complète lors du balayage des lignes impaires. Sans entrelacement, le cerveau ne verra qu'une seule image lors de chaque balayage complet. L'effet est d'autant plus important que la résolution verticale (le nombre de lignes) est important. De plus, l'effet est encore plus important si l'ordinateur calcule un grand nombre d'images par secondes. Par exemple, pour un écran avec une fréquence de rafraîchissement de 60 Hz et un jeu vidéo qui tourne deux fois plus vite (à 120 images par secondes, donc), l'image sur les lignes impaires sera plus récente que celle sur les lignes paires. Le cerveau humain sera sensible à cela et verra une image plus fluide (bien qu'imparfaitement fluide). Le nombre de lignes est toujours impair (normes analogiques : 625 en Europe, 525 en Amérique), ce qui fait un nombre non entier de lignes pour chacune des 2 trames (impaires et paires). Par exemple, pour 625 lignes cela fait {{formatnum:312.5}} lignes par trame. Le balayage vertical étant progressif durant le balayage horizontal, les lignes sont imperceptiblement penchées. À la fin du balayage d'une trame, le rayon se retrouve au milieu de la ligne horizontale, soit un décalage vertical d'une demie-ligne (voir image ci-dessous). [[Fichier:Balayage entrelace affichage trames.svg|center|500px|class=transparent|Entrelacement sur tube cathodique.]] ===La fréquence de rafraichissement=== Même si cela commence à changer de nos jours, l'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de '''fréquence de rafraîchissement'''. Pour un écran avec une fréquence de rafraîchissement de 60 Hz (60 images par secondes), la carte graphique doit envoyer une nouvelle image tous les (1 seconde / 60) = 16,666... millisecondes. Sur les écrans LCD, la fréquence de rafraîchissement ne dépend pas de la résolution utilisée, en raison de différences de technologie. Sur les anciens écrans CRT, la fréquence de rafraîchissement dépendait de la résolution utilisée, et la carte d'affichage devait alors gérer le couple résolution-fréquence elle-même et la gestion de la fréquence de rafraîchissement était donc plus compliquée. Depuis environ 2016, quelques écrans supportent une '''fréquence de rafraichissement variable'''. Variable dans le sens : peut varier entre une fréquence minimale et une fréquence maximale selon les besoins. L'écran reçoit des images de part de la carte graphique, et les affiche immédiatement, sans attendre un signal de synchronisation vertical de fréquence fixe. Tant que la carte d'affichage ne va pas trop vite, l'écran suit, il affiche les images dès qu'il les reçoit. Par contre, au-delà d'un certain flux d'image, il bloque à une fréquence de rafraichissement maximale. Les bénéfices d'une fréquence de rafraichissement variable sont nombreux. Déjà, le temps de latence est réduit, l'''input lag'' si cher aux joueurs compétitifs est réduit de quelques millisecondes. De plus, la qualité d'image est améliorée du fait de l'absence de ''screen tearing'' sur lequel on reviendra plus tard. ===La gestion des timings pour la communication avec l'écran=== Le câble qui relie la carte graphique à l'écran transmet au mieux un seul pixel à la fois, voire un seul bit à la fois. On ne peut pas envoyer l'image d'un seul coup à l'écran, et on doit l'envoyer pixel par pixel. L'écran traite alors ce flux de pixels de deux manières différentes. Dans le cas des écrans LCD, le plus intuitif, l'écran accumule les pixels reçus dans une mémoire tampon et affiche l'image une fois qu'elle est totalement reçue. Pour les écrans CRT, l'écran affiche les pixels reçus immédiatement dès leur réception sur l'entrée. Dans les deux cas, il faut envoyer les pixels dans un certain ordre bien précis. Un point important est que la carte graphique ne peut pas envoyer un flux de pixels n'importe quand et doit respecter des timings bien précis. Le flux de pixel envoyé à l'écran est souvent structuré d'une certaine manière, avec des temps de pause, un temps de maintien minimum pour chaque pixel, etc. Déjà, il faut tenir compte des timings liés à la transmission de l'image elle-même. La carte graphique doit envoyer les pixels avec des timings tout aussi stricts, qui dépendent du standard vidéo utilisé. Chaque pixel doit être maintenu durant un certain temps bien précis, il y a un certain temps entre la transmission de deux pixels, etc. Et le circuit d’interfaçage doit gérer le '''temps de transmission d'un pixel'''. Pour cela, le VDC envoie un signal d'horloge dont la période correspond au temps de transmission/affichage d'un pixel. En, clair, le VDC envoie un pixel à chaque cycle d'horloge. Ensuite, il faut prévenir l'écran qu'on a fini de transmettre une image avec un '''signal de synchronisation verticale''', qui indiquait à l'écran qu'une image entière vient d'être transmise. Le VDC transmet l'image pixel par pixel, et lève ce signal de synchronisation verticale une fois l'image intégralement transmise. Ce signal était transmis sur un fil spécialisé, qu'on trouve sur la plupart des connecteurs VGA. De nos jours, sur les standards HDMI, DisplayPort, et autres, les choses sont plus compliquées, mais ce signal est quand même transmis, bien que pas forcément sur un fil spécialisé. Enfin, il faut aussi tenir compte d'autres timings pour gérer la résolution. Les pixels sont envoyés ligne par ligne, mais une ligne de pixel n'a pas la même taille suivant la résolution : 640 pixels pour du 640 × 480, 1280 pour du 1280 × 1024, etc. La carte graphique doit donc indiquer quand commencent et se terminent chaque ligne dans le flux de pixels. Sans cela, on ne pourrait pas gérer des résolutions différentes. Pour cela, le VDC envoie un '''signal de synchronisation horizontale''' une fois qu'il a fini d'envoyer une ligne. En tout, cela fait au minimum trois signaux : une horloge pour la transmission des pixels, un signal de synchronisation verticale, et un signal de synchronisation horizontale. Sans cela, impossible d'envoyer des pixels à l'écran ou de gérer la résolution convenablement. Et il y a d'autres contraintes de timings dont nous parlerons plus bas, qui ne sont pas évidentes pour le moment. Par exemple, sur les écrans CRT, il y a un temps de latence à la fin d'une ligne pour que le canon à électron se déplace sur le début de la ligne suivante. Et cela impose de ne pas démarrer l'envoie de la ligne suivante avant un certain temps. Cela il n'existe plus sur les écrans LCD, mais il fallait le prendre en compte à l'époque. ===L'exemple du standard VGA=== Un bon exemple est le standard VGA, qui était le seul utilisé pour connecter les écrans CRT, mais qui est encore utilisé de nos jours sur les écrans LCD. Avec ce standard, le connecteur contenait trois fils R, G, et B pour envoyer la couleur, codée en analogique. Il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. Jusque là, rien de surprenant, c'est une redite de ce qu'on a dit plus haut. On trouve aussi plusieurs fils pour la masse, à savoir le 0 Volt, ainsi qu'une tension d'alimentation. Il y a une masse générale, ainsi que plusieurs masses, une par signal RGB. Et enfin, il faut citer la connexion DDE/DDC qui permet de communiquer des informations de configuration à l'écran. Quand vous branchez l'écran à une carte graphique, celle-ci communique avec l'écran pour savoir quelles sont les résolutions supportées, quelle fréquence de rafraichissement est supporté, si l'écran supporte des couleurs 32 bits, etc. Sans cela, impossible de configurer la résolution. Pour cela, l'écran contient une petite mémoire ROM, dont le contenu est standardisé, qui contient toutes les informations nécessaires pour configurer l'écran.LA carte graphique lit cette ROM en passant par un bus appelé le bus '''''Display Data Channel''''', qui permet à la carte graphique de lire cette ROM, d'interroger l'écran sur les résolutions et fonctionnalités supportées. Le bus est un dérivé du bus I²c, et a trois fils dédiés : un pour l'horloge, l'autre pour la transmission des données, et une masse dédiée. [[File:EMacVGA.png|centre|vignette|upright=2|Connecteurs VGA]] Les premières subtilités du standard VGA viennent des timings des signaux HSYCN et VSYNC. Le signal HSYNC n'est pas envoyé dès la fin de la ligne : il y a un temps d'attente de quelques microsecondes entre la fin de la ligne et l'envoie du signal HSYNC. Le signal HSYNC est maintenu durant quelques microsecondes, la durée d'envoi est fixe. Puis, on a encore un nouveau temps d'attente avant l'envoi de la prochaine ligne, durant lequel le signal HSYNC n'est pas envoyé. Durant ces trois périodes (deux temps d'attentes, envoi de HSYNC), aucun pixel n'est envoyé à l'écran. [[File:VGA 640×480 horizontal timings.svg|centre|vignette|upright=2|VGA 640×480 horizontal timings. Les durées vertes et jaunes sont des temps d'attentes où rien n'est envoyé sur le connecteur, rouge correspond à l'envoi du signal HSYCN, bleu est l'envoi de la ligne.]] Et il y a la même chose avec les signaux VSYNC, même si les timings sont différents. On devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] ==L'interface entre le processeur et le VDC== Pour le processeur, le VDC a une interface similaire à celle de n'importe quel périphérique : un paquet de registres, et éventuellement de la RAM. La mémoire vidéo peut être intégrée dans le VDP ou être séparée, les deux sont possibles. Mais nous allons partir du principe que la mémoire vidéo est séparée. Dans cette section, nous allons voir ce qui a trait aux échanges entre CPU et VDC proprement dit, la communication VDC-VRAM sera le sujet d'une section ultérieure. ===L'interface entre processeur et mémoire vidéo=== La mémoire vidéo est généralement visible par le processeur, à savoir qu'il peut lire ou écrire dedans. Il existe plusieurs méthodes pour cela, mais celle utilisée sur le hardware ancien est celle des '''entrée-sorties mappées en mémoire''', que vous connaissez sans doute si vous avez déjà lu un cours d'architecture des ordinateurs. L'idée est que le processeur utilise la même interface pour la mémoire RAM et les périphériques. Des adresses mémoire sont détournées : elles ne pointent plus vers la mémoire RAM, mais vers la mémoire vidéo, la mémoire de la carte son, etc. Le processeur peut donc lire ou écrire directement dans la mémoire vidéo. Des circuits sur la carte mère s'occupent de ce détournement. Toute lecture ou écriture dans une adresse détournée est interceptée par la carte mère et redirigée vers le bus adéquat. [[File:Espace d'adressage classique avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2|Espace d'adressage classique avec entrées-sorties mappées en mémoire]] ===Les registres de configuration du VDC=== La programmation d'un VDC se fait par en configurant des '''registres de configuration''', qui permettent de configurer la résolution, la fréquence d’affichage, la position du curseur de souris, etc. Le processeur a juste à écrire dans ces registres, pour configurer la carte d'affichage comme souhaité. Le VDC incorpore presque toujours un '''registre d'état''', ou un '''registre de statut''' qui permet au processeur de connaitre l'état du VDC. Il permet de savoir si le VDC est libre, s'il est en train d'afficher une ligne, si une erreur a eu lieu et laquelle. Chaque bit du registre de statut a une interprétation fixée à l'avance et fournit une information précise. Le processeur a juste à lire le registre en question, pour vérifier l'état de la carte graphique. Plusieurs bits du registre de statut sont réservés au traitement des erreurs. Si le VDC rencontre une erreur, il met une valeur bien précise dans ces bits, appelée le '''code d'erreur'''. Typiquement, la valeur 0 indique qu'il n'y a pas d'erreur, les autres valeurs précisent une erreur. Le code d'erreur dépend de l'erreur en question et du VDC, il n'y a pas de standard pour ça. En général, les registres de configuration sont accessibles directement par le processeur, comme l'est la mémoire vidéo. Des adresses mémoire sont détournées pour pointer, non pas vers la mémoire RAM, mais vers les registres de configuration. Dans le cas le plus simple, il y a une adresse mémoire par registre, le processeur a juste à écrire dans cette adresse pour configurer le registre. Cependant, cette méthode ne marche pas trop bien s'il y a trop de registres de configuration. Par exemple, les cartes graphiques VGA intègrent plus de 300 registres de configuration, chacun faisant plusieurs octets. Il faudrait alors détourner presque un kilo-octet de mémoire, ce qui est un peu beaucoup. Pour éviter cela, les registres ne sont pas mappés directement en mémoire RAM, mais passent par un intermédiaire. L'adressage des registres de configuration se fait via une adresse unique, partagée entre tous les registres de configuration. Toute écriture ou lecture dans cette adresse est redirigée vers le bon registre, grâce à un mécanisme d'indicage qu'on va détailler immédiatement. Les registres de configuration sont numérotés, afin de pouvoir les adresser. Le numéro en question est appelé un '''indice de registre'''. La configuration d'un registre se fait en deux temps : le processeur écrit le numéro du registre à configurer, puis la donnée à écrire. La carte graphique reçoit ces deux informations l'une après l'autre, et les utilise pour configurer le registre elle-même. Un défaut de cette approche est que configurer le VDC demande deux instructions : une pour écrire l'indice/numéro, une autre pour écrire la donnée. C'est deux fois plus que si on avait des registres de configuration mappés en mémoire. Par contre, le tout est beaucoup plus économe en adresses mémoire détournées. Pour donner un exemple réel, prenons les cartes graphiques qui respectent le standard VGA. Une carte VGA contient plusieurs centaines de registres. Heureusement, ils ne sont pas tous mappés en mémoire, le mécanisme décrit précédemment est utilisé en lieu et place. Pour configurer la carte VGA, le processeur envoie l'indice de registre, puis la donnée. La carte VGA récupère ces deux informations, détermine quel registre de configuration est concerné grâce à l'indice, puis effectue l'écriture de la donnée. L'écriture de l'indice et de la donnée se fait grâce à deux registres séparés : un registre d'indice et un registre de données. Les deux sont mappés en mémoire RAM. La description faite est cependant approximative. En réalité, une carte VGA dispose de 4 paires de registres, chaque paire contenant un registre d'indice et un registre de données. La raison est que le standard VGA est le successeur du standard EGA, avec lequel il maintient une certaine compatibilité descendante. Or, une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : un CRTC, un RAMDAC, un ''Sequence Controller'' (SC) et un ''Graphics Controller'' (GC). Le VGA reprend cette séparation pour les registres de configuration. Il y avait donc une séparation logique entre les registres du RAMDAC, ceux du CRTC, et des deux autres circuits. Les registres du RAMDAC avait droit à une paire de registres, avec un registre d'indice et un registre pour les transferts de données, idem pour les registres du CRTC, etc. Au-delà de ça, le standard VGA impose la présence de deux registres de status, d'un registre de sortie sur lequel le processeur peut lire une donnée, et de quelques registres annexes. Après, la carte VGA pouvait intégrer tous ces registres dans un VDC unique, et beaucoup de cartes VGA ne se gênaient pas. ==La synchronisation entre CPU et VDC pour l'accès à la RAM vidéo== Un point qui va nous intéresser dans ce qui suit est la gestion des accès mémoire. Aussi bien le processeur que le VDC accèdent à la mémoire vidéo. Et ils ne faut pas qu'ils se marchent sur les pieds. Et pour cela, divers mécanismes sont implémentés. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Par double port, on veut dire qu'elles avaient deux entrée-sorties sur lesquelles on pouvait lire ou écrire leur contenu simultanément. Le premier port était connecté au processeur, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à afficher, alors que le second port était utilisé pour envoyer l'image à l'écran. Le port CPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires dont le support de stockage était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un registre capable de stocker une ligne entière. Le registre en question était un registre à décalage, à savoir un registre dont le contenu est décalé d'un rang à chaque cycle d'horloge. Le bit sortant est récupéré sur une sortie du registre, sortie qui était directement connectée au port CRT. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Le multiplexage temporel des accès mémoire=== Les mémoires double port n'étaient pas si rares, mais elles n'étaient pas la solution la plus utilisée. La majorité des micro-ordinateurs et consoles utilisaient une VRAM normale, simple port, bien plus courante et bien moins chère. Le processeur et le VDC sont alors tous deux connectés à VRAM, via un bus partagé, qui sera nommé le '''bus VRAM''' dans ce qui suit. Le processeur et le VDC ne peuvent pas accéder en même temps à la mémoire vidéo, ils doivent y accéder à tour de rôle. Et pour cela, divers mécanismes sont implémentés. La plupart du temps, le processeur n'accède pas à la VRAM, ce qui la laisse libre pour le VDC. Mais quand le processeur veut écrire dans la VRAM, il arrive que le processeur et le VDC se marchent sur les pieds, à savoir qu'ils veulent accéder à la VRAM en même temps. Pour gérer la situation, la VRAM utilise des mécanismes d'arbitrage, gérés par un circuit d'arbitrage dédié, qui gère les transferts sur le bus VRAM. La carte d'affichage et la mémoire envoient des demandes d'accès mémoire sur le bus, et elles sont ou non acceptées selon l'état de la VRAM. La solution la plus simple à implémenter donnait la priorité absolue au processeur sur le VDC. Dès que le processeur écrit dans la mémoire vidéo, celle-ci est indisponible pour le VDC. Des circuits annexes garantissent que c'est le cas. Le micro-ordinateur TRS-80 faisait ainsi. Un défaut de cette méthode est qu'elle cause des artefacts graphiques à l'écran si le processeur écrit dans la mémoire vidéo au mauvais moment. Si le processeur écrit en VRAM pendant l'affichage d'une image, les pixels ne sont pas affichés. Des écritures processeur trop longues peuvent causer des lignes noires à l'écran. Une autre solution donne la priorité au VDC. Pour cela, plusieurs méthodes sont utilisées : l'arbitrage, le ''pooling'' et les interruptions. La première réutilise le circuit d'arbitrage mentionné plus haut, qui gère les accès simultanés, sauf qu'il donne la priorité au VDC sur le processeur. Quand le VDC lit des pixels à afficher dans la VRAM, le processeur ne peut pas écrire en VRAM, il doit attendre que le VDC libère la RAM vidéo. Si le VDC démarre une lecture, alors que le processeur accédait déjà à la VRAM, le processeur perd la main et la VRAM est réservée au VDC. L'avantage est que les artefacts graphiques de la technique précédente disparaissent. Le désavantage est que la technique demande d'utiliser plus de circuits, elle a un cout en transistors un peu plus important. Ajouter des circuits d'arbitrage est une solution bien maitrisée. Après tout, la plupart des bus disposent de mécanismes d'arbitrage, pour éviter que les composants branchés dessus se marchent sur les pieds. Mais les bus VRAM ne sont pas dans ce cas. La raison est que la mémoire vidéo est partagée entre un processeur et un VDC, ce qui n'est pas beaucoup. Si le bus VRAM était partagé avec une dizaine de composants, ça vaudrait la peine d'ajouter un circuit d'arbitrage. Mais pour seulement deux composants, le cout en circuit est trop important. Le '''''pooling''''' est une solution alternative qui ne requiert pas l'ajout de circuits d'arbitrage. A la place, elle utilise le registre d'état du VDC. L'idée est que le registre de statut du VDC indique si celui-ci accède à la mémoire vidéo. Plus précisément, il contient un bit qui précise que l'écran est en train d'afficher une ligne. Il est appelé le '''bit de ''blanking'' horizontal'''. En général, ce bit est à 0 quand le VDC est en train de transmettre une ligne à l'écran, à 1 quand la mémoire vidéo est libre. Avant d’accéder à la mémoire vidéo, le processeur vérifie ce registre pour savoir si la mémoire vidéo est occupée ou non. Si c'est le cas, le processeur attend que la mémoire vidéo soit libre. Sinon, le processeur accéde à la mémoire vidéo. : Notons que ce signal n'est pas équivalent au signal HSYNC. Pour reprendre l'exemple du standard VGA, il y a deux temps d'attente avant et après l'envoi du signal HSYNC, où l'écran n'envoie pas de données. Le signal HSYNC est alors à 0, alors que le bit de ''blanking'' est bien à 1. ===La synchronisation CPU-VDC via ''raster interrupts''=== L'usage d'un bit de ''blanking'' permet au VDC de prévenir le processeur qu'il ne peut pas écrire en RAM vidéo. Mais les VDC de ce type sont assez rudimentaires. Une autre solution part du principe que l'affichage d'une image se fait à fréquence régulière. La carte d'affichage accède à la mémoire vidéo durant un certain temps pour envoyer l'image à l'écran, mais la laisse libre le reste du temps. Par exemple, sur un écran à 60 Hz, une image est rendue toutes les 16.66666 millisecondes. Pendant ces 16.66666 millisecondes, la carte d'affichage accède à la RAM vidéo pendant 1 à 10 millisecondes, le reste du temps est laissé au processeur. De même, il y a un certain temps de libre entre l'affichage de deux lignes, le temps que le canon à électron du CRT se repositionne au début de la ligne suivante. Cela laissait un petit peu de temps au processeur pour changer la configuration de la carte graphique, par exemple pour changer la palette de couleur, changer des ''sprites'', écrire dans la mémoire vidéo, ou tout autre chose. Le tout est très utile pour rendre certains effets graphiques. Pour utiliser au mieux ces temps libres, le VDC utilise une technique appelée les interruptions matérielles. Pour rappel, les '''interruptions''' sont des fonctionnalités du processeur, qui interrompent temporairement l’exécution d'un programme pour réagir à un événement extérieur (matériel, erreur fatale d’exécution d'un programme…). Lors d'une interruption, le processeur suit la procédure suivante : * arrête l'exécution du programme en cours et sauvegarde l'état du processeur (registres et ''program counter'') ; * exécute un petit programme nommé '''routine d'interruption''' ; * restaure l'état du programme sauvegardé afin de reprendre l'exécution de son programme là ou il en était. [[File:Interruption processeur.png|centre|vignette|upright=2|Interruption processeur]] Les interruptions matérielles, aussi appelées '''IRQ''', sont des interruptions déclenchées par un périphérique et ce sont celles qui vont nous intéresser dans ce qui suit. Les IRQ qui nous intéressent sont générées par la carte graphique quand c'est nécessaire. Pour que la carte graphique puisse déclencher une interruption sur le processeur, on a juste besoin de la connecter à une entrée sur le processeur, appelée l''''entrée d'interruption''', souvent notée INTR ou INT. Lorsque la carte graphique envoie un 1 dessus, le processeur passe en mode interruption. : Si vous avez déjà lu un cours d'architecture des ordinateurs, vous savez sans doute que les choses sont assez compliquées, qu'un ordinateur moderne contient un contrôleur d'interruption pour gérer les interruptions de plusieurs périphériques, mais nous n'avons pas besoin de parler de tout cela ici. Nous avons juste besoin de voir le cas simple où la carte graphique est connectée directement sur le processeur. Les cartes graphiques d'antan géraient plusieurs types d'interruptions, qui sont regroupées sous le terme de '''''Raster Interrupt'''''. Grâce à ces interruptions, le processeur sait quand la mémoire vidéo est libre. La plus importante s'appelle la '''''Vertical blank interrupt''''' (VBI). Elle indique que la carte graphique a fini d'afficher une image et servait à implémenter la synchronisation verticale. La ''Vertical blank interrupt'' elle était parfois utilisée pour d'autres choses qui n'ont rien à voir avec l'écran ou le rôle d'une carte graphique. Par exemple, sur les anciens ordinateurs qui ne disposaient pas de ''timers'' sur la carte mère, la VBI était utilisée pour timer les échanges avec le clavier et la souris. A chaque VBI, la routine d'interruption vérifiait si le clavier ou la souris avaient envoyé quelque chose à l'ordinateur. Le VDC contient donc une sortie dédiée aux interruptions, connectée à l'entrée d'interruption du CPU (directement ou par l'intermédiaire d'un contrôleur d'interruption). Les signaux de ''raster interrupt'' ne sont pas identiques aux signaux de synchronisation verticale et horizontale, ni aux signaux de ''blanking'', même s'ils se ressemblent. La différence est que les signaux de synchronisation verticale/horizontale ont des contraintes de timing différents. Par exemple, le standard VGA impose que ces deux signaux soient maintenus durant un certain temps à l'écran, alors que les ''raster interrupts'' sont remises à zéro dès que le processeur est a pris en compte. L'usage de ''raster interrupts'' est très efficace, mais a pour défaut de beaucoup utiliser le processeur. Diverses optimisations permettent de se passer de ''raster interrupts'', ou du moins d'en réduire le cout en performance. Mais ces techniques demandent de modifier la mémoire vidéo, précisément la manière dont le processeur communique avec la mémoire vidéo. Nous allons voir ces techniques dans ce qui suit. ===Le ''cycle stealing'' et le ''cycle interleaving''=== Une solution alternative élimine totalement les ''raster interrupts'', le ''pooling'' ou toute technique d'arbitrage entre VDC et processeur. Elle fait en sorte que la moitié des cycles d'horloge de la mémoire soit réservé au processeur, l'autre à la carte d'affichage. En clair, on change d’utilisateur à chaque cycle : si un cycle est attribué au processeur, le suivant l'est à la carte d'affichage. L'implémentation utilise une mémoire qui va à une fréquence double de celle du processeur et de la carte d'affichage, les deux étant cadencés à la même fréquence. Les fréquences du CPU et de la carte d'affichage étaient décalées d'une moitié de cycle, ce qui fait que leurs cycles correspondaient à des cycles mémoire différents. Un exemple est celui du micro-ordinateur BBC Micro, qui avait une fréquence de 4 MHz avec un processeur à 2 MHz et une carte d'affichage de 2 MHz lui aussi. Elle était autrefois beaucoup utilisée avec les processeurs Motorola, comme le Motorola 6800 et le MOS 6502, car ils avaient des particularités qui rendaient cette technique facile à implémenter. La particularité principale était qu'ils accédaient à la mémoire lors de la moitié d'un cycle d'horloge, laissant l'autre moitié libre. Pour être plus précis, le signal d'horloge sur ces processeur passe la moitié du temps à 1, l'autre moitié à 0. Les deux processeurs accédaient à la mémoire quand le signal d'horloge était à 0, laissant la mémoire libre quand le signal d'horloge est à 1. Typiquement, le processeur et le VDC allaient à 1 MHz, et étaient relié à une mémoire RAM allant à 2 MHz. Les premiers ordinateurs Apple utilisaient cette technique, sauf qu'ils n'avaient pas de mémoire vidéo séparée. Par exemple, l'Apple 2 avait une mémoire RAM unique, de 4 à 64 kilooctets, partagée entre le processeur et la carte d'affichage. Une petite partie était utilisée comme mémoire vidéo, le reste était utilisé par les programmes et le système d'exploitation. Le VDC adressait la RAM directement, tout comme le processeur. Un point intéressant est que le VDC s'occupait aussi du rafraichissement mémoire de la RAM. Il balayait la mémoire vidéo lors de l'affichage d'une image, mais balayait le reste de la mémoire entre deux images. Et tout cela était en réalité fait en une seule passe, les timings étaient prévus pour. Sur le Macintosh 128K, le processeur était un Motorola 68000 et la RAM passait à 128 kilo-octets, mais une organisation similaire était utilisée. Encore une fois, la RAM faisait à la fois RAM système et mémoire vidéo. pendant l'affichage d'une image, le VDC et le processeur se passaient la main tous les 4 cycles. Le VDC lisait la RAM pendant 4 cycle, puis le processeur lisait/écrivait durant 4 cycles, et ainsi de suite. Par contre, le processeur avait un accès exclusif à la RAM entre l'affichage de deux images. ===L'usage de tampons de synchronisation FIFO=== Une dernière solution est l'usage de mémoires tampon entre le processeur et la mémoire vidéo. Le processeur n'écrivait pas directement dans la mémoire vidéo, mais dans une mémoire intermédiaire. La mémoire intermédiaire est une '''mémoire FIFO''', à savoir qu'elle mémorise les données à écrire et leur adresse dans leur ordre d'arrivée. Elle sert à mettre en attente les accès mémoire du processeur tant que la mémoire vidéo est occupée. Ainsi, si la mémoire vidéo est libre, le processeur peut écrire directement dans la mémoire vidéo, sans intermédiaire. Mais si la carte d'affichage accède à la mémoire vidéo, les écritures du processeur sont mises en attente dans la mémoire FIFO. Elles s'accumulent tant que la mémoire vidéo est occupée, elles sont conservées dans l'ordre d'envoi par le processeur. Dès que la mémoire vidéo se libère, les données présentes dans la FIFO sont écrites dans la mémoire vidéo, au rythme d'une écriture par cycle d'horloge de la VRAM : la mémoire FIFO se vide progressivement. Si la mémoire FIFO est pleine, elle prévient le processeur en lui envoyant un bit/signal, et le processeur agit en conséquence en cessant les écritures et en se mettant en pause. [[File:FIFO d'écriture en mémoire vidéo.png|centre|vignette|upright=2|FIFO d'écriture en mémoire vidéo]] Sur les cartes d'affichage, le processeur n'adresse pas la mémoire vidéo directement. A la place, le processeur envoie des données sur le bus, sur le connecteur de la carte d'affichage. La carte d'affichage récupère les données transmises sur le bus et les mets en attente dans une mémoire FIFO assez similaire. Elle les écrit en mémoire vidéo si besoin quand elle est libre. En conséquence, les cartes graphiques modernes n'ont pas besoin de ''raster interrupts'', qui étaient utilisées sur les premiers PC ou les premières consoles. A la place, c'est la carte graphique qui s'occupe de tout, et notamment son circuit de contrôle qui gère la mémoire vidéo. D'ailleurs, c'est ce circuit de contrôle qui gère la synchronisation verticale, pas le processeur, pas besoin de ''vertical blanking interrupt''. ==La génération des signaux de commande pour l'écran== Les VDC contiennent tous de quoi générer les signaux de commande à destination de l'écran, ainsi que des signaux d'interruption à destination du processeur. Le premier signal à générer est le signal d'horloge transmission des pixels, à savoir le signal d'horloge dont la période est égale au temps mis pour envoyer un pixel à l'écran. Ce signal est souvent transmis à l'écran, via un fil dédié. Les VDC contiennent de quoi générer cette fréquence, grâce à un circuit oscillateur dédié. Il faut aussi générer les signaux de synchronisation verticale/horizontale, ainsi que les ''raster interrupts''. Et ils se trouve que les deux sont générés par les mêmes circuits, à peu de choses près. Dans ce qui va suivre, nous allons voir comment sont générés ces signaux, quels sont les circuits qui s'en chargent. Ils sont assez simples : ce sont de simples compteurs reliés à des comparateurs ! ===La génération des signaux de synchronisation verticale/horizontale=== Le VDC gère les signaux de synchronisation verticale ou horizontale. Pour cela, ils intègrent deux compteurs (des circuits qui comptent de 0 à N). Le premier compteur compte les lignes transmises, l'autre les pixels dans une ligne, ce qui leur vaut les noms de compteur de colonne et de compteur de ligne. Les deux compteurs sont initialisés à 0 avant la transmission et sont incrémentés automatiquement quand on passe d'un pixel à l'autre, ou bien d'une ligne à l'autre. Quand le compteur atteint la valeur adéquate, il émet un signal de synchronisation verticale/horizontale. Au passage à la ligne suivante, le compteur de colonne est réinitialisé à 0, idem pour le compteur de ligne quand une image a été affichée totalement. Ils sont configurés de manière à prendre en compte la résolution de l'écran, mais pas de la manière dont vous le pensez. Par exemple, pour une résolution de 640 par 480 : vous imaginez sans doute que le compteur de colonne est configuré pour compter de 0 à 639, alors que l'autre compte de 0 à 479. Par exemple, pour une résolution de 640 par 480, les deux compteurs sont initialisés à 0. Le compteur de colonne est incrémenté à chaque envoi de pixel, et il déclenche le signal de synchronisation horizontale une fois que le compteur atteint 640. Le compteur de colonne est alors réinitialisé après un certain temps, alors que le compteur de ligne est incrémenté. Le compteur de ligne est donc incrémenté à chaque nouvelle ligne. De plus, il émet un signal de synchronisation verticale quand il atteint 480, et est réinitialisé après cela. Il est possible de faire ainsi, mais ce n'est pas la solution idéale. En réalité, il faut tenir compte du fait que les signaux de HSYNC et VSYNC, qui sont eux aussi générés par les deux compteurs. Imaginons que le signal HSYNC prenne 20 cycles d'horloge, et le signal VSYNC 150 cycles. Pour une résolution de 640 par 480, on utilise un compteur de colonne qui compte de 0 à 640 + 20, et un compteur de ligne qui compte de 0 à 480 + 150. L'idée est d'utiliser des comparateurs pour générer les signaux HSYNC et VSYNC, un pour le signal HSYNC et un autre pour le signal VSYNC. En reprenant les valeurs mentionnées précédemment, on utilise un comparateur qui vérifie si le compteur de colonne est supérieur ou égal à 640, et un autre comparateur qui vérifie si le compteur de ligne est égal ou dépasse 480. La sortie des deux comparateurs fournit directement les signaux HSYNC et VSYNC. Une autre solution remplace les comparateurs par une mémoire ROM. L'idée est d'envoyer les compteurs sur l'entrée d'adresse, la ROM fournit en sortie les signaux de commande destinés à l'écran. En remplissant la ROM avec les valeurs adéquates, la technique fonctionne à merveille et on peut se passer des circuits comparateurs. Pour les haute résolutions, il est possible d'utiliser deux ROMs : une pour le compteur de ligne, une pour le compteur de colonne. Le VDC peut gérer plusieurs résolutions différentes, et les ''timings'' sont différents suivant les résolutions. Idéalement, il faut envoyer quelques bits de commande pour choisir la résolutions en entrée de la mémoire ROM pour choisir les bons timings. Avec des comparateurs, la technique demande d'utiliser les mêmes comparateurs, mais d'ajouter des circuits pour gérer les différentes résolutions. ===L'exemple des timings du standard VGA=== Reprenons l'exemple du standard VGA. Avec ce standard, il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. De plus, on devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] Le compteur de colonne est cadencé à une fréquence bien précise, qui détermine le temps mis pour passer d'un pixel à l'autre. Le temps de transmission d'un pixel est de 25,6 µs / 640 = 0,04 µs, ce qui correspond à une fréquence de 25 MégaHertz. Et cela permet d'implémenter facilement les deux temps d'attente avant et après l'affichage d'une ligne. Les temps d'attente de 1,54 et 0,64 µs correspondent respectivement à 38 et 16 cycles du compteur, la durée de 3,8 µs du signal H-sync correspond à 95 cycles. En tout, cela fait 640 + 95 + 16 + 38 = 789. Il faut donc un compteur qui compte de 0 à 788. La transmission des pixels commence quand le compteur commence à compter. Puis, le compteur continue de compter pendant 0,64 µs alors qu'aucun pixel n'est envoyé, afin de gérer le temps d'attente après le signal H-sync. Puis, au 640 + 16ème cycle, le signal H-sync est généré pendant 95 cycles. Enfin, le compteur continue de compter pendant 38 cycles pour le second temps d'attente, avant le prochain envoi de ligne. Le signal H-sync est donc généré quand le compteur a une valeur comprise entre 656 et 751 : il suffit d'ajouter un comparateur qui vérifie si le compteur est dans cet intervalle, et donc la sortie est à zéro si c'est le cas. L'adresse n'est pas calculée si le compteur n'a pas une valeur comprise entre 0 et la largeur indiquée par la résolution. La même logique s'applique avec le signal V-sync, mais avec des timings différents, illustrés plus haut. Pour implémenter tout cela, il suffit de combiner les deux compteurs avec des circuits comparateurs, qui vérifient si la valeur du compteur est dans tel ou tel intervalle. Il faut au minimum deux circuits comparateurs, un pour le signal HSYNC, un autre pour le signal VSYNC. D'autres compteurs peuvent être utilisés pour générer les bits de ''blanking'' ou pour réinitialiser le compteur à la valeur adéquate. Les comparateurs peuvent être remplacés par une mémoire ROM, comme dit plus haut. [[File:VGACmptFig2.png|centre|vignette|upright=2|Circuit de gestion des timings H-sync et V-sync d'un écran VGA.]] ===La génération des ''raster interrupts'' et des bits de ''blanking''=== Les mêmes compteurs ou la ROM sont souvent utilisés pour générer les ''raster interrupts'' et le bit de ''blanking'', qui permettent de prévenir le processeur quand la carte d'affichage a terminé d'envoyer une ligne et/ou une image entière à l'écran. Notons qu'il est possible d'implémenter les interruptions à partir du bit de ''blanking'', cela demande juste aux compteurs de générer ce bit de ''blanking'' et de l'utiliser pour générer les ''raster interrupt''. Au passage, les compteurs de ligne et colonne ne servent pas qu'à générer des signaux : on verra dans la section sur le CRTC que quand on dispose de ces deux compteurs, ajouter de quoi parcourir le ''framebuffer'' est trivial ! <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage | prevText=Les cartes d'affichage | next=Les systèmes à framebuffer | nextText=Les systèmes à framebuffer }}{{autocat}} </noinclude> iro5ecwxjbn7wgn3v1ggh5hj8x159n6 764897 764859 2026-04-24T18:00:20Z Mewtow 31375 /* L'interface du VDC avec l'écran */ 764897 wikitext text/x-wiki Dans les années 70-80, un système vidéo pouvait être fabriqué de deux grandes manières différentes. La première concevait la carte d'affichage à partir de composants très simples, comme des portes logiques ou des transistors, à partir de zéro, sans réutiliser de matériel existant. De telles cartes vidéos avaient des performances et des fonctionnalités très variables, mais étaient très complexes à concevoir et coutaient cher. La seconde catégorie utilisait des '''''Video Display Controler ''''' (VDC), des circuits déjà tout près, placés dans un boitier, produits en masse, qu'il suffisait de compléter avec une mémoire vidéo et quelques autres circuits pour obtenir un système vidéo. De tels circuits permettaient d'obtenir des performances décentes, voire très bonnes, pour un prix nettement inférieur. Les deux fonctionnent de la même manière, peu importe qu'il s'agisse d'un VDC ou d'un circuit fait main. Les deux contiennent globalement les mêmes circuits, ils fonctionnent de la même manière. Dans le chapitre sur les cartes d'affichage, nous avons vu qu'une carte d'affichage contient trois à quatre circuits distincts : un ''framebuffer'', un circuit de contrôle, le circuit d’interfaçage électrique avec l'écran (le RAMDAC) et éventuellement une connexion avec le bus. Le VDC correspond au circuit de contrôle. Les fonctionnalités d'un VDC sont très variables. Ils s'occupent des choses de base, comme gérer la résolution, l'envoi de l'image à afficher à l'écran, ce genre de choses. Il ne s'occupe pas de la transmission avec le bus, il ne gère pas vraiment l’interfaçage électrique. [[File:Architecture d'une carte d'affichage avec VDC.png|centre|vignette|upright=1.5|Architecture d'une carte d'affichage avec VDC]] Si la plupart des VDC communiquent avec la mémoire vidéo, il existe quelques exceptions qui se débrouillent sans mémoire vidéo, comme les ''Video shifters'' dont nous parlerons dans quelques chapitres. La meilleure manière d'aborder les VDC est de d'abord les voir comme des espèces de boite noire, dont on ne se préoccupe pas du contenu en premier lieu. Un VDC communique avec l'écran, le processeur et avec la mémoire vidéo. Dans ce chapitre, nous allons voir comment il communique avec l'écran et le processeur. Nous laissons de côté l'interface avec la mémoire vidéo, car elle dépend du VDC et n'est pas la même selon que la carte d'affichage utilise ou non un ''framebuffer''. Le tout est illustré ci-dessous. L'interface VDC-écran correspond aux flèches en rouge et sera vue dans la première section. L'interface VDC-processeur correspond aux flèches en bleu et est le sujet de la seconde section. Enfin, l'interface entre mémoire vidéo et processeur correspond aux flèches en vert. En soi, elle n'est pas liée directement au VDC, mais nous allons quand même la voir dans ce chapitre. [[File:Interface VDC.png|centre|vignette|upright=2|Interface d'un VDC.]] ==L'interface du VDC avec l'écran== <noinclude>[[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]]</noinclude> Un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Les écrans LCD sont bel et bien conçus comme cela, c'est plus compliqué sur les écrans CRT, mais cela ne change rien du point de vue de la carte graphique. Chaque pixel est localisé sur l'écran par deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. ===Le balayage progressif et l'entrelacement=== L'écran peut afficher une image en utilisant deux modes principaux : le balayage progressif, et le balayage entrelacé. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. Le balayage progressif est utilisé sur tous les écrans LCD moderne, mais il était plus adapté aux écrans CRT. Sur les écrans plats, l'image est transmise à l'écran, mais est affichée une fois qu'elle est intégralement reçue, d'un seul coup. Mais sur les anciens écrans de télévision, les choses étaient différentes. Les vieux écrans CRT fonctionnaient sur ce principe : un canon à électrons balayait l'écran en commençant en haut à gauche, et balayait l'écran ligne par ligne. Ce ''scan progressif'' de l'image faisait apparaître l'image progressivement et profitait de la persistance rétinienne pour former une image fixe. L'image était donc affichée en même temps qu'elle était envoyée et le scan progressif correspondait à l'ordre d'allumage des pixels à l'écran. [[File:CRT color.png|centre|vignette|upright=2|Intérieur d'un écran CRT. En 1, on voit le canon à électron. En 2, on voit le faisceau d'électron associé à chaque couleur. En 3, les faisceaux d'électrons sont déviés par des électroaimants, pour atterrir sur le pixel à éclairer. En 4, le faisceau d'électrons frappe la surface de l'écran, composée de phosphore, qui s'illumine alors. En 5, on voit que les trois faisceaux ne frappent exactement au même endroit : l'un frappe sur une zone colorée en bleu, l'autre sur du vert, l'autre sur du rouge. Les trois zones combinées affichent une couleur par mélange du rouge, du vert et du bleu. Ne vous trompez pas : le faisceau d'électron n'a pas de couleur, comme indiqué sur le schéma, la couleur a été ajoutée pour faire comprendre qu'un faisceau est dirigé sur les pixels rouges, un autre sur les pixels bleus, et l'autre sur les pixels verts.]] [[File:CRT image creation animation.gif|vignette|upright=0.5|Illustration de l'entrelacement.]] La technique du balayage progressif n'avait pas de défauts particuliers, ce qui fait que tous les écrans d’ordinateurs CRT l'utilisait. Mais les télévisions de l'époque utilisaient une méthode différente, appelée l''''entrelacement'''. Avec elle, l'écran faisait un scan pour les lignes paires, suivi par un scan pour les lignes impaires. Le tout est illustré dans l'animation ci-contre. [[File:Interlace zoom.gif|vignette|Illustration de l'entrelacement et de ses effets sur la perception.]] L'entrelacement donne l'illusion de doubler la fréquence d'affichage, ce qui est très utile sur les écrans à faible fréquence de rafraîchissement. Pour comprendre pourquoi, il faut comparer ce qui se passe entre un écran à scan progressif non-entrelacé et un écran entrelacé. Avec l'écran non-entrelacé, l'image met un certain temps à s'afficher, qui correspond au temps que met le canon à électron à balayer la totalité de l'écran, ligne par ligne. Avec l'entrelacement, le temps mis pour balayer l'écran est le même, car le nombre de lignes à balayer reste le même, seul l'ordre change. Sur l'écran entrelacé, l'image s'affiche à moitié une première fois (sur les lignes paires) avant que l'image complète s'affiche. La moitié d'image affichée par l'écran entrelacé a une résolution suffisante pour que le cerveau humain soit trompé et perçoive une image presque complète. En clair, le cerveau verra deux images par balayage complet : une image partielle lors du balayage des lignes paires et une image complète lors du balayage des lignes impaires. Sans entrelacement, le cerveau ne verra qu'une seule image lors de chaque balayage complet. L'effet est d'autant plus important que la résolution verticale (le nombre de lignes) est important. De plus, l'effet est encore plus important si l'ordinateur calcule un grand nombre d'images par secondes. Par exemple, pour un écran avec une fréquence de rafraîchissement de 60 Hz et un jeu vidéo qui tourne deux fois plus vite (à 120 images par secondes, donc), l'image sur les lignes impaires sera plus récente que celle sur les lignes paires. Le cerveau humain sera sensible à cela et verra une image plus fluide (bien qu'imparfaitement fluide). Le nombre de lignes est toujours impair (normes analogiques : 625 en Europe, 525 en Amérique), ce qui fait un nombre non entier de lignes pour chacune des 2 trames (impaires et paires). Par exemple, pour 625 lignes cela fait {{formatnum:312.5}} lignes par trame. Le balayage vertical étant progressif durant le balayage horizontal, les lignes sont imperceptiblement penchées. À la fin du balayage d'une trame, le rayon se retrouve au milieu de la ligne horizontale, soit un décalage vertical d'une demie-ligne (voir image ci-dessous). [[Fichier:Balayage entrelace affichage trames.svg|center|500px|class=transparent|Entrelacement sur tube cathodique.]] ===La fréquence de rafraichissement=== Même si cela commence à changer de nos jours, l'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de '''fréquence de rafraîchissement'''. Pour un écran avec une fréquence de rafraîchissement de 60 Hz (60 images par secondes), la carte graphique doit envoyer une nouvelle image tous les (1 seconde / 60) = 16,666... millisecondes. Sur les écrans LCD, la fréquence de rafraîchissement ne dépend pas de la résolution utilisée, en raison de différences de technologie. Sur les anciens écrans CRT, la fréquence de rafraîchissement dépendait de la résolution utilisée, et la carte d'affichage devait alors gérer le couple résolution-fréquence elle-même et la gestion de la fréquence de rafraîchissement était donc plus compliquée. Depuis environ 2016, quelques écrans supportent une '''fréquence de rafraichissement variable'''. Variable dans le sens : peut varier entre une fréquence minimale et une fréquence maximale selon les besoins. L'écran reçoit des images de part de la carte graphique, et les affiche immédiatement, sans attendre un signal de synchronisation vertical de fréquence fixe. Tant que la carte d'affichage ne va pas trop vite, l'écran suit, il affiche les images dès qu'il les reçoit. Par contre, au-delà d'un certain flux d'image, il bloque à une fréquence de rafraichissement maximale. Les bénéfices d'une fréquence de rafraichissement variable sont nombreux. Déjà, le temps de latence est réduit, l'''input lag'' si cher aux joueurs compétitifs est réduit de quelques millisecondes. De plus, la qualité d'image est améliorée du fait de l'absence de ''screen tearing'' sur lequel on reviendra plus tard. ===La gestion des timings pour la communication avec l'écran=== Le câble qui relie la carte graphique à l'écran transmet au mieux un seul pixel à la fois, voire un seul bit à la fois. On ne peut pas envoyer l'image d'un seul coup à l'écran, et on doit l'envoyer pixel par pixel. L'écran traite alors ce flux de pixels de deux manières différentes. Dans le cas des écrans LCD, le plus intuitif, l'écran accumule les pixels reçus dans une mémoire tampon et affiche l'image une fois qu'elle est totalement reçue. Pour les écrans CRT, l'écran affiche les pixels reçus immédiatement dès leur réception sur l'entrée. Dans les deux cas, il faut envoyer les pixels dans un certain ordre bien précis. Un point important est que la carte graphique ne peut pas envoyer un flux de pixels n'importe quand et doit respecter des timings bien précis. Le flux de pixel envoyé à l'écran est souvent structuré d'une certaine manière, avec des temps de pause, un temps de maintien minimum pour chaque pixel, etc. Déjà, il faut tenir compte des timings liés à la transmission de l'image elle-même. La carte graphique doit envoyer les pixels avec des timings tout aussi stricts, qui dépendent du standard vidéo utilisé. Chaque pixel doit être maintenu durant un certain temps bien précis, il y a un certain temps entre la transmission de deux pixels, etc. Et le circuit d’interfaçage doit gérer le '''temps de transmission d'un pixel'''. Pour cela, le VDC envoie un signal d'horloge dont la période correspond au temps de transmission/affichage d'un pixel. En, clair, le VDC envoie un pixel à chaque cycle d'horloge. Ensuite, il faut prévenir l'écran qu'on a fini de transmettre une image avec un '''signal de synchronisation verticale''', qui indiquait à l'écran qu'une image entière vient d'être transmise. Le VDC transmet l'image pixel par pixel, et lève ce signal de synchronisation verticale une fois l'image intégralement transmise. Ce signal était transmis sur un fil spécialisé, qu'on trouve sur la plupart des connecteurs VGA. De nos jours, sur les standards HDMI, DisplayPort, et autres, les choses sont plus compliquées, mais ce signal est quand même transmis, bien que pas forcément sur un fil spécialisé. Enfin, il faut aussi tenir compte d'autres timings pour gérer la résolution. Les pixels sont envoyés ligne par ligne, mais une ligne de pixel n'a pas la même taille suivant la résolution : 640 pixels pour du 640 × 480, 1280 pour du 1280 × 1024, etc. La carte graphique doit donc indiquer quand commencent et se terminent chaque ligne dans le flux de pixels. Sans cela, on ne pourrait pas gérer des résolutions différentes. Pour cela, le VDC envoie un '''signal de synchronisation horizontale''' une fois qu'il a fini d'envoyer une ligne. En tout, cela fait au minimum trois signaux : une horloge pour la transmission des pixels, un signal de synchronisation verticale, et un signal de synchronisation horizontale. Sans cela, impossible d'envoyer des pixels à l'écran ou de gérer la résolution convenablement. Et il y a d'autres contraintes de timings dont nous parlerons plus bas, qui ne sont pas évidentes pour le moment. Par exemple, sur les écrans CRT, il y a un temps de latence à la fin d'une ligne pour que le canon à électron se déplace sur le début de la ligne suivante. Et cela impose de ne pas démarrer l'envoie de la ligne suivante avant un certain temps. Cela il n'existe plus sur les écrans LCD, mais il fallait le prendre en compte à l'époque. ===L'exemple du standard VGA=== Un bon exemple est le standard VGA, qui était le seul utilisé pour connecter les écrans CRT, mais qui est encore utilisé de nos jours sur les écrans LCD. Avec ce standard, le connecteur contenait trois fils R, G, et B pour envoyer la couleur, codée en analogique. Il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. Jusque là, rien de surprenant, c'est une redite de ce qu'on a dit plus haut. On trouve aussi plusieurs fils pour la masse, à savoir le 0 Volt, ainsi qu'une tension d'alimentation. Il y a une masse générale, ainsi que plusieurs masses, une par signal RGB. Et enfin, il faut citer la connexion DDE/DDC qui permet de communiquer des informations de configuration à l'écran. Quand vous branchez l'écran à une carte graphique, celle-ci communique avec l'écran pour savoir quelles sont les résolutions supportées, quelle fréquence de rafraichissement est supporté, si l'écran supporte des couleurs 32 bits, etc. Sans cela, impossible de configurer la résolution. Pour cela, l'écran contient une petite mémoire ROM, dont le contenu est standardisé, qui contient toutes les informations nécessaires pour configurer l'écran.LA carte graphique lit cette ROM en passant par un bus appelé le bus '''''Display Data Channel''''', qui permet à la carte graphique de lire cette ROM, d'interroger l'écran sur les résolutions et fonctionnalités supportées. Le bus est un dérivé du bus I²c, et a trois fils dédiés : un pour l'horloge, l'autre pour la transmission des données, et une masse dédiée. [[File:EMacVGA.png|centre|vignette|upright=2|Connecteurs VGA]] Les premières subtilités du standard VGA viennent des timings des signaux HSYCN et VSYNC. Le signal HSYNC n'est pas envoyé dès la fin de la ligne : il y a un temps d'attente de quelques microsecondes entre la fin de la ligne et l'envoie du signal HSYNC. Le signal HSYNC est maintenu durant quelques microsecondes, la durée d'envoi est fixe. Puis, on a encore un nouveau temps d'attente avant l'envoi de la prochaine ligne, durant lequel le signal HSYNC n'est pas envoyé. Durant ces trois périodes (deux temps d'attentes, envoi de HSYNC), aucun pixel n'est envoyé à l'écran. [[File:VGA 640×480 horizontal timings.svg|centre|vignette|upright=2|VGA 640×480 horizontal timings. Les durées vertes et jaunes sont des temps d'attentes où rien n'est envoyé sur le connecteur, rouge correspond à l'envoi du signal HSYCN, bleu est l'envoi de la ligne.]] Et il y a la même chose avec les signaux VSYNC, même si les timings sont différents. On devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] ==L'interface entre le processeur et le VDC== Pour le processeur, le VDC a une interface similaire à celle de n'importe quel périphérique : un paquet de registres, et éventuellement de la RAM. La mémoire vidéo peut être intégrée dans le VDP ou être séparée, les deux sont possibles. Mais nous allons partir du principe que la mémoire vidéo est séparée. Dans cette section, nous allons voir ce qui a trait aux échanges entre CPU et VDC proprement dit, la communication VDC-VRAM sera le sujet d'une section ultérieure. ===L'interface entre processeur et mémoire vidéo=== La mémoire vidéo est généralement visible par le processeur, à savoir qu'il peut lire ou écrire dedans. Il existe plusieurs méthodes pour cela, mais celle utilisée sur le hardware ancien est celle des '''entrée-sorties mappées en mémoire''', que vous connaissez sans doute si vous avez déjà lu un cours d'architecture des ordinateurs. L'idée est que le processeur utilise la même interface pour la mémoire RAM et les périphériques. Des adresses mémoire sont détournées : elles ne pointent plus vers la mémoire RAM, mais vers la mémoire vidéo, la mémoire de la carte son, etc. Le processeur peut donc lire ou écrire directement dans la mémoire vidéo. Des circuits sur la carte mère s'occupent de ce détournement. Toute lecture ou écriture dans une adresse détournée est interceptée par la carte mère et redirigée vers le bus adéquat. [[File:Espace d'adressage classique avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2|Espace d'adressage classique avec entrées-sorties mappées en mémoire]] ===Les registres de configuration du VDC=== La programmation d'un VDC se fait par en configurant des '''registres de configuration''', qui permettent de configurer la résolution, la fréquence d’affichage, la position du curseur de souris, etc. Le processeur a juste à écrire dans ces registres, pour configurer la carte d'affichage comme souhaité. Le VDC incorpore presque toujours un '''registre d'état''', ou un '''registre de statut''' qui permet au processeur de connaitre l'état du VDC. Il permet de savoir si le VDC est libre, s'il est en train d'afficher une ligne, si une erreur a eu lieu et laquelle. Chaque bit du registre de statut a une interprétation fixée à l'avance et fournit une information précise. Le processeur a juste à lire le registre en question, pour vérifier l'état de la carte graphique. Plusieurs bits du registre de statut sont réservés au traitement des erreurs. Si le VDC rencontre une erreur, il met une valeur bien précise dans ces bits, appelée le '''code d'erreur'''. Typiquement, la valeur 0 indique qu'il n'y a pas d'erreur, les autres valeurs précisent une erreur. Le code d'erreur dépend de l'erreur en question et du VDC, il n'y a pas de standard pour ça. En général, les registres de configuration sont accessibles directement par le processeur, comme l'est la mémoire vidéo. Des adresses mémoire sont détournées pour pointer, non pas vers la mémoire RAM, mais vers les registres de configuration. Dans le cas le plus simple, il y a une adresse mémoire par registre, le processeur a juste à écrire dans cette adresse pour configurer le registre. Cependant, cette méthode ne marche pas trop bien s'il y a trop de registres de configuration. Par exemple, les cartes graphiques VGA intègrent plus de 300 registres de configuration, chacun faisant plusieurs octets. Il faudrait alors détourner presque un kilo-octet de mémoire, ce qui est un peu beaucoup. Pour éviter cela, les registres ne sont pas mappés directement en mémoire RAM, mais passent par un intermédiaire. L'adressage des registres de configuration se fait via une adresse unique, partagée entre tous les registres de configuration. Toute écriture ou lecture dans cette adresse est redirigée vers le bon registre, grâce à un mécanisme d'indicage qu'on va détailler immédiatement. Les registres de configuration sont numérotés, afin de pouvoir les adresser. Le numéro en question est appelé un '''indice de registre'''. La configuration d'un registre se fait en deux temps : le processeur écrit le numéro du registre à configurer, puis la donnée à écrire. La carte graphique reçoit ces deux informations l'une après l'autre, et les utilise pour configurer le registre elle-même. Un défaut de cette approche est que configurer le VDC demande deux instructions : une pour écrire l'indice/numéro, une autre pour écrire la donnée. C'est deux fois plus que si on avait des registres de configuration mappés en mémoire. Par contre, le tout est beaucoup plus économe en adresses mémoire détournées. Pour donner un exemple réel, prenons les cartes graphiques qui respectent le standard VGA. Une carte VGA contient plusieurs centaines de registres. Heureusement, ils ne sont pas tous mappés en mémoire, le mécanisme décrit précédemment est utilisé en lieu et place. Pour configurer la carte VGA, le processeur envoie l'indice de registre, puis la donnée. La carte VGA récupère ces deux informations, détermine quel registre de configuration est concerné grâce à l'indice, puis effectue l'écriture de la donnée. L'écriture de l'indice et de la donnée se fait grâce à deux registres séparés : un registre d'indice et un registre de données. Les deux sont mappés en mémoire RAM. La description faite est cependant approximative. En réalité, une carte VGA dispose de 4 paires de registres, chaque paire contenant un registre d'indice et un registre de données. La raison est que le standard VGA est le successeur du standard EGA, avec lequel il maintient une certaine compatibilité descendante. Or, une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : un CRTC, un RAMDAC, un ''Sequence Controller'' (SC) et un ''Graphics Controller'' (GC). Le VGA reprend cette séparation pour les registres de configuration. Il y avait donc une séparation logique entre les registres du RAMDAC, ceux du CRTC, et des deux autres circuits. Les registres du RAMDAC avait droit à une paire de registres, avec un registre d'indice et un registre pour les transferts de données, idem pour les registres du CRTC, etc. Au-delà de ça, le standard VGA impose la présence de deux registres de status, d'un registre de sortie sur lequel le processeur peut lire une donnée, et de quelques registres annexes. Après, la carte VGA pouvait intégrer tous ces registres dans un VDC unique, et beaucoup de cartes VGA ne se gênaient pas. ==La synchronisation entre CPU et VDC pour l'accès à la RAM vidéo== Un point qui va nous intéresser dans ce qui suit est la gestion des accès mémoire. Aussi bien le processeur que le VDC accèdent à la mémoire vidéo. Et ils ne faut pas qu'ils se marchent sur les pieds. Et pour cela, divers mécanismes sont implémentés. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Par double port, on veut dire qu'elles avaient deux entrée-sorties sur lesquelles on pouvait lire ou écrire leur contenu simultanément. Le premier port était connecté au processeur, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à afficher, alors que le second port était utilisé pour envoyer l'image à l'écran. Le port CPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires dont le support de stockage était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un registre capable de stocker une ligne entière. Le registre en question était un registre à décalage, à savoir un registre dont le contenu est décalé d'un rang à chaque cycle d'horloge. Le bit sortant est récupéré sur une sortie du registre, sortie qui était directement connectée au port CRT. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Le multiplexage temporel des accès mémoire=== Les mémoires double port n'étaient pas si rares, mais elles n'étaient pas la solution la plus utilisée. La majorité des micro-ordinateurs et consoles utilisaient une VRAM normale, simple port, bien plus courante et bien moins chère. Le processeur et le VDC sont alors tous deux connectés à VRAM, via un bus partagé, qui sera nommé le '''bus VRAM''' dans ce qui suit. Le processeur et le VDC ne peuvent pas accéder en même temps à la mémoire vidéo, ils doivent y accéder à tour de rôle. Et pour cela, divers mécanismes sont implémentés. La plupart du temps, le processeur n'accède pas à la VRAM, ce qui la laisse libre pour le VDC. Mais quand le processeur veut écrire dans la VRAM, il arrive que le processeur et le VDC se marchent sur les pieds, à savoir qu'ils veulent accéder à la VRAM en même temps. Pour gérer la situation, la VRAM utilise des mécanismes d'arbitrage, gérés par un circuit d'arbitrage dédié, qui gère les transferts sur le bus VRAM. La carte d'affichage et la mémoire envoient des demandes d'accès mémoire sur le bus, et elles sont ou non acceptées selon l'état de la VRAM. La solution la plus simple à implémenter donnait la priorité absolue au processeur sur le VDC. Dès que le processeur écrit dans la mémoire vidéo, celle-ci est indisponible pour le VDC. Des circuits annexes garantissent que c'est le cas. Le micro-ordinateur TRS-80 faisait ainsi. Un défaut de cette méthode est qu'elle cause des artefacts graphiques à l'écran si le processeur écrit dans la mémoire vidéo au mauvais moment. Si le processeur écrit en VRAM pendant l'affichage d'une image, les pixels ne sont pas affichés. Des écritures processeur trop longues peuvent causer des lignes noires à l'écran. Une autre solution donne la priorité au VDC. Pour cela, plusieurs méthodes sont utilisées : l'arbitrage, le ''pooling'' et les interruptions. La première réutilise le circuit d'arbitrage mentionné plus haut, qui gère les accès simultanés, sauf qu'il donne la priorité au VDC sur le processeur. Quand le VDC lit des pixels à afficher dans la VRAM, le processeur ne peut pas écrire en VRAM, il doit attendre que le VDC libère la RAM vidéo. Si le VDC démarre une lecture, alors que le processeur accédait déjà à la VRAM, le processeur perd la main et la VRAM est réservée au VDC. L'avantage est que les artefacts graphiques de la technique précédente disparaissent. Le désavantage est que la technique demande d'utiliser plus de circuits, elle a un cout en transistors un peu plus important. Ajouter des circuits d'arbitrage est une solution bien maitrisée. Après tout, la plupart des bus disposent de mécanismes d'arbitrage, pour éviter que les composants branchés dessus se marchent sur les pieds. Mais les bus VRAM ne sont pas dans ce cas. La raison est que la mémoire vidéo est partagée entre un processeur et un VDC, ce qui n'est pas beaucoup. Si le bus VRAM était partagé avec une dizaine de composants, ça vaudrait la peine d'ajouter un circuit d'arbitrage. Mais pour seulement deux composants, le cout en circuit est trop important. Le '''''pooling''''' est une solution alternative qui ne requiert pas l'ajout de circuits d'arbitrage. A la place, elle utilise le registre d'état du VDC. L'idée est que le registre de statut du VDC indique si celui-ci accède à la mémoire vidéo. Plus précisément, il contient un bit qui précise que l'écran est en train d'afficher une ligne. Il est appelé le '''bit de ''blanking'' horizontal'''. En général, ce bit est à 0 quand le VDC est en train de transmettre une ligne à l'écran, à 1 quand la mémoire vidéo est libre. Avant d’accéder à la mémoire vidéo, le processeur vérifie ce registre pour savoir si la mémoire vidéo est occupée ou non. Si c'est le cas, le processeur attend que la mémoire vidéo soit libre. Sinon, le processeur accéde à la mémoire vidéo. : Notons que ce signal n'est pas équivalent au signal HSYNC. Pour reprendre l'exemple du standard VGA, il y a deux temps d'attente avant et après l'envoi du signal HSYNC, où l'écran n'envoie pas de données. Le signal HSYNC est alors à 0, alors que le bit de ''blanking'' est bien à 1. ===La synchronisation CPU-VDC via ''raster interrupts''=== L'usage d'un bit de ''blanking'' permet au VDC de prévenir le processeur qu'il ne peut pas écrire en RAM vidéo. Mais les VDC de ce type sont assez rudimentaires. Une autre solution part du principe que l'affichage d'une image se fait à fréquence régulière. La carte d'affichage accède à la mémoire vidéo durant un certain temps pour envoyer l'image à l'écran, mais la laisse libre le reste du temps. Par exemple, sur un écran à 60 Hz, une image est rendue toutes les 16.66666 millisecondes. Pendant ces 16.66666 millisecondes, la carte d'affichage accède à la RAM vidéo pendant 1 à 10 millisecondes, le reste du temps est laissé au processeur. De même, il y a un certain temps de libre entre l'affichage de deux lignes, le temps que le canon à électron du CRT se repositionne au début de la ligne suivante. Cela laissait un petit peu de temps au processeur pour changer la configuration de la carte graphique, par exemple pour changer la palette de couleur, changer des ''sprites'', écrire dans la mémoire vidéo, ou tout autre chose. Le tout est très utile pour rendre certains effets graphiques. Pour utiliser au mieux ces temps libres, le VDC utilise une technique appelée les interruptions matérielles. Pour rappel, les '''interruptions''' sont des fonctionnalités du processeur, qui interrompent temporairement l’exécution d'un programme pour réagir à un événement extérieur (matériel, erreur fatale d’exécution d'un programme…). Lors d'une interruption, le processeur suit la procédure suivante : * arrête l'exécution du programme en cours et sauvegarde l'état du processeur (registres et ''program counter'') ; * exécute un petit programme nommé '''routine d'interruption''' ; * restaure l'état du programme sauvegardé afin de reprendre l'exécution de son programme là ou il en était. [[File:Interruption processeur.png|centre|vignette|upright=2|Interruption processeur]] Les interruptions matérielles, aussi appelées '''IRQ''', sont des interruptions déclenchées par un périphérique et ce sont celles qui vont nous intéresser dans ce qui suit. Les IRQ qui nous intéressent sont générées par la carte graphique quand c'est nécessaire. Pour que la carte graphique puisse déclencher une interruption sur le processeur, on a juste besoin de la connecter à une entrée sur le processeur, appelée l''''entrée d'interruption''', souvent notée INTR ou INT. Lorsque la carte graphique envoie un 1 dessus, le processeur passe en mode interruption. : Si vous avez déjà lu un cours d'architecture des ordinateurs, vous savez sans doute que les choses sont assez compliquées, qu'un ordinateur moderne contient un contrôleur d'interruption pour gérer les interruptions de plusieurs périphériques, mais nous n'avons pas besoin de parler de tout cela ici. Nous avons juste besoin de voir le cas simple où la carte graphique est connectée directement sur le processeur. Les cartes graphiques d'antan géraient plusieurs types d'interruptions, qui sont regroupées sous le terme de '''''Raster Interrupt'''''. Grâce à ces interruptions, le processeur sait quand la mémoire vidéo est libre. La plus importante s'appelle la '''''Vertical blank interrupt''''' (VBI). Elle indique que la carte graphique a fini d'afficher une image et servait à implémenter la synchronisation verticale. La ''Vertical blank interrupt'' elle était parfois utilisée pour d'autres choses qui n'ont rien à voir avec l'écran ou le rôle d'une carte graphique. Par exemple, sur les anciens ordinateurs qui ne disposaient pas de ''timers'' sur la carte mère, la VBI était utilisée pour timer les échanges avec le clavier et la souris. A chaque VBI, la routine d'interruption vérifiait si le clavier ou la souris avaient envoyé quelque chose à l'ordinateur. Le VDC contient donc une sortie dédiée aux interruptions, connectée à l'entrée d'interruption du CPU (directement ou par l'intermédiaire d'un contrôleur d'interruption). Les signaux de ''raster interrupt'' ne sont pas identiques aux signaux de synchronisation verticale et horizontale, ni aux signaux de ''blanking'', même s'ils se ressemblent. La différence est que les signaux de synchronisation verticale/horizontale ont des contraintes de timing différents. Par exemple, le standard VGA impose que ces deux signaux soient maintenus durant un certain temps à l'écran, alors que les ''raster interrupts'' sont remises à zéro dès que le processeur est a pris en compte. L'usage de ''raster interrupts'' est très efficace, mais a pour défaut de beaucoup utiliser le processeur. Diverses optimisations permettent de se passer de ''raster interrupts'', ou du moins d'en réduire le cout en performance. Mais ces techniques demandent de modifier la mémoire vidéo, précisément la manière dont le processeur communique avec la mémoire vidéo. Nous allons voir ces techniques dans ce qui suit. ===Le ''cycle stealing'' et le ''cycle interleaving''=== Une solution alternative élimine totalement les ''raster interrupts'', le ''pooling'' ou toute technique d'arbitrage entre VDC et processeur. Elle fait en sorte que la moitié des cycles d'horloge de la mémoire soit réservé au processeur, l'autre à la carte d'affichage. En clair, on change d’utilisateur à chaque cycle : si un cycle est attribué au processeur, le suivant l'est à la carte d'affichage. L'implémentation utilise une mémoire qui va à une fréquence double de celle du processeur et de la carte d'affichage, les deux étant cadencés à la même fréquence. Les fréquences du CPU et de la carte d'affichage étaient décalées d'une moitié de cycle, ce qui fait que leurs cycles correspondaient à des cycles mémoire différents. Un exemple est celui du micro-ordinateur BBC Micro, qui avait une fréquence de 4 MHz avec un processeur à 2 MHz et une carte d'affichage de 2 MHz lui aussi. Elle était autrefois beaucoup utilisée avec les processeurs Motorola, comme le Motorola 6800 et le MOS 6502, car ils avaient des particularités qui rendaient cette technique facile à implémenter. La particularité principale était qu'ils accédaient à la mémoire lors de la moitié d'un cycle d'horloge, laissant l'autre moitié libre. Pour être plus précis, le signal d'horloge sur ces processeur passe la moitié du temps à 1, l'autre moitié à 0. Les deux processeurs accédaient à la mémoire quand le signal d'horloge était à 0, laissant la mémoire libre quand le signal d'horloge est à 1. Typiquement, le processeur et le VDC allaient à 1 MHz, et étaient relié à une mémoire RAM allant à 2 MHz. Les premiers ordinateurs Apple utilisaient cette technique, sauf qu'ils n'avaient pas de mémoire vidéo séparée. Par exemple, l'Apple 2 avait une mémoire RAM unique, de 4 à 64 kilooctets, partagée entre le processeur et la carte d'affichage. Une petite partie était utilisée comme mémoire vidéo, le reste était utilisé par les programmes et le système d'exploitation. Le VDC adressait la RAM directement, tout comme le processeur. Un point intéressant est que le VDC s'occupait aussi du rafraichissement mémoire de la RAM. Il balayait la mémoire vidéo lors de l'affichage d'une image, mais balayait le reste de la mémoire entre deux images. Et tout cela était en réalité fait en une seule passe, les timings étaient prévus pour. Sur le Macintosh 128K, le processeur était un Motorola 68000 et la RAM passait à 128 kilo-octets, mais une organisation similaire était utilisée. Encore une fois, la RAM faisait à la fois RAM système et mémoire vidéo. pendant l'affichage d'une image, le VDC et le processeur se passaient la main tous les 4 cycles. Le VDC lisait la RAM pendant 4 cycle, puis le processeur lisait/écrivait durant 4 cycles, et ainsi de suite. Par contre, le processeur avait un accès exclusif à la RAM entre l'affichage de deux images. ===L'usage de tampons de synchronisation FIFO=== Une dernière solution est l'usage de mémoires tampon entre le processeur et la mémoire vidéo. Le processeur n'écrivait pas directement dans la mémoire vidéo, mais dans une mémoire intermédiaire. La mémoire intermédiaire est une '''mémoire FIFO''', à savoir qu'elle mémorise les données à écrire et leur adresse dans leur ordre d'arrivée. Elle sert à mettre en attente les accès mémoire du processeur tant que la mémoire vidéo est occupée. Ainsi, si la mémoire vidéo est libre, le processeur peut écrire directement dans la mémoire vidéo, sans intermédiaire. Mais si la carte d'affichage accède à la mémoire vidéo, les écritures du processeur sont mises en attente dans la mémoire FIFO. Elles s'accumulent tant que la mémoire vidéo est occupée, elles sont conservées dans l'ordre d'envoi par le processeur. Dès que la mémoire vidéo se libère, les données présentes dans la FIFO sont écrites dans la mémoire vidéo, au rythme d'une écriture par cycle d'horloge de la VRAM : la mémoire FIFO se vide progressivement. Si la mémoire FIFO est pleine, elle prévient le processeur en lui envoyant un bit/signal, et le processeur agit en conséquence en cessant les écritures et en se mettant en pause. [[File:FIFO d'écriture en mémoire vidéo.png|centre|vignette|upright=2|FIFO d'écriture en mémoire vidéo]] Sur les cartes d'affichage, le processeur n'adresse pas la mémoire vidéo directement. A la place, le processeur envoie des données sur le bus, sur le connecteur de la carte d'affichage. La carte d'affichage récupère les données transmises sur le bus et les mets en attente dans une mémoire FIFO assez similaire. Elle les écrit en mémoire vidéo si besoin quand elle est libre. En conséquence, les cartes graphiques modernes n'ont pas besoin de ''raster interrupts'', qui étaient utilisées sur les premiers PC ou les premières consoles. A la place, c'est la carte graphique qui s'occupe de tout, et notamment son circuit de contrôle qui gère la mémoire vidéo. D'ailleurs, c'est ce circuit de contrôle qui gère la synchronisation verticale, pas le processeur, pas besoin de ''vertical blanking interrupt''. ==La génération des signaux de commande pour l'écran== Les VDC contiennent tous de quoi générer les signaux de commande à destination de l'écran, ainsi que des signaux d'interruption à destination du processeur. Le premier signal à générer est le signal d'horloge transmission des pixels, à savoir le signal d'horloge dont la période est égale au temps mis pour envoyer un pixel à l'écran. Ce signal est souvent transmis à l'écran, via un fil dédié. Les VDC contiennent de quoi générer cette fréquence, grâce à un circuit oscillateur dédié. Il faut aussi générer les signaux de synchronisation verticale/horizontale, ainsi que les ''raster interrupts''. Et ils se trouve que les deux sont générés par les mêmes circuits, à peu de choses près. Dans ce qui va suivre, nous allons voir comment sont générés ces signaux, quels sont les circuits qui s'en chargent. Ils sont assez simples : ce sont de simples compteurs reliés à des comparateurs ! ===La génération des signaux de synchronisation verticale/horizontale=== Le VDC gère les signaux de synchronisation verticale ou horizontale. Pour cela, ils intègrent deux compteurs (des circuits qui comptent de 0 à N). Le premier compteur compte les lignes transmises, l'autre les pixels dans une ligne, ce qui leur vaut les noms de compteur de colonne et de compteur de ligne. Les deux compteurs sont initialisés à 0 avant la transmission et sont incrémentés automatiquement quand on passe d'un pixel à l'autre, ou bien d'une ligne à l'autre. Quand le compteur atteint la valeur adéquate, il émet un signal de synchronisation verticale/horizontale. Au passage à la ligne suivante, le compteur de colonne est réinitialisé à 0, idem pour le compteur de ligne quand une image a été affichée totalement. Ils sont configurés de manière à prendre en compte la résolution de l'écran, mais pas de la manière dont vous le pensez. Par exemple, pour une résolution de 640 par 480 : vous imaginez sans doute que le compteur de colonne est configuré pour compter de 0 à 639, alors que l'autre compte de 0 à 479. Par exemple, pour une résolution de 640 par 480, les deux compteurs sont initialisés à 0. Le compteur de colonne est incrémenté à chaque envoi de pixel, et il déclenche le signal de synchronisation horizontale une fois que le compteur atteint 640. Le compteur de colonne est alors réinitialisé après un certain temps, alors que le compteur de ligne est incrémenté. Le compteur de ligne est donc incrémenté à chaque nouvelle ligne. De plus, il émet un signal de synchronisation verticale quand il atteint 480, et est réinitialisé après cela. Il est possible de faire ainsi, mais ce n'est pas la solution idéale. En réalité, il faut tenir compte du fait que les signaux de HSYNC et VSYNC, qui sont eux aussi générés par les deux compteurs. Imaginons que le signal HSYNC prenne 20 cycles d'horloge, et le signal VSYNC 150 cycles. Pour une résolution de 640 par 480, on utilise un compteur de colonne qui compte de 0 à 640 + 20, et un compteur de ligne qui compte de 0 à 480 + 150. L'idée est d'utiliser des comparateurs pour générer les signaux HSYNC et VSYNC, un pour le signal HSYNC et un autre pour le signal VSYNC. En reprenant les valeurs mentionnées précédemment, on utilise un comparateur qui vérifie si le compteur de colonne est supérieur ou égal à 640, et un autre comparateur qui vérifie si le compteur de ligne est égal ou dépasse 480. La sortie des deux comparateurs fournit directement les signaux HSYNC et VSYNC. Une autre solution remplace les comparateurs par une mémoire ROM. L'idée est d'envoyer les compteurs sur l'entrée d'adresse, la ROM fournit en sortie les signaux de commande destinés à l'écran. En remplissant la ROM avec les valeurs adéquates, la technique fonctionne à merveille et on peut se passer des circuits comparateurs. Pour les haute résolutions, il est possible d'utiliser deux ROMs : une pour le compteur de ligne, une pour le compteur de colonne. Le VDC peut gérer plusieurs résolutions différentes, et les ''timings'' sont différents suivant les résolutions. Idéalement, il faut envoyer quelques bits de commande pour choisir la résolutions en entrée de la mémoire ROM pour choisir les bons timings. Avec des comparateurs, la technique demande d'utiliser les mêmes comparateurs, mais d'ajouter des circuits pour gérer les différentes résolutions. ===L'exemple des timings du standard VGA=== Reprenons l'exemple du standard VGA. Avec ce standard, il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. De plus, on devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] Le compteur de colonne est cadencé à une fréquence bien précise, qui détermine le temps mis pour passer d'un pixel à l'autre. Le temps de transmission d'un pixel est de 25,6 µs / 640 = 0,04 µs, ce qui correspond à une fréquence de 25 MégaHertz. Et cela permet d'implémenter facilement les deux temps d'attente avant et après l'affichage d'une ligne. Les temps d'attente de 1,54 et 0,64 µs correspondent respectivement à 38 et 16 cycles du compteur, la durée de 3,8 µs du signal H-sync correspond à 95 cycles. En tout, cela fait 640 + 95 + 16 + 38 = 789. Il faut donc un compteur qui compte de 0 à 788. La transmission des pixels commence quand le compteur commence à compter. Puis, le compteur continue de compter pendant 0,64 µs alors qu'aucun pixel n'est envoyé, afin de gérer le temps d'attente après le signal H-sync. Puis, au 640 + 16ème cycle, le signal H-sync est généré pendant 95 cycles. Enfin, le compteur continue de compter pendant 38 cycles pour le second temps d'attente, avant le prochain envoi de ligne. Le signal H-sync est donc généré quand le compteur a une valeur comprise entre 656 et 751 : il suffit d'ajouter un comparateur qui vérifie si le compteur est dans cet intervalle, et donc la sortie est à zéro si c'est le cas. L'adresse n'est pas calculée si le compteur n'a pas une valeur comprise entre 0 et la largeur indiquée par la résolution. La même logique s'applique avec le signal V-sync, mais avec des timings différents, illustrés plus haut. Pour implémenter tout cela, il suffit de combiner les deux compteurs avec des circuits comparateurs, qui vérifient si la valeur du compteur est dans tel ou tel intervalle. Il faut au minimum deux circuits comparateurs, un pour le signal HSYNC, un autre pour le signal VSYNC. D'autres compteurs peuvent être utilisés pour générer les bits de ''blanking'' ou pour réinitialiser le compteur à la valeur adéquate. Les comparateurs peuvent être remplacés par une mémoire ROM, comme dit plus haut. [[File:VGACmptFig2.png|centre|vignette|upright=2|Circuit de gestion des timings H-sync et V-sync d'un écran VGA.]] ===La génération des ''raster interrupts'' et des bits de ''blanking''=== Les mêmes compteurs ou la ROM sont souvent utilisés pour générer les ''raster interrupts'' et le bit de ''blanking'', qui permettent de prévenir le processeur quand la carte d'affichage a terminé d'envoyer une ligne et/ou une image entière à l'écran. Notons qu'il est possible d'implémenter les interruptions à partir du bit de ''blanking'', cela demande juste aux compteurs de générer ce bit de ''blanking'' et de l'utiliser pour générer les ''raster interrupt''. Au passage, les compteurs de ligne et colonne ne servent pas qu'à générer des signaux : on verra dans la section sur le CRTC que quand on dispose de ces deux compteurs, ajouter de quoi parcourir le ''framebuffer'' est trivial ! <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage | prevText=Les cartes d'affichage | next=Les systèmes à framebuffer | nextText=Les systèmes à framebuffer }}{{autocat}} </noinclude> 4bilfwns741irjp1zop6weucp2qbfi3 764898 764897 2026-04-24T18:00:40Z Mewtow 31375 /* Le balayage progressif et l'entrelacement */ 764898 wikitext text/x-wiki Dans les années 70-80, un système vidéo pouvait être fabriqué de deux grandes manières différentes. La première concevait la carte d'affichage à partir de composants très simples, comme des portes logiques ou des transistors, à partir de zéro, sans réutiliser de matériel existant. De telles cartes vidéos avaient des performances et des fonctionnalités très variables, mais étaient très complexes à concevoir et coutaient cher. La seconde catégorie utilisait des '''''Video Display Controler ''''' (VDC), des circuits déjà tout près, placés dans un boitier, produits en masse, qu'il suffisait de compléter avec une mémoire vidéo et quelques autres circuits pour obtenir un système vidéo. De tels circuits permettaient d'obtenir des performances décentes, voire très bonnes, pour un prix nettement inférieur. Les deux fonctionnent de la même manière, peu importe qu'il s'agisse d'un VDC ou d'un circuit fait main. Les deux contiennent globalement les mêmes circuits, ils fonctionnent de la même manière. Dans le chapitre sur les cartes d'affichage, nous avons vu qu'une carte d'affichage contient trois à quatre circuits distincts : un ''framebuffer'', un circuit de contrôle, le circuit d’interfaçage électrique avec l'écran (le RAMDAC) et éventuellement une connexion avec le bus. Le VDC correspond au circuit de contrôle. Les fonctionnalités d'un VDC sont très variables. Ils s'occupent des choses de base, comme gérer la résolution, l'envoi de l'image à afficher à l'écran, ce genre de choses. Il ne s'occupe pas de la transmission avec le bus, il ne gère pas vraiment l’interfaçage électrique. [[File:Architecture d'une carte d'affichage avec VDC.png|centre|vignette|upright=1.5|Architecture d'une carte d'affichage avec VDC]] Si la plupart des VDC communiquent avec la mémoire vidéo, il existe quelques exceptions qui se débrouillent sans mémoire vidéo, comme les ''Video shifters'' dont nous parlerons dans quelques chapitres. La meilleure manière d'aborder les VDC est de d'abord les voir comme des espèces de boite noire, dont on ne se préoccupe pas du contenu en premier lieu. Un VDC communique avec l'écran, le processeur et avec la mémoire vidéo. Dans ce chapitre, nous allons voir comment il communique avec l'écran et le processeur. Nous laissons de côté l'interface avec la mémoire vidéo, car elle dépend du VDC et n'est pas la même selon que la carte d'affichage utilise ou non un ''framebuffer''. Le tout est illustré ci-dessous. L'interface VDC-écran correspond aux flèches en rouge et sera vue dans la première section. L'interface VDC-processeur correspond aux flèches en bleu et est le sujet de la seconde section. Enfin, l'interface entre mémoire vidéo et processeur correspond aux flèches en vert. En soi, elle n'est pas liée directement au VDC, mais nous allons quand même la voir dans ce chapitre. [[File:Interface VDC.png|centre|vignette|upright=2|Interface d'un VDC.]] ==L'interface du VDC avec l'écran== <noinclude>[[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]]</noinclude> Un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Les écrans LCD sont bel et bien conçus comme cela, c'est plus compliqué sur les écrans CRT, mais cela ne change rien du point de vue de la carte graphique. Chaque pixel est localisé sur l'écran par deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. ===Le balayage progressif et l'entrelacement=== L'écran peut afficher une image en utilisant deux modes principaux : le balayage progressif, et le balayage entrelacé. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. Le balayage progressif est utilisé sur tous les écrans LCD moderne, mais il était plus adapté aux écrans CRT. Sur les écrans plats, l'image est transmise à l'écran, mais est affichée une fois qu'elle est intégralement reçue, d'un seul coup. Mais sur les anciens écrans de télévision, les choses étaient différentes. Les vieux écrans CRT fonctionnaient sur ce principe : un canon à électrons balayait l'écran en commençant en haut à gauche, et balayait l'écran ligne par ligne. Ce ''scan progressif'' de l'image faisait apparaître l'image progressivement et profitait de la persistance rétinienne pour former une image fixe. L'image était donc affichée en même temps qu'elle était envoyée et le scan progressif correspondait à l'ordre d'allumage des pixels à l'écran. [[File:CRT color.png|centre|vignette|upright=2|Intérieur d'un écran CRT. En 1, on voit le canon à électron. En 2, on voit le faisceau d'électron associé à chaque couleur. En 3, les faisceaux d'électrons sont déviés par des électroaimants, pour atterrir sur le pixel à éclairer. En 4, le faisceau d'électrons frappe la surface de l'écran, composée de phosphore, qui s'illumine alors. En 5, on voit que les trois faisceaux ne frappent exactement au même endroit : l'un frappe sur une zone colorée en bleu, l'autre sur du vert, l'autre sur du rouge. Les trois zones combinées affichent une couleur par mélange du rouge, du vert et du bleu. Ne vous trompez pas : le faisceau d'électron n'a pas de couleur, comme indiqué sur le schéma, la couleur a été ajoutée pour faire comprendre qu'un faisceau est dirigé sur les pixels rouges, un autre sur les pixels bleus, et l'autre sur les pixels verts.]] [[File:CRT image creation animation.gif|vignette|upright=0.5|Illustration de l'entrelacement.]] La technique du balayage progressif n'avait pas de défauts particuliers, ce qui fait que tous les écrans d’ordinateurs CRT l'utilisait. Mais les télévisions de l'époque utilisaient une méthode différente, appelée l''''entrelacement'''. Avec elle, l'écran faisait un scan pour les lignes paires, suivi par un scan pour les lignes impaires. Le tout est illustré dans l'animation ci-contre. <noinclude>[[File:Interlace zoom.gif|vignette|Illustration de l'entrelacement et de ses effets sur la perception.]]</noinclude> L'entrelacement donne l'illusion de doubler la fréquence d'affichage, ce qui est très utile sur les écrans à faible fréquence de rafraîchissement. Pour comprendre pourquoi, il faut comparer ce qui se passe entre un écran à scan progressif non-entrelacé et un écran entrelacé. Avec l'écran non-entrelacé, l'image met un certain temps à s'afficher, qui correspond au temps que met le canon à électron à balayer la totalité de l'écran, ligne par ligne. Avec l'entrelacement, le temps mis pour balayer l'écran est le même, car le nombre de lignes à balayer reste le même, seul l'ordre change. Sur l'écran entrelacé, l'image s'affiche à moitié une première fois (sur les lignes paires) avant que l'image complète s'affiche. La moitié d'image affichée par l'écran entrelacé a une résolution suffisante pour que le cerveau humain soit trompé et perçoive une image presque complète. En clair, le cerveau verra deux images par balayage complet : une image partielle lors du balayage des lignes paires et une image complète lors du balayage des lignes impaires. Sans entrelacement, le cerveau ne verra qu'une seule image lors de chaque balayage complet. L'effet est d'autant plus important que la résolution verticale (le nombre de lignes) est important. De plus, l'effet est encore plus important si l'ordinateur calcule un grand nombre d'images par secondes. Par exemple, pour un écran avec une fréquence de rafraîchissement de 60 Hz et un jeu vidéo qui tourne deux fois plus vite (à 120 images par secondes, donc), l'image sur les lignes impaires sera plus récente que celle sur les lignes paires. Le cerveau humain sera sensible à cela et verra une image plus fluide (bien qu'imparfaitement fluide). Le nombre de lignes est toujours impair (normes analogiques : 625 en Europe, 525 en Amérique), ce qui fait un nombre non entier de lignes pour chacune des 2 trames (impaires et paires). Par exemple, pour 625 lignes cela fait {{formatnum:312.5}} lignes par trame. Le balayage vertical étant progressif durant le balayage horizontal, les lignes sont imperceptiblement penchées. À la fin du balayage d'une trame, le rayon se retrouve au milieu de la ligne horizontale, soit un décalage vertical d'une demie-ligne (voir image ci-dessous). [[Fichier:Balayage entrelace affichage trames.svg|center|500px|class=transparent|Entrelacement sur tube cathodique.]] ===La fréquence de rafraichissement=== Même si cela commence à changer de nos jours, l'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de '''fréquence de rafraîchissement'''. Pour un écran avec une fréquence de rafraîchissement de 60 Hz (60 images par secondes), la carte graphique doit envoyer une nouvelle image tous les (1 seconde / 60) = 16,666... millisecondes. Sur les écrans LCD, la fréquence de rafraîchissement ne dépend pas de la résolution utilisée, en raison de différences de technologie. Sur les anciens écrans CRT, la fréquence de rafraîchissement dépendait de la résolution utilisée, et la carte d'affichage devait alors gérer le couple résolution-fréquence elle-même et la gestion de la fréquence de rafraîchissement était donc plus compliquée. Depuis environ 2016, quelques écrans supportent une '''fréquence de rafraichissement variable'''. Variable dans le sens : peut varier entre une fréquence minimale et une fréquence maximale selon les besoins. L'écran reçoit des images de part de la carte graphique, et les affiche immédiatement, sans attendre un signal de synchronisation vertical de fréquence fixe. Tant que la carte d'affichage ne va pas trop vite, l'écran suit, il affiche les images dès qu'il les reçoit. Par contre, au-delà d'un certain flux d'image, il bloque à une fréquence de rafraichissement maximale. Les bénéfices d'une fréquence de rafraichissement variable sont nombreux. Déjà, le temps de latence est réduit, l'''input lag'' si cher aux joueurs compétitifs est réduit de quelques millisecondes. De plus, la qualité d'image est améliorée du fait de l'absence de ''screen tearing'' sur lequel on reviendra plus tard. ===La gestion des timings pour la communication avec l'écran=== Le câble qui relie la carte graphique à l'écran transmet au mieux un seul pixel à la fois, voire un seul bit à la fois. On ne peut pas envoyer l'image d'un seul coup à l'écran, et on doit l'envoyer pixel par pixel. L'écran traite alors ce flux de pixels de deux manières différentes. Dans le cas des écrans LCD, le plus intuitif, l'écran accumule les pixels reçus dans une mémoire tampon et affiche l'image une fois qu'elle est totalement reçue. Pour les écrans CRT, l'écran affiche les pixels reçus immédiatement dès leur réception sur l'entrée. Dans les deux cas, il faut envoyer les pixels dans un certain ordre bien précis. Un point important est que la carte graphique ne peut pas envoyer un flux de pixels n'importe quand et doit respecter des timings bien précis. Le flux de pixel envoyé à l'écran est souvent structuré d'une certaine manière, avec des temps de pause, un temps de maintien minimum pour chaque pixel, etc. Déjà, il faut tenir compte des timings liés à la transmission de l'image elle-même. La carte graphique doit envoyer les pixels avec des timings tout aussi stricts, qui dépendent du standard vidéo utilisé. Chaque pixel doit être maintenu durant un certain temps bien précis, il y a un certain temps entre la transmission de deux pixels, etc. Et le circuit d’interfaçage doit gérer le '''temps de transmission d'un pixel'''. Pour cela, le VDC envoie un signal d'horloge dont la période correspond au temps de transmission/affichage d'un pixel. En, clair, le VDC envoie un pixel à chaque cycle d'horloge. Ensuite, il faut prévenir l'écran qu'on a fini de transmettre une image avec un '''signal de synchronisation verticale''', qui indiquait à l'écran qu'une image entière vient d'être transmise. Le VDC transmet l'image pixel par pixel, et lève ce signal de synchronisation verticale une fois l'image intégralement transmise. Ce signal était transmis sur un fil spécialisé, qu'on trouve sur la plupart des connecteurs VGA. De nos jours, sur les standards HDMI, DisplayPort, et autres, les choses sont plus compliquées, mais ce signal est quand même transmis, bien que pas forcément sur un fil spécialisé. Enfin, il faut aussi tenir compte d'autres timings pour gérer la résolution. Les pixels sont envoyés ligne par ligne, mais une ligne de pixel n'a pas la même taille suivant la résolution : 640 pixels pour du 640 × 480, 1280 pour du 1280 × 1024, etc. La carte graphique doit donc indiquer quand commencent et se terminent chaque ligne dans le flux de pixels. Sans cela, on ne pourrait pas gérer des résolutions différentes. Pour cela, le VDC envoie un '''signal de synchronisation horizontale''' une fois qu'il a fini d'envoyer une ligne. En tout, cela fait au minimum trois signaux : une horloge pour la transmission des pixels, un signal de synchronisation verticale, et un signal de synchronisation horizontale. Sans cela, impossible d'envoyer des pixels à l'écran ou de gérer la résolution convenablement. Et il y a d'autres contraintes de timings dont nous parlerons plus bas, qui ne sont pas évidentes pour le moment. Par exemple, sur les écrans CRT, il y a un temps de latence à la fin d'une ligne pour que le canon à électron se déplace sur le début de la ligne suivante. Et cela impose de ne pas démarrer l'envoie de la ligne suivante avant un certain temps. Cela il n'existe plus sur les écrans LCD, mais il fallait le prendre en compte à l'époque. ===L'exemple du standard VGA=== Un bon exemple est le standard VGA, qui était le seul utilisé pour connecter les écrans CRT, mais qui est encore utilisé de nos jours sur les écrans LCD. Avec ce standard, le connecteur contenait trois fils R, G, et B pour envoyer la couleur, codée en analogique. Il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. Jusque là, rien de surprenant, c'est une redite de ce qu'on a dit plus haut. On trouve aussi plusieurs fils pour la masse, à savoir le 0 Volt, ainsi qu'une tension d'alimentation. Il y a une masse générale, ainsi que plusieurs masses, une par signal RGB. Et enfin, il faut citer la connexion DDE/DDC qui permet de communiquer des informations de configuration à l'écran. Quand vous branchez l'écran à une carte graphique, celle-ci communique avec l'écran pour savoir quelles sont les résolutions supportées, quelle fréquence de rafraichissement est supporté, si l'écran supporte des couleurs 32 bits, etc. Sans cela, impossible de configurer la résolution. Pour cela, l'écran contient une petite mémoire ROM, dont le contenu est standardisé, qui contient toutes les informations nécessaires pour configurer l'écran.LA carte graphique lit cette ROM en passant par un bus appelé le bus '''''Display Data Channel''''', qui permet à la carte graphique de lire cette ROM, d'interroger l'écran sur les résolutions et fonctionnalités supportées. Le bus est un dérivé du bus I²c, et a trois fils dédiés : un pour l'horloge, l'autre pour la transmission des données, et une masse dédiée. [[File:EMacVGA.png|centre|vignette|upright=2|Connecteurs VGA]] Les premières subtilités du standard VGA viennent des timings des signaux HSYCN et VSYNC. Le signal HSYNC n'est pas envoyé dès la fin de la ligne : il y a un temps d'attente de quelques microsecondes entre la fin de la ligne et l'envoie du signal HSYNC. Le signal HSYNC est maintenu durant quelques microsecondes, la durée d'envoi est fixe. Puis, on a encore un nouveau temps d'attente avant l'envoi de la prochaine ligne, durant lequel le signal HSYNC n'est pas envoyé. Durant ces trois périodes (deux temps d'attentes, envoi de HSYNC), aucun pixel n'est envoyé à l'écran. [[File:VGA 640×480 horizontal timings.svg|centre|vignette|upright=2|VGA 640×480 horizontal timings. Les durées vertes et jaunes sont des temps d'attentes où rien n'est envoyé sur le connecteur, rouge correspond à l'envoi du signal HSYCN, bleu est l'envoi de la ligne.]] Et il y a la même chose avec les signaux VSYNC, même si les timings sont différents. On devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] ==L'interface entre le processeur et le VDC== Pour le processeur, le VDC a une interface similaire à celle de n'importe quel périphérique : un paquet de registres, et éventuellement de la RAM. La mémoire vidéo peut être intégrée dans le VDP ou être séparée, les deux sont possibles. Mais nous allons partir du principe que la mémoire vidéo est séparée. Dans cette section, nous allons voir ce qui a trait aux échanges entre CPU et VDC proprement dit, la communication VDC-VRAM sera le sujet d'une section ultérieure. ===L'interface entre processeur et mémoire vidéo=== La mémoire vidéo est généralement visible par le processeur, à savoir qu'il peut lire ou écrire dedans. Il existe plusieurs méthodes pour cela, mais celle utilisée sur le hardware ancien est celle des '''entrée-sorties mappées en mémoire''', que vous connaissez sans doute si vous avez déjà lu un cours d'architecture des ordinateurs. L'idée est que le processeur utilise la même interface pour la mémoire RAM et les périphériques. Des adresses mémoire sont détournées : elles ne pointent plus vers la mémoire RAM, mais vers la mémoire vidéo, la mémoire de la carte son, etc. Le processeur peut donc lire ou écrire directement dans la mémoire vidéo. Des circuits sur la carte mère s'occupent de ce détournement. Toute lecture ou écriture dans une adresse détournée est interceptée par la carte mère et redirigée vers le bus adéquat. [[File:Espace d'adressage classique avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2|Espace d'adressage classique avec entrées-sorties mappées en mémoire]] ===Les registres de configuration du VDC=== La programmation d'un VDC se fait par en configurant des '''registres de configuration''', qui permettent de configurer la résolution, la fréquence d’affichage, la position du curseur de souris, etc. Le processeur a juste à écrire dans ces registres, pour configurer la carte d'affichage comme souhaité. Le VDC incorpore presque toujours un '''registre d'état''', ou un '''registre de statut''' qui permet au processeur de connaitre l'état du VDC. Il permet de savoir si le VDC est libre, s'il est en train d'afficher une ligne, si une erreur a eu lieu et laquelle. Chaque bit du registre de statut a une interprétation fixée à l'avance et fournit une information précise. Le processeur a juste à lire le registre en question, pour vérifier l'état de la carte graphique. Plusieurs bits du registre de statut sont réservés au traitement des erreurs. Si le VDC rencontre une erreur, il met une valeur bien précise dans ces bits, appelée le '''code d'erreur'''. Typiquement, la valeur 0 indique qu'il n'y a pas d'erreur, les autres valeurs précisent une erreur. Le code d'erreur dépend de l'erreur en question et du VDC, il n'y a pas de standard pour ça. En général, les registres de configuration sont accessibles directement par le processeur, comme l'est la mémoire vidéo. Des adresses mémoire sont détournées pour pointer, non pas vers la mémoire RAM, mais vers les registres de configuration. Dans le cas le plus simple, il y a une adresse mémoire par registre, le processeur a juste à écrire dans cette adresse pour configurer le registre. Cependant, cette méthode ne marche pas trop bien s'il y a trop de registres de configuration. Par exemple, les cartes graphiques VGA intègrent plus de 300 registres de configuration, chacun faisant plusieurs octets. Il faudrait alors détourner presque un kilo-octet de mémoire, ce qui est un peu beaucoup. Pour éviter cela, les registres ne sont pas mappés directement en mémoire RAM, mais passent par un intermédiaire. L'adressage des registres de configuration se fait via une adresse unique, partagée entre tous les registres de configuration. Toute écriture ou lecture dans cette adresse est redirigée vers le bon registre, grâce à un mécanisme d'indicage qu'on va détailler immédiatement. Les registres de configuration sont numérotés, afin de pouvoir les adresser. Le numéro en question est appelé un '''indice de registre'''. La configuration d'un registre se fait en deux temps : le processeur écrit le numéro du registre à configurer, puis la donnée à écrire. La carte graphique reçoit ces deux informations l'une après l'autre, et les utilise pour configurer le registre elle-même. Un défaut de cette approche est que configurer le VDC demande deux instructions : une pour écrire l'indice/numéro, une autre pour écrire la donnée. C'est deux fois plus que si on avait des registres de configuration mappés en mémoire. Par contre, le tout est beaucoup plus économe en adresses mémoire détournées. Pour donner un exemple réel, prenons les cartes graphiques qui respectent le standard VGA. Une carte VGA contient plusieurs centaines de registres. Heureusement, ils ne sont pas tous mappés en mémoire, le mécanisme décrit précédemment est utilisé en lieu et place. Pour configurer la carte VGA, le processeur envoie l'indice de registre, puis la donnée. La carte VGA récupère ces deux informations, détermine quel registre de configuration est concerné grâce à l'indice, puis effectue l'écriture de la donnée. L'écriture de l'indice et de la donnée se fait grâce à deux registres séparés : un registre d'indice et un registre de données. Les deux sont mappés en mémoire RAM. La description faite est cependant approximative. En réalité, une carte VGA dispose de 4 paires de registres, chaque paire contenant un registre d'indice et un registre de données. La raison est que le standard VGA est le successeur du standard EGA, avec lequel il maintient une certaine compatibilité descendante. Or, une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : un CRTC, un RAMDAC, un ''Sequence Controller'' (SC) et un ''Graphics Controller'' (GC). Le VGA reprend cette séparation pour les registres de configuration. Il y avait donc une séparation logique entre les registres du RAMDAC, ceux du CRTC, et des deux autres circuits. Les registres du RAMDAC avait droit à une paire de registres, avec un registre d'indice et un registre pour les transferts de données, idem pour les registres du CRTC, etc. Au-delà de ça, le standard VGA impose la présence de deux registres de status, d'un registre de sortie sur lequel le processeur peut lire une donnée, et de quelques registres annexes. Après, la carte VGA pouvait intégrer tous ces registres dans un VDC unique, et beaucoup de cartes VGA ne se gênaient pas. ==La synchronisation entre CPU et VDC pour l'accès à la RAM vidéo== Un point qui va nous intéresser dans ce qui suit est la gestion des accès mémoire. Aussi bien le processeur que le VDC accèdent à la mémoire vidéo. Et ils ne faut pas qu'ils se marchent sur les pieds. Et pour cela, divers mécanismes sont implémentés. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Par double port, on veut dire qu'elles avaient deux entrée-sorties sur lesquelles on pouvait lire ou écrire leur contenu simultanément. Le premier port était connecté au processeur, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à afficher, alors que le second port était utilisé pour envoyer l'image à l'écran. Le port CPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires dont le support de stockage était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un registre capable de stocker une ligne entière. Le registre en question était un registre à décalage, à savoir un registre dont le contenu est décalé d'un rang à chaque cycle d'horloge. Le bit sortant est récupéré sur une sortie du registre, sortie qui était directement connectée au port CRT. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Le multiplexage temporel des accès mémoire=== Les mémoires double port n'étaient pas si rares, mais elles n'étaient pas la solution la plus utilisée. La majorité des micro-ordinateurs et consoles utilisaient une VRAM normale, simple port, bien plus courante et bien moins chère. Le processeur et le VDC sont alors tous deux connectés à VRAM, via un bus partagé, qui sera nommé le '''bus VRAM''' dans ce qui suit. Le processeur et le VDC ne peuvent pas accéder en même temps à la mémoire vidéo, ils doivent y accéder à tour de rôle. Et pour cela, divers mécanismes sont implémentés. La plupart du temps, le processeur n'accède pas à la VRAM, ce qui la laisse libre pour le VDC. Mais quand le processeur veut écrire dans la VRAM, il arrive que le processeur et le VDC se marchent sur les pieds, à savoir qu'ils veulent accéder à la VRAM en même temps. Pour gérer la situation, la VRAM utilise des mécanismes d'arbitrage, gérés par un circuit d'arbitrage dédié, qui gère les transferts sur le bus VRAM. La carte d'affichage et la mémoire envoient des demandes d'accès mémoire sur le bus, et elles sont ou non acceptées selon l'état de la VRAM. La solution la plus simple à implémenter donnait la priorité absolue au processeur sur le VDC. Dès que le processeur écrit dans la mémoire vidéo, celle-ci est indisponible pour le VDC. Des circuits annexes garantissent que c'est le cas. Le micro-ordinateur TRS-80 faisait ainsi. Un défaut de cette méthode est qu'elle cause des artefacts graphiques à l'écran si le processeur écrit dans la mémoire vidéo au mauvais moment. Si le processeur écrit en VRAM pendant l'affichage d'une image, les pixels ne sont pas affichés. Des écritures processeur trop longues peuvent causer des lignes noires à l'écran. Une autre solution donne la priorité au VDC. Pour cela, plusieurs méthodes sont utilisées : l'arbitrage, le ''pooling'' et les interruptions. La première réutilise le circuit d'arbitrage mentionné plus haut, qui gère les accès simultanés, sauf qu'il donne la priorité au VDC sur le processeur. Quand le VDC lit des pixels à afficher dans la VRAM, le processeur ne peut pas écrire en VRAM, il doit attendre que le VDC libère la RAM vidéo. Si le VDC démarre une lecture, alors que le processeur accédait déjà à la VRAM, le processeur perd la main et la VRAM est réservée au VDC. L'avantage est que les artefacts graphiques de la technique précédente disparaissent. Le désavantage est que la technique demande d'utiliser plus de circuits, elle a un cout en transistors un peu plus important. Ajouter des circuits d'arbitrage est une solution bien maitrisée. Après tout, la plupart des bus disposent de mécanismes d'arbitrage, pour éviter que les composants branchés dessus se marchent sur les pieds. Mais les bus VRAM ne sont pas dans ce cas. La raison est que la mémoire vidéo est partagée entre un processeur et un VDC, ce qui n'est pas beaucoup. Si le bus VRAM était partagé avec une dizaine de composants, ça vaudrait la peine d'ajouter un circuit d'arbitrage. Mais pour seulement deux composants, le cout en circuit est trop important. Le '''''pooling''''' est une solution alternative qui ne requiert pas l'ajout de circuits d'arbitrage. A la place, elle utilise le registre d'état du VDC. L'idée est que le registre de statut du VDC indique si celui-ci accède à la mémoire vidéo. Plus précisément, il contient un bit qui précise que l'écran est en train d'afficher une ligne. Il est appelé le '''bit de ''blanking'' horizontal'''. En général, ce bit est à 0 quand le VDC est en train de transmettre une ligne à l'écran, à 1 quand la mémoire vidéo est libre. Avant d’accéder à la mémoire vidéo, le processeur vérifie ce registre pour savoir si la mémoire vidéo est occupée ou non. Si c'est le cas, le processeur attend que la mémoire vidéo soit libre. Sinon, le processeur accéde à la mémoire vidéo. : Notons que ce signal n'est pas équivalent au signal HSYNC. Pour reprendre l'exemple du standard VGA, il y a deux temps d'attente avant et après l'envoi du signal HSYNC, où l'écran n'envoie pas de données. Le signal HSYNC est alors à 0, alors que le bit de ''blanking'' est bien à 1. ===La synchronisation CPU-VDC via ''raster interrupts''=== L'usage d'un bit de ''blanking'' permet au VDC de prévenir le processeur qu'il ne peut pas écrire en RAM vidéo. Mais les VDC de ce type sont assez rudimentaires. Une autre solution part du principe que l'affichage d'une image se fait à fréquence régulière. La carte d'affichage accède à la mémoire vidéo durant un certain temps pour envoyer l'image à l'écran, mais la laisse libre le reste du temps. Par exemple, sur un écran à 60 Hz, une image est rendue toutes les 16.66666 millisecondes. Pendant ces 16.66666 millisecondes, la carte d'affichage accède à la RAM vidéo pendant 1 à 10 millisecondes, le reste du temps est laissé au processeur. De même, il y a un certain temps de libre entre l'affichage de deux lignes, le temps que le canon à électron du CRT se repositionne au début de la ligne suivante. Cela laissait un petit peu de temps au processeur pour changer la configuration de la carte graphique, par exemple pour changer la palette de couleur, changer des ''sprites'', écrire dans la mémoire vidéo, ou tout autre chose. Le tout est très utile pour rendre certains effets graphiques. Pour utiliser au mieux ces temps libres, le VDC utilise une technique appelée les interruptions matérielles. Pour rappel, les '''interruptions''' sont des fonctionnalités du processeur, qui interrompent temporairement l’exécution d'un programme pour réagir à un événement extérieur (matériel, erreur fatale d’exécution d'un programme…). Lors d'une interruption, le processeur suit la procédure suivante : * arrête l'exécution du programme en cours et sauvegarde l'état du processeur (registres et ''program counter'') ; * exécute un petit programme nommé '''routine d'interruption''' ; * restaure l'état du programme sauvegardé afin de reprendre l'exécution de son programme là ou il en était. [[File:Interruption processeur.png|centre|vignette|upright=2|Interruption processeur]] Les interruptions matérielles, aussi appelées '''IRQ''', sont des interruptions déclenchées par un périphérique et ce sont celles qui vont nous intéresser dans ce qui suit. Les IRQ qui nous intéressent sont générées par la carte graphique quand c'est nécessaire. Pour que la carte graphique puisse déclencher une interruption sur le processeur, on a juste besoin de la connecter à une entrée sur le processeur, appelée l''''entrée d'interruption''', souvent notée INTR ou INT. Lorsque la carte graphique envoie un 1 dessus, le processeur passe en mode interruption. : Si vous avez déjà lu un cours d'architecture des ordinateurs, vous savez sans doute que les choses sont assez compliquées, qu'un ordinateur moderne contient un contrôleur d'interruption pour gérer les interruptions de plusieurs périphériques, mais nous n'avons pas besoin de parler de tout cela ici. Nous avons juste besoin de voir le cas simple où la carte graphique est connectée directement sur le processeur. Les cartes graphiques d'antan géraient plusieurs types d'interruptions, qui sont regroupées sous le terme de '''''Raster Interrupt'''''. Grâce à ces interruptions, le processeur sait quand la mémoire vidéo est libre. La plus importante s'appelle la '''''Vertical blank interrupt''''' (VBI). Elle indique que la carte graphique a fini d'afficher une image et servait à implémenter la synchronisation verticale. La ''Vertical blank interrupt'' elle était parfois utilisée pour d'autres choses qui n'ont rien à voir avec l'écran ou le rôle d'une carte graphique. Par exemple, sur les anciens ordinateurs qui ne disposaient pas de ''timers'' sur la carte mère, la VBI était utilisée pour timer les échanges avec le clavier et la souris. A chaque VBI, la routine d'interruption vérifiait si le clavier ou la souris avaient envoyé quelque chose à l'ordinateur. Le VDC contient donc une sortie dédiée aux interruptions, connectée à l'entrée d'interruption du CPU (directement ou par l'intermédiaire d'un contrôleur d'interruption). Les signaux de ''raster interrupt'' ne sont pas identiques aux signaux de synchronisation verticale et horizontale, ni aux signaux de ''blanking'', même s'ils se ressemblent. La différence est que les signaux de synchronisation verticale/horizontale ont des contraintes de timing différents. Par exemple, le standard VGA impose que ces deux signaux soient maintenus durant un certain temps à l'écran, alors que les ''raster interrupts'' sont remises à zéro dès que le processeur est a pris en compte. L'usage de ''raster interrupts'' est très efficace, mais a pour défaut de beaucoup utiliser le processeur. Diverses optimisations permettent de se passer de ''raster interrupts'', ou du moins d'en réduire le cout en performance. Mais ces techniques demandent de modifier la mémoire vidéo, précisément la manière dont le processeur communique avec la mémoire vidéo. Nous allons voir ces techniques dans ce qui suit. ===Le ''cycle stealing'' et le ''cycle interleaving''=== Une solution alternative élimine totalement les ''raster interrupts'', le ''pooling'' ou toute technique d'arbitrage entre VDC et processeur. Elle fait en sorte que la moitié des cycles d'horloge de la mémoire soit réservé au processeur, l'autre à la carte d'affichage. En clair, on change d’utilisateur à chaque cycle : si un cycle est attribué au processeur, le suivant l'est à la carte d'affichage. L'implémentation utilise une mémoire qui va à une fréquence double de celle du processeur et de la carte d'affichage, les deux étant cadencés à la même fréquence. Les fréquences du CPU et de la carte d'affichage étaient décalées d'une moitié de cycle, ce qui fait que leurs cycles correspondaient à des cycles mémoire différents. Un exemple est celui du micro-ordinateur BBC Micro, qui avait une fréquence de 4 MHz avec un processeur à 2 MHz et une carte d'affichage de 2 MHz lui aussi. Elle était autrefois beaucoup utilisée avec les processeurs Motorola, comme le Motorola 6800 et le MOS 6502, car ils avaient des particularités qui rendaient cette technique facile à implémenter. La particularité principale était qu'ils accédaient à la mémoire lors de la moitié d'un cycle d'horloge, laissant l'autre moitié libre. Pour être plus précis, le signal d'horloge sur ces processeur passe la moitié du temps à 1, l'autre moitié à 0. Les deux processeurs accédaient à la mémoire quand le signal d'horloge était à 0, laissant la mémoire libre quand le signal d'horloge est à 1. Typiquement, le processeur et le VDC allaient à 1 MHz, et étaient relié à une mémoire RAM allant à 2 MHz. Les premiers ordinateurs Apple utilisaient cette technique, sauf qu'ils n'avaient pas de mémoire vidéo séparée. Par exemple, l'Apple 2 avait une mémoire RAM unique, de 4 à 64 kilooctets, partagée entre le processeur et la carte d'affichage. Une petite partie était utilisée comme mémoire vidéo, le reste était utilisé par les programmes et le système d'exploitation. Le VDC adressait la RAM directement, tout comme le processeur. Un point intéressant est que le VDC s'occupait aussi du rafraichissement mémoire de la RAM. Il balayait la mémoire vidéo lors de l'affichage d'une image, mais balayait le reste de la mémoire entre deux images. Et tout cela était en réalité fait en une seule passe, les timings étaient prévus pour. Sur le Macintosh 128K, le processeur était un Motorola 68000 et la RAM passait à 128 kilo-octets, mais une organisation similaire était utilisée. Encore une fois, la RAM faisait à la fois RAM système et mémoire vidéo. pendant l'affichage d'une image, le VDC et le processeur se passaient la main tous les 4 cycles. Le VDC lisait la RAM pendant 4 cycle, puis le processeur lisait/écrivait durant 4 cycles, et ainsi de suite. Par contre, le processeur avait un accès exclusif à la RAM entre l'affichage de deux images. ===L'usage de tampons de synchronisation FIFO=== Une dernière solution est l'usage de mémoires tampon entre le processeur et la mémoire vidéo. Le processeur n'écrivait pas directement dans la mémoire vidéo, mais dans une mémoire intermédiaire. La mémoire intermédiaire est une '''mémoire FIFO''', à savoir qu'elle mémorise les données à écrire et leur adresse dans leur ordre d'arrivée. Elle sert à mettre en attente les accès mémoire du processeur tant que la mémoire vidéo est occupée. Ainsi, si la mémoire vidéo est libre, le processeur peut écrire directement dans la mémoire vidéo, sans intermédiaire. Mais si la carte d'affichage accède à la mémoire vidéo, les écritures du processeur sont mises en attente dans la mémoire FIFO. Elles s'accumulent tant que la mémoire vidéo est occupée, elles sont conservées dans l'ordre d'envoi par le processeur. Dès que la mémoire vidéo se libère, les données présentes dans la FIFO sont écrites dans la mémoire vidéo, au rythme d'une écriture par cycle d'horloge de la VRAM : la mémoire FIFO se vide progressivement. Si la mémoire FIFO est pleine, elle prévient le processeur en lui envoyant un bit/signal, et le processeur agit en conséquence en cessant les écritures et en se mettant en pause. [[File:FIFO d'écriture en mémoire vidéo.png|centre|vignette|upright=2|FIFO d'écriture en mémoire vidéo]] Sur les cartes d'affichage, le processeur n'adresse pas la mémoire vidéo directement. A la place, le processeur envoie des données sur le bus, sur le connecteur de la carte d'affichage. La carte d'affichage récupère les données transmises sur le bus et les mets en attente dans une mémoire FIFO assez similaire. Elle les écrit en mémoire vidéo si besoin quand elle est libre. En conséquence, les cartes graphiques modernes n'ont pas besoin de ''raster interrupts'', qui étaient utilisées sur les premiers PC ou les premières consoles. A la place, c'est la carte graphique qui s'occupe de tout, et notamment son circuit de contrôle qui gère la mémoire vidéo. D'ailleurs, c'est ce circuit de contrôle qui gère la synchronisation verticale, pas le processeur, pas besoin de ''vertical blanking interrupt''. ==La génération des signaux de commande pour l'écran== Les VDC contiennent tous de quoi générer les signaux de commande à destination de l'écran, ainsi que des signaux d'interruption à destination du processeur. Le premier signal à générer est le signal d'horloge transmission des pixels, à savoir le signal d'horloge dont la période est égale au temps mis pour envoyer un pixel à l'écran. Ce signal est souvent transmis à l'écran, via un fil dédié. Les VDC contiennent de quoi générer cette fréquence, grâce à un circuit oscillateur dédié. Il faut aussi générer les signaux de synchronisation verticale/horizontale, ainsi que les ''raster interrupts''. Et ils se trouve que les deux sont générés par les mêmes circuits, à peu de choses près. Dans ce qui va suivre, nous allons voir comment sont générés ces signaux, quels sont les circuits qui s'en chargent. Ils sont assez simples : ce sont de simples compteurs reliés à des comparateurs ! ===La génération des signaux de synchronisation verticale/horizontale=== Le VDC gère les signaux de synchronisation verticale ou horizontale. Pour cela, ils intègrent deux compteurs (des circuits qui comptent de 0 à N). Le premier compteur compte les lignes transmises, l'autre les pixels dans une ligne, ce qui leur vaut les noms de compteur de colonne et de compteur de ligne. Les deux compteurs sont initialisés à 0 avant la transmission et sont incrémentés automatiquement quand on passe d'un pixel à l'autre, ou bien d'une ligne à l'autre. Quand le compteur atteint la valeur adéquate, il émet un signal de synchronisation verticale/horizontale. Au passage à la ligne suivante, le compteur de colonne est réinitialisé à 0, idem pour le compteur de ligne quand une image a été affichée totalement. Ils sont configurés de manière à prendre en compte la résolution de l'écran, mais pas de la manière dont vous le pensez. Par exemple, pour une résolution de 640 par 480 : vous imaginez sans doute que le compteur de colonne est configuré pour compter de 0 à 639, alors que l'autre compte de 0 à 479. Par exemple, pour une résolution de 640 par 480, les deux compteurs sont initialisés à 0. Le compteur de colonne est incrémenté à chaque envoi de pixel, et il déclenche le signal de synchronisation horizontale une fois que le compteur atteint 640. Le compteur de colonne est alors réinitialisé après un certain temps, alors que le compteur de ligne est incrémenté. Le compteur de ligne est donc incrémenté à chaque nouvelle ligne. De plus, il émet un signal de synchronisation verticale quand il atteint 480, et est réinitialisé après cela. Il est possible de faire ainsi, mais ce n'est pas la solution idéale. En réalité, il faut tenir compte du fait que les signaux de HSYNC et VSYNC, qui sont eux aussi générés par les deux compteurs. Imaginons que le signal HSYNC prenne 20 cycles d'horloge, et le signal VSYNC 150 cycles. Pour une résolution de 640 par 480, on utilise un compteur de colonne qui compte de 0 à 640 + 20, et un compteur de ligne qui compte de 0 à 480 + 150. L'idée est d'utiliser des comparateurs pour générer les signaux HSYNC et VSYNC, un pour le signal HSYNC et un autre pour le signal VSYNC. En reprenant les valeurs mentionnées précédemment, on utilise un comparateur qui vérifie si le compteur de colonne est supérieur ou égal à 640, et un autre comparateur qui vérifie si le compteur de ligne est égal ou dépasse 480. La sortie des deux comparateurs fournit directement les signaux HSYNC et VSYNC. Une autre solution remplace les comparateurs par une mémoire ROM. L'idée est d'envoyer les compteurs sur l'entrée d'adresse, la ROM fournit en sortie les signaux de commande destinés à l'écran. En remplissant la ROM avec les valeurs adéquates, la technique fonctionne à merveille et on peut se passer des circuits comparateurs. Pour les haute résolutions, il est possible d'utiliser deux ROMs : une pour le compteur de ligne, une pour le compteur de colonne. Le VDC peut gérer plusieurs résolutions différentes, et les ''timings'' sont différents suivant les résolutions. Idéalement, il faut envoyer quelques bits de commande pour choisir la résolutions en entrée de la mémoire ROM pour choisir les bons timings. Avec des comparateurs, la technique demande d'utiliser les mêmes comparateurs, mais d'ajouter des circuits pour gérer les différentes résolutions. ===L'exemple des timings du standard VGA=== Reprenons l'exemple du standard VGA. Avec ce standard, il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. De plus, on devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] Le compteur de colonne est cadencé à une fréquence bien précise, qui détermine le temps mis pour passer d'un pixel à l'autre. Le temps de transmission d'un pixel est de 25,6 µs / 640 = 0,04 µs, ce qui correspond à une fréquence de 25 MégaHertz. Et cela permet d'implémenter facilement les deux temps d'attente avant et après l'affichage d'une ligne. Les temps d'attente de 1,54 et 0,64 µs correspondent respectivement à 38 et 16 cycles du compteur, la durée de 3,8 µs du signal H-sync correspond à 95 cycles. En tout, cela fait 640 + 95 + 16 + 38 = 789. Il faut donc un compteur qui compte de 0 à 788. La transmission des pixels commence quand le compteur commence à compter. Puis, le compteur continue de compter pendant 0,64 µs alors qu'aucun pixel n'est envoyé, afin de gérer le temps d'attente après le signal H-sync. Puis, au 640 + 16ème cycle, le signal H-sync est généré pendant 95 cycles. Enfin, le compteur continue de compter pendant 38 cycles pour le second temps d'attente, avant le prochain envoi de ligne. Le signal H-sync est donc généré quand le compteur a une valeur comprise entre 656 et 751 : il suffit d'ajouter un comparateur qui vérifie si le compteur est dans cet intervalle, et donc la sortie est à zéro si c'est le cas. L'adresse n'est pas calculée si le compteur n'a pas une valeur comprise entre 0 et la largeur indiquée par la résolution. La même logique s'applique avec le signal V-sync, mais avec des timings différents, illustrés plus haut. Pour implémenter tout cela, il suffit de combiner les deux compteurs avec des circuits comparateurs, qui vérifient si la valeur du compteur est dans tel ou tel intervalle. Il faut au minimum deux circuits comparateurs, un pour le signal HSYNC, un autre pour le signal VSYNC. D'autres compteurs peuvent être utilisés pour générer les bits de ''blanking'' ou pour réinitialiser le compteur à la valeur adéquate. Les comparateurs peuvent être remplacés par une mémoire ROM, comme dit plus haut. [[File:VGACmptFig2.png|centre|vignette|upright=2|Circuit de gestion des timings H-sync et V-sync d'un écran VGA.]] ===La génération des ''raster interrupts'' et des bits de ''blanking''=== Les mêmes compteurs ou la ROM sont souvent utilisés pour générer les ''raster interrupts'' et le bit de ''blanking'', qui permettent de prévenir le processeur quand la carte d'affichage a terminé d'envoyer une ligne et/ou une image entière à l'écran. Notons qu'il est possible d'implémenter les interruptions à partir du bit de ''blanking'', cela demande juste aux compteurs de générer ce bit de ''blanking'' et de l'utiliser pour générer les ''raster interrupt''. Au passage, les compteurs de ligne et colonne ne servent pas qu'à générer des signaux : on verra dans la section sur le CRTC que quand on dispose de ces deux compteurs, ajouter de quoi parcourir le ''framebuffer'' est trivial ! <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage | prevText=Les cartes d'affichage | next=Les systèmes à framebuffer | nextText=Les systèmes à framebuffer }}{{autocat}} </noinclude> qu715sabnc1cw61bng3c4okc2imomcp 764899 764898 2026-04-24T18:00:57Z Mewtow 31375 /* L'exemple du standard VGA */ 764899 wikitext text/x-wiki Dans les années 70-80, un système vidéo pouvait être fabriqué de deux grandes manières différentes. La première concevait la carte d'affichage à partir de composants très simples, comme des portes logiques ou des transistors, à partir de zéro, sans réutiliser de matériel existant. De telles cartes vidéos avaient des performances et des fonctionnalités très variables, mais étaient très complexes à concevoir et coutaient cher. La seconde catégorie utilisait des '''''Video Display Controler ''''' (VDC), des circuits déjà tout près, placés dans un boitier, produits en masse, qu'il suffisait de compléter avec une mémoire vidéo et quelques autres circuits pour obtenir un système vidéo. De tels circuits permettaient d'obtenir des performances décentes, voire très bonnes, pour un prix nettement inférieur. Les deux fonctionnent de la même manière, peu importe qu'il s'agisse d'un VDC ou d'un circuit fait main. Les deux contiennent globalement les mêmes circuits, ils fonctionnent de la même manière. Dans le chapitre sur les cartes d'affichage, nous avons vu qu'une carte d'affichage contient trois à quatre circuits distincts : un ''framebuffer'', un circuit de contrôle, le circuit d’interfaçage électrique avec l'écran (le RAMDAC) et éventuellement une connexion avec le bus. Le VDC correspond au circuit de contrôle. Les fonctionnalités d'un VDC sont très variables. Ils s'occupent des choses de base, comme gérer la résolution, l'envoi de l'image à afficher à l'écran, ce genre de choses. Il ne s'occupe pas de la transmission avec le bus, il ne gère pas vraiment l’interfaçage électrique. [[File:Architecture d'une carte d'affichage avec VDC.png|centre|vignette|upright=1.5|Architecture d'une carte d'affichage avec VDC]] Si la plupart des VDC communiquent avec la mémoire vidéo, il existe quelques exceptions qui se débrouillent sans mémoire vidéo, comme les ''Video shifters'' dont nous parlerons dans quelques chapitres. La meilleure manière d'aborder les VDC est de d'abord les voir comme des espèces de boite noire, dont on ne se préoccupe pas du contenu en premier lieu. Un VDC communique avec l'écran, le processeur et avec la mémoire vidéo. Dans ce chapitre, nous allons voir comment il communique avec l'écran et le processeur. Nous laissons de côté l'interface avec la mémoire vidéo, car elle dépend du VDC et n'est pas la même selon que la carte d'affichage utilise ou non un ''framebuffer''. Le tout est illustré ci-dessous. L'interface VDC-écran correspond aux flèches en rouge et sera vue dans la première section. L'interface VDC-processeur correspond aux flèches en bleu et est le sujet de la seconde section. Enfin, l'interface entre mémoire vidéo et processeur correspond aux flèches en vert. En soi, elle n'est pas liée directement au VDC, mais nous allons quand même la voir dans ce chapitre. [[File:Interface VDC.png|centre|vignette|upright=2|Interface d'un VDC.]] ==L'interface du VDC avec l'écran== <noinclude>[[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]]</noinclude> Un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Les écrans LCD sont bel et bien conçus comme cela, c'est plus compliqué sur les écrans CRT, mais cela ne change rien du point de vue de la carte graphique. Chaque pixel est localisé sur l'écran par deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. ===Le balayage progressif et l'entrelacement=== L'écran peut afficher une image en utilisant deux modes principaux : le balayage progressif, et le balayage entrelacé. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. Le balayage progressif est utilisé sur tous les écrans LCD moderne, mais il était plus adapté aux écrans CRT. Sur les écrans plats, l'image est transmise à l'écran, mais est affichée une fois qu'elle est intégralement reçue, d'un seul coup. Mais sur les anciens écrans de télévision, les choses étaient différentes. Les vieux écrans CRT fonctionnaient sur ce principe : un canon à électrons balayait l'écran en commençant en haut à gauche, et balayait l'écran ligne par ligne. Ce ''scan progressif'' de l'image faisait apparaître l'image progressivement et profitait de la persistance rétinienne pour former une image fixe. L'image était donc affichée en même temps qu'elle était envoyée et le scan progressif correspondait à l'ordre d'allumage des pixels à l'écran. [[File:CRT color.png|centre|vignette|upright=2|Intérieur d'un écran CRT. En 1, on voit le canon à électron. En 2, on voit le faisceau d'électron associé à chaque couleur. En 3, les faisceaux d'électrons sont déviés par des électroaimants, pour atterrir sur le pixel à éclairer. En 4, le faisceau d'électrons frappe la surface de l'écran, composée de phosphore, qui s'illumine alors. En 5, on voit que les trois faisceaux ne frappent exactement au même endroit : l'un frappe sur une zone colorée en bleu, l'autre sur du vert, l'autre sur du rouge. Les trois zones combinées affichent une couleur par mélange du rouge, du vert et du bleu. Ne vous trompez pas : le faisceau d'électron n'a pas de couleur, comme indiqué sur le schéma, la couleur a été ajoutée pour faire comprendre qu'un faisceau est dirigé sur les pixels rouges, un autre sur les pixels bleus, et l'autre sur les pixels verts.]] [[File:CRT image creation animation.gif|vignette|upright=0.5|Illustration de l'entrelacement.]] La technique du balayage progressif n'avait pas de défauts particuliers, ce qui fait que tous les écrans d’ordinateurs CRT l'utilisait. Mais les télévisions de l'époque utilisaient une méthode différente, appelée l''''entrelacement'''. Avec elle, l'écran faisait un scan pour les lignes paires, suivi par un scan pour les lignes impaires. Le tout est illustré dans l'animation ci-contre. <noinclude>[[File:Interlace zoom.gif|vignette|Illustration de l'entrelacement et de ses effets sur la perception.]]</noinclude> L'entrelacement donne l'illusion de doubler la fréquence d'affichage, ce qui est très utile sur les écrans à faible fréquence de rafraîchissement. Pour comprendre pourquoi, il faut comparer ce qui se passe entre un écran à scan progressif non-entrelacé et un écran entrelacé. Avec l'écran non-entrelacé, l'image met un certain temps à s'afficher, qui correspond au temps que met le canon à électron à balayer la totalité de l'écran, ligne par ligne. Avec l'entrelacement, le temps mis pour balayer l'écran est le même, car le nombre de lignes à balayer reste le même, seul l'ordre change. Sur l'écran entrelacé, l'image s'affiche à moitié une première fois (sur les lignes paires) avant que l'image complète s'affiche. La moitié d'image affichée par l'écran entrelacé a une résolution suffisante pour que le cerveau humain soit trompé et perçoive une image presque complète. En clair, le cerveau verra deux images par balayage complet : une image partielle lors du balayage des lignes paires et une image complète lors du balayage des lignes impaires. Sans entrelacement, le cerveau ne verra qu'une seule image lors de chaque balayage complet. L'effet est d'autant plus important que la résolution verticale (le nombre de lignes) est important. De plus, l'effet est encore plus important si l'ordinateur calcule un grand nombre d'images par secondes. Par exemple, pour un écran avec une fréquence de rafraîchissement de 60 Hz et un jeu vidéo qui tourne deux fois plus vite (à 120 images par secondes, donc), l'image sur les lignes impaires sera plus récente que celle sur les lignes paires. Le cerveau humain sera sensible à cela et verra une image plus fluide (bien qu'imparfaitement fluide). Le nombre de lignes est toujours impair (normes analogiques : 625 en Europe, 525 en Amérique), ce qui fait un nombre non entier de lignes pour chacune des 2 trames (impaires et paires). Par exemple, pour 625 lignes cela fait {{formatnum:312.5}} lignes par trame. Le balayage vertical étant progressif durant le balayage horizontal, les lignes sont imperceptiblement penchées. À la fin du balayage d'une trame, le rayon se retrouve au milieu de la ligne horizontale, soit un décalage vertical d'une demie-ligne (voir image ci-dessous). [[Fichier:Balayage entrelace affichage trames.svg|center|500px|class=transparent|Entrelacement sur tube cathodique.]] ===La fréquence de rafraichissement=== Même si cela commence à changer de nos jours, l'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de '''fréquence de rafraîchissement'''. Pour un écran avec une fréquence de rafraîchissement de 60 Hz (60 images par secondes), la carte graphique doit envoyer une nouvelle image tous les (1 seconde / 60) = 16,666... millisecondes. Sur les écrans LCD, la fréquence de rafraîchissement ne dépend pas de la résolution utilisée, en raison de différences de technologie. Sur les anciens écrans CRT, la fréquence de rafraîchissement dépendait de la résolution utilisée, et la carte d'affichage devait alors gérer le couple résolution-fréquence elle-même et la gestion de la fréquence de rafraîchissement était donc plus compliquée. Depuis environ 2016, quelques écrans supportent une '''fréquence de rafraichissement variable'''. Variable dans le sens : peut varier entre une fréquence minimale et une fréquence maximale selon les besoins. L'écran reçoit des images de part de la carte graphique, et les affiche immédiatement, sans attendre un signal de synchronisation vertical de fréquence fixe. Tant que la carte d'affichage ne va pas trop vite, l'écran suit, il affiche les images dès qu'il les reçoit. Par contre, au-delà d'un certain flux d'image, il bloque à une fréquence de rafraichissement maximale. Les bénéfices d'une fréquence de rafraichissement variable sont nombreux. Déjà, le temps de latence est réduit, l'''input lag'' si cher aux joueurs compétitifs est réduit de quelques millisecondes. De plus, la qualité d'image est améliorée du fait de l'absence de ''screen tearing'' sur lequel on reviendra plus tard. ===La gestion des timings pour la communication avec l'écran=== Le câble qui relie la carte graphique à l'écran transmet au mieux un seul pixel à la fois, voire un seul bit à la fois. On ne peut pas envoyer l'image d'un seul coup à l'écran, et on doit l'envoyer pixel par pixel. L'écran traite alors ce flux de pixels de deux manières différentes. Dans le cas des écrans LCD, le plus intuitif, l'écran accumule les pixels reçus dans une mémoire tampon et affiche l'image une fois qu'elle est totalement reçue. Pour les écrans CRT, l'écran affiche les pixels reçus immédiatement dès leur réception sur l'entrée. Dans les deux cas, il faut envoyer les pixels dans un certain ordre bien précis. Un point important est que la carte graphique ne peut pas envoyer un flux de pixels n'importe quand et doit respecter des timings bien précis. Le flux de pixel envoyé à l'écran est souvent structuré d'une certaine manière, avec des temps de pause, un temps de maintien minimum pour chaque pixel, etc. Déjà, il faut tenir compte des timings liés à la transmission de l'image elle-même. La carte graphique doit envoyer les pixels avec des timings tout aussi stricts, qui dépendent du standard vidéo utilisé. Chaque pixel doit être maintenu durant un certain temps bien précis, il y a un certain temps entre la transmission de deux pixels, etc. Et le circuit d’interfaçage doit gérer le '''temps de transmission d'un pixel'''. Pour cela, le VDC envoie un signal d'horloge dont la période correspond au temps de transmission/affichage d'un pixel. En, clair, le VDC envoie un pixel à chaque cycle d'horloge. Ensuite, il faut prévenir l'écran qu'on a fini de transmettre une image avec un '''signal de synchronisation verticale''', qui indiquait à l'écran qu'une image entière vient d'être transmise. Le VDC transmet l'image pixel par pixel, et lève ce signal de synchronisation verticale une fois l'image intégralement transmise. Ce signal était transmis sur un fil spécialisé, qu'on trouve sur la plupart des connecteurs VGA. De nos jours, sur les standards HDMI, DisplayPort, et autres, les choses sont plus compliquées, mais ce signal est quand même transmis, bien que pas forcément sur un fil spécialisé. Enfin, il faut aussi tenir compte d'autres timings pour gérer la résolution. Les pixels sont envoyés ligne par ligne, mais une ligne de pixel n'a pas la même taille suivant la résolution : 640 pixels pour du 640 × 480, 1280 pour du 1280 × 1024, etc. La carte graphique doit donc indiquer quand commencent et se terminent chaque ligne dans le flux de pixels. Sans cela, on ne pourrait pas gérer des résolutions différentes. Pour cela, le VDC envoie un '''signal de synchronisation horizontale''' une fois qu'il a fini d'envoyer une ligne. En tout, cela fait au minimum trois signaux : une horloge pour la transmission des pixels, un signal de synchronisation verticale, et un signal de synchronisation horizontale. Sans cela, impossible d'envoyer des pixels à l'écran ou de gérer la résolution convenablement. Et il y a d'autres contraintes de timings dont nous parlerons plus bas, qui ne sont pas évidentes pour le moment. Par exemple, sur les écrans CRT, il y a un temps de latence à la fin d'une ligne pour que le canon à électron se déplace sur le début de la ligne suivante. Et cela impose de ne pas démarrer l'envoie de la ligne suivante avant un certain temps. Cela il n'existe plus sur les écrans LCD, mais il fallait le prendre en compte à l'époque. ===L'exemple du standard VGA=== Un bon exemple est le standard VGA, qui était le seul utilisé pour connecter les écrans CRT, mais qui est encore utilisé de nos jours sur les écrans LCD. Avec ce standard, le connecteur contenait trois fils R, G, et B pour envoyer la couleur, codée en analogique. Il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. Jusque là, rien de surprenant, c'est une redite de ce qu'on a dit plus haut. On trouve aussi plusieurs fils pour la masse, à savoir le 0 Volt, ainsi qu'une tension d'alimentation. Il y a une masse générale, ainsi que plusieurs masses, une par signal RGB. Et enfin, il faut citer la connexion DDE/DDC qui permet de communiquer des informations de configuration à l'écran. Quand vous branchez l'écran à une carte graphique, celle-ci communique avec l'écran pour savoir quelles sont les résolutions supportées, quelle fréquence de rafraichissement est supporté, si l'écran supporte des couleurs 32 bits, etc. Sans cela, impossible de configurer la résolution. Pour cela, l'écran contient une petite mémoire ROM, dont le contenu est standardisé, qui contient toutes les informations nécessaires pour configurer l'écran.LA carte graphique lit cette ROM en passant par un bus appelé le bus '''''Display Data Channel''''', qui permet à la carte graphique de lire cette ROM, d'interroger l'écran sur les résolutions et fonctionnalités supportées. Le bus est un dérivé du bus I²c, et a trois fils dédiés : un pour l'horloge, l'autre pour la transmission des données, et une masse dédiée. <noinclude>[[File:EMacVGA.png|centre|vignette|upright=2|Connecteurs VGA]]</noinclude> Les premières subtilités du standard VGA viennent des timings des signaux HSYCN et VSYNC. Le signal HSYNC n'est pas envoyé dès la fin de la ligne : il y a un temps d'attente de quelques microsecondes entre la fin de la ligne et l'envoie du signal HSYNC. Le signal HSYNC est maintenu durant quelques microsecondes, la durée d'envoi est fixe. Puis, on a encore un nouveau temps d'attente avant l'envoi de la prochaine ligne, durant lequel le signal HSYNC n'est pas envoyé. Durant ces trois périodes (deux temps d'attentes, envoi de HSYNC), aucun pixel n'est envoyé à l'écran. [[File:VGA 640×480 horizontal timings.svg|centre|vignette|upright=2|VGA 640×480 horizontal timings. Les durées vertes et jaunes sont des temps d'attentes où rien n'est envoyé sur le connecteur, rouge correspond à l'envoi du signal HSYCN, bleu est l'envoi de la ligne.]] Et il y a la même chose avec les signaux VSYNC, même si les timings sont différents. On devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] ==L'interface entre le processeur et le VDC== Pour le processeur, le VDC a une interface similaire à celle de n'importe quel périphérique : un paquet de registres, et éventuellement de la RAM. La mémoire vidéo peut être intégrée dans le VDP ou être séparée, les deux sont possibles. Mais nous allons partir du principe que la mémoire vidéo est séparée. Dans cette section, nous allons voir ce qui a trait aux échanges entre CPU et VDC proprement dit, la communication VDC-VRAM sera le sujet d'une section ultérieure. ===L'interface entre processeur et mémoire vidéo=== La mémoire vidéo est généralement visible par le processeur, à savoir qu'il peut lire ou écrire dedans. Il existe plusieurs méthodes pour cela, mais celle utilisée sur le hardware ancien est celle des '''entrée-sorties mappées en mémoire''', que vous connaissez sans doute si vous avez déjà lu un cours d'architecture des ordinateurs. L'idée est que le processeur utilise la même interface pour la mémoire RAM et les périphériques. Des adresses mémoire sont détournées : elles ne pointent plus vers la mémoire RAM, mais vers la mémoire vidéo, la mémoire de la carte son, etc. Le processeur peut donc lire ou écrire directement dans la mémoire vidéo. Des circuits sur la carte mère s'occupent de ce détournement. Toute lecture ou écriture dans une adresse détournée est interceptée par la carte mère et redirigée vers le bus adéquat. [[File:Espace d'adressage classique avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2|Espace d'adressage classique avec entrées-sorties mappées en mémoire]] ===Les registres de configuration du VDC=== La programmation d'un VDC se fait par en configurant des '''registres de configuration''', qui permettent de configurer la résolution, la fréquence d’affichage, la position du curseur de souris, etc. Le processeur a juste à écrire dans ces registres, pour configurer la carte d'affichage comme souhaité. Le VDC incorpore presque toujours un '''registre d'état''', ou un '''registre de statut''' qui permet au processeur de connaitre l'état du VDC. Il permet de savoir si le VDC est libre, s'il est en train d'afficher une ligne, si une erreur a eu lieu et laquelle. Chaque bit du registre de statut a une interprétation fixée à l'avance et fournit une information précise. Le processeur a juste à lire le registre en question, pour vérifier l'état de la carte graphique. Plusieurs bits du registre de statut sont réservés au traitement des erreurs. Si le VDC rencontre une erreur, il met une valeur bien précise dans ces bits, appelée le '''code d'erreur'''. Typiquement, la valeur 0 indique qu'il n'y a pas d'erreur, les autres valeurs précisent une erreur. Le code d'erreur dépend de l'erreur en question et du VDC, il n'y a pas de standard pour ça. En général, les registres de configuration sont accessibles directement par le processeur, comme l'est la mémoire vidéo. Des adresses mémoire sont détournées pour pointer, non pas vers la mémoire RAM, mais vers les registres de configuration. Dans le cas le plus simple, il y a une adresse mémoire par registre, le processeur a juste à écrire dans cette adresse pour configurer le registre. Cependant, cette méthode ne marche pas trop bien s'il y a trop de registres de configuration. Par exemple, les cartes graphiques VGA intègrent plus de 300 registres de configuration, chacun faisant plusieurs octets. Il faudrait alors détourner presque un kilo-octet de mémoire, ce qui est un peu beaucoup. Pour éviter cela, les registres ne sont pas mappés directement en mémoire RAM, mais passent par un intermédiaire. L'adressage des registres de configuration se fait via une adresse unique, partagée entre tous les registres de configuration. Toute écriture ou lecture dans cette adresse est redirigée vers le bon registre, grâce à un mécanisme d'indicage qu'on va détailler immédiatement. Les registres de configuration sont numérotés, afin de pouvoir les adresser. Le numéro en question est appelé un '''indice de registre'''. La configuration d'un registre se fait en deux temps : le processeur écrit le numéro du registre à configurer, puis la donnée à écrire. La carte graphique reçoit ces deux informations l'une après l'autre, et les utilise pour configurer le registre elle-même. Un défaut de cette approche est que configurer le VDC demande deux instructions : une pour écrire l'indice/numéro, une autre pour écrire la donnée. C'est deux fois plus que si on avait des registres de configuration mappés en mémoire. Par contre, le tout est beaucoup plus économe en adresses mémoire détournées. Pour donner un exemple réel, prenons les cartes graphiques qui respectent le standard VGA. Une carte VGA contient plusieurs centaines de registres. Heureusement, ils ne sont pas tous mappés en mémoire, le mécanisme décrit précédemment est utilisé en lieu et place. Pour configurer la carte VGA, le processeur envoie l'indice de registre, puis la donnée. La carte VGA récupère ces deux informations, détermine quel registre de configuration est concerné grâce à l'indice, puis effectue l'écriture de la donnée. L'écriture de l'indice et de la donnée se fait grâce à deux registres séparés : un registre d'indice et un registre de données. Les deux sont mappés en mémoire RAM. La description faite est cependant approximative. En réalité, une carte VGA dispose de 4 paires de registres, chaque paire contenant un registre d'indice et un registre de données. La raison est que le standard VGA est le successeur du standard EGA, avec lequel il maintient une certaine compatibilité descendante. Or, une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : un CRTC, un RAMDAC, un ''Sequence Controller'' (SC) et un ''Graphics Controller'' (GC). Le VGA reprend cette séparation pour les registres de configuration. Il y avait donc une séparation logique entre les registres du RAMDAC, ceux du CRTC, et des deux autres circuits. Les registres du RAMDAC avait droit à une paire de registres, avec un registre d'indice et un registre pour les transferts de données, idem pour les registres du CRTC, etc. Au-delà de ça, le standard VGA impose la présence de deux registres de status, d'un registre de sortie sur lequel le processeur peut lire une donnée, et de quelques registres annexes. Après, la carte VGA pouvait intégrer tous ces registres dans un VDC unique, et beaucoup de cartes VGA ne se gênaient pas. ==La synchronisation entre CPU et VDC pour l'accès à la RAM vidéo== Un point qui va nous intéresser dans ce qui suit est la gestion des accès mémoire. Aussi bien le processeur que le VDC accèdent à la mémoire vidéo. Et ils ne faut pas qu'ils se marchent sur les pieds. Et pour cela, divers mécanismes sont implémentés. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Par double port, on veut dire qu'elles avaient deux entrée-sorties sur lesquelles on pouvait lire ou écrire leur contenu simultanément. Le premier port était connecté au processeur, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à afficher, alors que le second port était utilisé pour envoyer l'image à l'écran. Le port CPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires dont le support de stockage était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un registre capable de stocker une ligne entière. Le registre en question était un registre à décalage, à savoir un registre dont le contenu est décalé d'un rang à chaque cycle d'horloge. Le bit sortant est récupéré sur une sortie du registre, sortie qui était directement connectée au port CRT. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Le multiplexage temporel des accès mémoire=== Les mémoires double port n'étaient pas si rares, mais elles n'étaient pas la solution la plus utilisée. La majorité des micro-ordinateurs et consoles utilisaient une VRAM normale, simple port, bien plus courante et bien moins chère. Le processeur et le VDC sont alors tous deux connectés à VRAM, via un bus partagé, qui sera nommé le '''bus VRAM''' dans ce qui suit. Le processeur et le VDC ne peuvent pas accéder en même temps à la mémoire vidéo, ils doivent y accéder à tour de rôle. Et pour cela, divers mécanismes sont implémentés. La plupart du temps, le processeur n'accède pas à la VRAM, ce qui la laisse libre pour le VDC. Mais quand le processeur veut écrire dans la VRAM, il arrive que le processeur et le VDC se marchent sur les pieds, à savoir qu'ils veulent accéder à la VRAM en même temps. Pour gérer la situation, la VRAM utilise des mécanismes d'arbitrage, gérés par un circuit d'arbitrage dédié, qui gère les transferts sur le bus VRAM. La carte d'affichage et la mémoire envoient des demandes d'accès mémoire sur le bus, et elles sont ou non acceptées selon l'état de la VRAM. La solution la plus simple à implémenter donnait la priorité absolue au processeur sur le VDC. Dès que le processeur écrit dans la mémoire vidéo, celle-ci est indisponible pour le VDC. Des circuits annexes garantissent que c'est le cas. Le micro-ordinateur TRS-80 faisait ainsi. Un défaut de cette méthode est qu'elle cause des artefacts graphiques à l'écran si le processeur écrit dans la mémoire vidéo au mauvais moment. Si le processeur écrit en VRAM pendant l'affichage d'une image, les pixels ne sont pas affichés. Des écritures processeur trop longues peuvent causer des lignes noires à l'écran. Une autre solution donne la priorité au VDC. Pour cela, plusieurs méthodes sont utilisées : l'arbitrage, le ''pooling'' et les interruptions. La première réutilise le circuit d'arbitrage mentionné plus haut, qui gère les accès simultanés, sauf qu'il donne la priorité au VDC sur le processeur. Quand le VDC lit des pixels à afficher dans la VRAM, le processeur ne peut pas écrire en VRAM, il doit attendre que le VDC libère la RAM vidéo. Si le VDC démarre une lecture, alors que le processeur accédait déjà à la VRAM, le processeur perd la main et la VRAM est réservée au VDC. L'avantage est que les artefacts graphiques de la technique précédente disparaissent. Le désavantage est que la technique demande d'utiliser plus de circuits, elle a un cout en transistors un peu plus important. Ajouter des circuits d'arbitrage est une solution bien maitrisée. Après tout, la plupart des bus disposent de mécanismes d'arbitrage, pour éviter que les composants branchés dessus se marchent sur les pieds. Mais les bus VRAM ne sont pas dans ce cas. La raison est que la mémoire vidéo est partagée entre un processeur et un VDC, ce qui n'est pas beaucoup. Si le bus VRAM était partagé avec une dizaine de composants, ça vaudrait la peine d'ajouter un circuit d'arbitrage. Mais pour seulement deux composants, le cout en circuit est trop important. Le '''''pooling''''' est une solution alternative qui ne requiert pas l'ajout de circuits d'arbitrage. A la place, elle utilise le registre d'état du VDC. L'idée est que le registre de statut du VDC indique si celui-ci accède à la mémoire vidéo. Plus précisément, il contient un bit qui précise que l'écran est en train d'afficher une ligne. Il est appelé le '''bit de ''blanking'' horizontal'''. En général, ce bit est à 0 quand le VDC est en train de transmettre une ligne à l'écran, à 1 quand la mémoire vidéo est libre. Avant d’accéder à la mémoire vidéo, le processeur vérifie ce registre pour savoir si la mémoire vidéo est occupée ou non. Si c'est le cas, le processeur attend que la mémoire vidéo soit libre. Sinon, le processeur accéde à la mémoire vidéo. : Notons que ce signal n'est pas équivalent au signal HSYNC. Pour reprendre l'exemple du standard VGA, il y a deux temps d'attente avant et après l'envoi du signal HSYNC, où l'écran n'envoie pas de données. Le signal HSYNC est alors à 0, alors que le bit de ''blanking'' est bien à 1. ===La synchronisation CPU-VDC via ''raster interrupts''=== L'usage d'un bit de ''blanking'' permet au VDC de prévenir le processeur qu'il ne peut pas écrire en RAM vidéo. Mais les VDC de ce type sont assez rudimentaires. Une autre solution part du principe que l'affichage d'une image se fait à fréquence régulière. La carte d'affichage accède à la mémoire vidéo durant un certain temps pour envoyer l'image à l'écran, mais la laisse libre le reste du temps. Par exemple, sur un écran à 60 Hz, une image est rendue toutes les 16.66666 millisecondes. Pendant ces 16.66666 millisecondes, la carte d'affichage accède à la RAM vidéo pendant 1 à 10 millisecondes, le reste du temps est laissé au processeur. De même, il y a un certain temps de libre entre l'affichage de deux lignes, le temps que le canon à électron du CRT se repositionne au début de la ligne suivante. Cela laissait un petit peu de temps au processeur pour changer la configuration de la carte graphique, par exemple pour changer la palette de couleur, changer des ''sprites'', écrire dans la mémoire vidéo, ou tout autre chose. Le tout est très utile pour rendre certains effets graphiques. Pour utiliser au mieux ces temps libres, le VDC utilise une technique appelée les interruptions matérielles. Pour rappel, les '''interruptions''' sont des fonctionnalités du processeur, qui interrompent temporairement l’exécution d'un programme pour réagir à un événement extérieur (matériel, erreur fatale d’exécution d'un programme…). Lors d'une interruption, le processeur suit la procédure suivante : * arrête l'exécution du programme en cours et sauvegarde l'état du processeur (registres et ''program counter'') ; * exécute un petit programme nommé '''routine d'interruption''' ; * restaure l'état du programme sauvegardé afin de reprendre l'exécution de son programme là ou il en était. [[File:Interruption processeur.png|centre|vignette|upright=2|Interruption processeur]] Les interruptions matérielles, aussi appelées '''IRQ''', sont des interruptions déclenchées par un périphérique et ce sont celles qui vont nous intéresser dans ce qui suit. Les IRQ qui nous intéressent sont générées par la carte graphique quand c'est nécessaire. Pour que la carte graphique puisse déclencher une interruption sur le processeur, on a juste besoin de la connecter à une entrée sur le processeur, appelée l''''entrée d'interruption''', souvent notée INTR ou INT. Lorsque la carte graphique envoie un 1 dessus, le processeur passe en mode interruption. : Si vous avez déjà lu un cours d'architecture des ordinateurs, vous savez sans doute que les choses sont assez compliquées, qu'un ordinateur moderne contient un contrôleur d'interruption pour gérer les interruptions de plusieurs périphériques, mais nous n'avons pas besoin de parler de tout cela ici. Nous avons juste besoin de voir le cas simple où la carte graphique est connectée directement sur le processeur. Les cartes graphiques d'antan géraient plusieurs types d'interruptions, qui sont regroupées sous le terme de '''''Raster Interrupt'''''. Grâce à ces interruptions, le processeur sait quand la mémoire vidéo est libre. La plus importante s'appelle la '''''Vertical blank interrupt''''' (VBI). Elle indique que la carte graphique a fini d'afficher une image et servait à implémenter la synchronisation verticale. La ''Vertical blank interrupt'' elle était parfois utilisée pour d'autres choses qui n'ont rien à voir avec l'écran ou le rôle d'une carte graphique. Par exemple, sur les anciens ordinateurs qui ne disposaient pas de ''timers'' sur la carte mère, la VBI était utilisée pour timer les échanges avec le clavier et la souris. A chaque VBI, la routine d'interruption vérifiait si le clavier ou la souris avaient envoyé quelque chose à l'ordinateur. Le VDC contient donc une sortie dédiée aux interruptions, connectée à l'entrée d'interruption du CPU (directement ou par l'intermédiaire d'un contrôleur d'interruption). Les signaux de ''raster interrupt'' ne sont pas identiques aux signaux de synchronisation verticale et horizontale, ni aux signaux de ''blanking'', même s'ils se ressemblent. La différence est que les signaux de synchronisation verticale/horizontale ont des contraintes de timing différents. Par exemple, le standard VGA impose que ces deux signaux soient maintenus durant un certain temps à l'écran, alors que les ''raster interrupts'' sont remises à zéro dès que le processeur est a pris en compte. L'usage de ''raster interrupts'' est très efficace, mais a pour défaut de beaucoup utiliser le processeur. Diverses optimisations permettent de se passer de ''raster interrupts'', ou du moins d'en réduire le cout en performance. Mais ces techniques demandent de modifier la mémoire vidéo, précisément la manière dont le processeur communique avec la mémoire vidéo. Nous allons voir ces techniques dans ce qui suit. ===Le ''cycle stealing'' et le ''cycle interleaving''=== Une solution alternative élimine totalement les ''raster interrupts'', le ''pooling'' ou toute technique d'arbitrage entre VDC et processeur. Elle fait en sorte que la moitié des cycles d'horloge de la mémoire soit réservé au processeur, l'autre à la carte d'affichage. En clair, on change d’utilisateur à chaque cycle : si un cycle est attribué au processeur, le suivant l'est à la carte d'affichage. L'implémentation utilise une mémoire qui va à une fréquence double de celle du processeur et de la carte d'affichage, les deux étant cadencés à la même fréquence. Les fréquences du CPU et de la carte d'affichage étaient décalées d'une moitié de cycle, ce qui fait que leurs cycles correspondaient à des cycles mémoire différents. Un exemple est celui du micro-ordinateur BBC Micro, qui avait une fréquence de 4 MHz avec un processeur à 2 MHz et une carte d'affichage de 2 MHz lui aussi. Elle était autrefois beaucoup utilisée avec les processeurs Motorola, comme le Motorola 6800 et le MOS 6502, car ils avaient des particularités qui rendaient cette technique facile à implémenter. La particularité principale était qu'ils accédaient à la mémoire lors de la moitié d'un cycle d'horloge, laissant l'autre moitié libre. Pour être plus précis, le signal d'horloge sur ces processeur passe la moitié du temps à 1, l'autre moitié à 0. Les deux processeurs accédaient à la mémoire quand le signal d'horloge était à 0, laissant la mémoire libre quand le signal d'horloge est à 1. Typiquement, le processeur et le VDC allaient à 1 MHz, et étaient relié à une mémoire RAM allant à 2 MHz. Les premiers ordinateurs Apple utilisaient cette technique, sauf qu'ils n'avaient pas de mémoire vidéo séparée. Par exemple, l'Apple 2 avait une mémoire RAM unique, de 4 à 64 kilooctets, partagée entre le processeur et la carte d'affichage. Une petite partie était utilisée comme mémoire vidéo, le reste était utilisé par les programmes et le système d'exploitation. Le VDC adressait la RAM directement, tout comme le processeur. Un point intéressant est que le VDC s'occupait aussi du rafraichissement mémoire de la RAM. Il balayait la mémoire vidéo lors de l'affichage d'une image, mais balayait le reste de la mémoire entre deux images. Et tout cela était en réalité fait en une seule passe, les timings étaient prévus pour. Sur le Macintosh 128K, le processeur était un Motorola 68000 et la RAM passait à 128 kilo-octets, mais une organisation similaire était utilisée. Encore une fois, la RAM faisait à la fois RAM système et mémoire vidéo. pendant l'affichage d'une image, le VDC et le processeur se passaient la main tous les 4 cycles. Le VDC lisait la RAM pendant 4 cycle, puis le processeur lisait/écrivait durant 4 cycles, et ainsi de suite. Par contre, le processeur avait un accès exclusif à la RAM entre l'affichage de deux images. ===L'usage de tampons de synchronisation FIFO=== Une dernière solution est l'usage de mémoires tampon entre le processeur et la mémoire vidéo. Le processeur n'écrivait pas directement dans la mémoire vidéo, mais dans une mémoire intermédiaire. La mémoire intermédiaire est une '''mémoire FIFO''', à savoir qu'elle mémorise les données à écrire et leur adresse dans leur ordre d'arrivée. Elle sert à mettre en attente les accès mémoire du processeur tant que la mémoire vidéo est occupée. Ainsi, si la mémoire vidéo est libre, le processeur peut écrire directement dans la mémoire vidéo, sans intermédiaire. Mais si la carte d'affichage accède à la mémoire vidéo, les écritures du processeur sont mises en attente dans la mémoire FIFO. Elles s'accumulent tant que la mémoire vidéo est occupée, elles sont conservées dans l'ordre d'envoi par le processeur. Dès que la mémoire vidéo se libère, les données présentes dans la FIFO sont écrites dans la mémoire vidéo, au rythme d'une écriture par cycle d'horloge de la VRAM : la mémoire FIFO se vide progressivement. Si la mémoire FIFO est pleine, elle prévient le processeur en lui envoyant un bit/signal, et le processeur agit en conséquence en cessant les écritures et en se mettant en pause. [[File:FIFO d'écriture en mémoire vidéo.png|centre|vignette|upright=2|FIFO d'écriture en mémoire vidéo]] Sur les cartes d'affichage, le processeur n'adresse pas la mémoire vidéo directement. A la place, le processeur envoie des données sur le bus, sur le connecteur de la carte d'affichage. La carte d'affichage récupère les données transmises sur le bus et les mets en attente dans une mémoire FIFO assez similaire. Elle les écrit en mémoire vidéo si besoin quand elle est libre. En conséquence, les cartes graphiques modernes n'ont pas besoin de ''raster interrupts'', qui étaient utilisées sur les premiers PC ou les premières consoles. A la place, c'est la carte graphique qui s'occupe de tout, et notamment son circuit de contrôle qui gère la mémoire vidéo. D'ailleurs, c'est ce circuit de contrôle qui gère la synchronisation verticale, pas le processeur, pas besoin de ''vertical blanking interrupt''. ==La génération des signaux de commande pour l'écran== Les VDC contiennent tous de quoi générer les signaux de commande à destination de l'écran, ainsi que des signaux d'interruption à destination du processeur. Le premier signal à générer est le signal d'horloge transmission des pixels, à savoir le signal d'horloge dont la période est égale au temps mis pour envoyer un pixel à l'écran. Ce signal est souvent transmis à l'écran, via un fil dédié. Les VDC contiennent de quoi générer cette fréquence, grâce à un circuit oscillateur dédié. Il faut aussi générer les signaux de synchronisation verticale/horizontale, ainsi que les ''raster interrupts''. Et ils se trouve que les deux sont générés par les mêmes circuits, à peu de choses près. Dans ce qui va suivre, nous allons voir comment sont générés ces signaux, quels sont les circuits qui s'en chargent. Ils sont assez simples : ce sont de simples compteurs reliés à des comparateurs ! ===La génération des signaux de synchronisation verticale/horizontale=== Le VDC gère les signaux de synchronisation verticale ou horizontale. Pour cela, ils intègrent deux compteurs (des circuits qui comptent de 0 à N). Le premier compteur compte les lignes transmises, l'autre les pixels dans une ligne, ce qui leur vaut les noms de compteur de colonne et de compteur de ligne. Les deux compteurs sont initialisés à 0 avant la transmission et sont incrémentés automatiquement quand on passe d'un pixel à l'autre, ou bien d'une ligne à l'autre. Quand le compteur atteint la valeur adéquate, il émet un signal de synchronisation verticale/horizontale. Au passage à la ligne suivante, le compteur de colonne est réinitialisé à 0, idem pour le compteur de ligne quand une image a été affichée totalement. Ils sont configurés de manière à prendre en compte la résolution de l'écran, mais pas de la manière dont vous le pensez. Par exemple, pour une résolution de 640 par 480 : vous imaginez sans doute que le compteur de colonne est configuré pour compter de 0 à 639, alors que l'autre compte de 0 à 479. Par exemple, pour une résolution de 640 par 480, les deux compteurs sont initialisés à 0. Le compteur de colonne est incrémenté à chaque envoi de pixel, et il déclenche le signal de synchronisation horizontale une fois que le compteur atteint 640. Le compteur de colonne est alors réinitialisé après un certain temps, alors que le compteur de ligne est incrémenté. Le compteur de ligne est donc incrémenté à chaque nouvelle ligne. De plus, il émet un signal de synchronisation verticale quand il atteint 480, et est réinitialisé après cela. Il est possible de faire ainsi, mais ce n'est pas la solution idéale. En réalité, il faut tenir compte du fait que les signaux de HSYNC et VSYNC, qui sont eux aussi générés par les deux compteurs. Imaginons que le signal HSYNC prenne 20 cycles d'horloge, et le signal VSYNC 150 cycles. Pour une résolution de 640 par 480, on utilise un compteur de colonne qui compte de 0 à 640 + 20, et un compteur de ligne qui compte de 0 à 480 + 150. L'idée est d'utiliser des comparateurs pour générer les signaux HSYNC et VSYNC, un pour le signal HSYNC et un autre pour le signal VSYNC. En reprenant les valeurs mentionnées précédemment, on utilise un comparateur qui vérifie si le compteur de colonne est supérieur ou égal à 640, et un autre comparateur qui vérifie si le compteur de ligne est égal ou dépasse 480. La sortie des deux comparateurs fournit directement les signaux HSYNC et VSYNC. Une autre solution remplace les comparateurs par une mémoire ROM. L'idée est d'envoyer les compteurs sur l'entrée d'adresse, la ROM fournit en sortie les signaux de commande destinés à l'écran. En remplissant la ROM avec les valeurs adéquates, la technique fonctionne à merveille et on peut se passer des circuits comparateurs. Pour les haute résolutions, il est possible d'utiliser deux ROMs : une pour le compteur de ligne, une pour le compteur de colonne. Le VDC peut gérer plusieurs résolutions différentes, et les ''timings'' sont différents suivant les résolutions. Idéalement, il faut envoyer quelques bits de commande pour choisir la résolutions en entrée de la mémoire ROM pour choisir les bons timings. Avec des comparateurs, la technique demande d'utiliser les mêmes comparateurs, mais d'ajouter des circuits pour gérer les différentes résolutions. ===L'exemple des timings du standard VGA=== Reprenons l'exemple du standard VGA. Avec ce standard, il existait un fil H-SYNC pour indiquer qu'on transmettait une nouvelle ligne et un fil V-SYNC pour indiquer qu'on envoie une nouvelle image. Une nouvelle ligne ou image est indiquée en mettant un 0 sur le fil adéquat. De plus, on devait attendre un certain temps entre la transmission de deux lignes, ce qui introduisait des vides dans le flux de pixels. Même chose entre deux images, sauf que le temps d'attente était plus long que le temps d'attente entre deux lignes. Le tout est détaillé dans le schéma ci-dessous, qui détaille le cas pour une résolution de 640 par 480. [[File:VGASpecification.png|centre|vignette|upright=2|Standard VGA : spécification des temps d'attentes entre deux lignes et deux images.]] Le compteur de colonne est cadencé à une fréquence bien précise, qui détermine le temps mis pour passer d'un pixel à l'autre. Le temps de transmission d'un pixel est de 25,6 µs / 640 = 0,04 µs, ce qui correspond à une fréquence de 25 MégaHertz. Et cela permet d'implémenter facilement les deux temps d'attente avant et après l'affichage d'une ligne. Les temps d'attente de 1,54 et 0,64 µs correspondent respectivement à 38 et 16 cycles du compteur, la durée de 3,8 µs du signal H-sync correspond à 95 cycles. En tout, cela fait 640 + 95 + 16 + 38 = 789. Il faut donc un compteur qui compte de 0 à 788. La transmission des pixels commence quand le compteur commence à compter. Puis, le compteur continue de compter pendant 0,64 µs alors qu'aucun pixel n'est envoyé, afin de gérer le temps d'attente après le signal H-sync. Puis, au 640 + 16ème cycle, le signal H-sync est généré pendant 95 cycles. Enfin, le compteur continue de compter pendant 38 cycles pour le second temps d'attente, avant le prochain envoi de ligne. Le signal H-sync est donc généré quand le compteur a une valeur comprise entre 656 et 751 : il suffit d'ajouter un comparateur qui vérifie si le compteur est dans cet intervalle, et donc la sortie est à zéro si c'est le cas. L'adresse n'est pas calculée si le compteur n'a pas une valeur comprise entre 0 et la largeur indiquée par la résolution. La même logique s'applique avec le signal V-sync, mais avec des timings différents, illustrés plus haut. Pour implémenter tout cela, il suffit de combiner les deux compteurs avec des circuits comparateurs, qui vérifient si la valeur du compteur est dans tel ou tel intervalle. Il faut au minimum deux circuits comparateurs, un pour le signal HSYNC, un autre pour le signal VSYNC. D'autres compteurs peuvent être utilisés pour générer les bits de ''blanking'' ou pour réinitialiser le compteur à la valeur adéquate. Les comparateurs peuvent être remplacés par une mémoire ROM, comme dit plus haut. [[File:VGACmptFig2.png|centre|vignette|upright=2|Circuit de gestion des timings H-sync et V-sync d'un écran VGA.]] ===La génération des ''raster interrupts'' et des bits de ''blanking''=== Les mêmes compteurs ou la ROM sont souvent utilisés pour générer les ''raster interrupts'' et le bit de ''blanking'', qui permettent de prévenir le processeur quand la carte d'affichage a terminé d'envoyer une ligne et/ou une image entière à l'écran. Notons qu'il est possible d'implémenter les interruptions à partir du bit de ''blanking'', cela demande juste aux compteurs de générer ce bit de ''blanking'' et de l'utiliser pour générer les ''raster interrupt''. Au passage, les compteurs de ligne et colonne ne servent pas qu'à générer des signaux : on verra dans la section sur le CRTC que quand on dispose de ces deux compteurs, ajouter de quoi parcourir le ''framebuffer'' est trivial ! <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage | prevText=Les cartes d'affichage | next=Les systèmes à framebuffer | nextText=Les systèmes à framebuffer }}{{autocat}} </noinclude> fusshj8g5de15eon7nt4qd97pc9v9p3 Catégorie:Précis d'épistémologie (livre) 14 68948 765027 592736 2026-04-25T10:02:21Z PandaMystique 119061 765027 wikitext text/x-wiki [[Catégorie:Livres par titre]] [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] ti5ogwbk8s28zyylfgbdyharuik2yfz Les cartes graphiques/Les processeurs de shaders 0 69558 764882 763648 2026-04-24T17:56:00Z Mewtow 31375 /* Les compteurs d'activité */ 764882 wikitext text/x-wiki Les '''''shaders''''' sont des programmes informatiques exécutés par la carte graphique, et plus précisément par des processeurs de ''shaders''. Un point très important à comprendre est que chaque triangle ou pixel d'une scène 3D peut être traité indépendamment des autres. Le tout se résume comme suit : : '''L’exécution d'un shader génère un grand nombre d'instances de ce shader, chacune traitant un paquet de pixels/sommets différent.''' En conséquence, il est possible de traiter chaque instance d'un ''shader'' en parallèle des autres, en même temps, au lieu de traiter les instances l'une après l'autre. La conséquence est que les cartes graphiques sont des architectures massivement parallèles, à savoir qu'elles sont capables d'effectuer un grand nombre de calculs indépendants en même temps. De plus, le parallélisme utilisé est du parallélisme de données, à savoir qu'on exécute le même programme sur des données différentes, chaque donnée étant traitée en parallèle des autres. Les cartes graphiques récentes incorporent toutes les techniques de parallélisme de donnée au niveau matériel, et nous allons toutes les détailler dans ce chapitre. S'il fallait résumer, elles ont plusieurs processeurs/cœurs, chaque cœur est capable d’exécuter des instructions SIMD (ils ne font que cela, à vrai dire), les cœurs sont fortement multithreadés, et j'en passe. [[File:CPU and GPU.png|vignette|Comparaison du nombre de processeurs et de cœurs entre CPU et GPU.]] Le premier point est qu'une carte graphique contient de nombreux processeurs, qui eux-mêmes contiennent plusieurs unités de calcul. Savoir combien de cœurs contient une carte graphique est cependant très compliqué, car la terminologie utilisée par les fabricants de carte graphique est particulièrement confuse. Il n'est pas rare que ceux-ci appellent cœurs ou processeurs, ce qui correspond en réalité à une unité de calcul d'un processeur normal, sans doute histoire de gonfler les chiffres. Et on peut généraliser à la majorité de la terminologie utilisée par les fabricants, que ce soit pour les termes ''warps processor'', ou autre, qui ne sont pas aisés à interpréter. L'architecture d'une carte graphique récente est illustrée ci-dessous. Rien de bien déroutant pour qui a déjà étudié les architectures à parallélisme de données, mais quelques rappels ou explications ne peuvent pas faire de mal. Le premier point est la présence d'un grand nombre de processeurs/cœurs, les rectangles en bleu/rouge. Chacun d'entre eux contient un grand nombre de circuits de calculs, avec des circuits de calcul simples mais nombreux en rouge, et une unité pour les calculs complexes (trigonométriques, racines carrées, autres) en rouge. Le tout est relié à une hiérarchie mémoire indiquée en vert, comprenant des mémoires locales en complément de la mémoire vidéo principale. Le tout est alimenté par une unité de répartition, le '''''Thread Execution Control Unit''''' en jaune, qui répartit les différentes instances du ''shader'' sur les différents processeurs. Elle est aussi appelée le '''processeur de commandes''', comme nous le verrons dans quelques chapitres. Nous utiliserons le terme processeur de commande dans ce qui suit. [[File:NVIDIA GPU Accelerator Block Diagram.png|centre|vignette|upright=2.5|Ce schéma illustre l'architecture d'un GPU en utilisant la terminologie NVIDIA. Comme on le voit, la carte graphique contient plusieurs cœurs de processeur distincts. Chacun d'entre eux contient plusieurs unités de calcul généralistes, appelées processeurs de threads, qui s'occupent de calculs simples (en bleu). D'autres calculs plus complexes sont pris en charge par une unité de calcul spécialisée (en rouge). Ces cœurs sont alimentés en instructions par le processeur de commandes, ici appelé ''Thread Execution Control Unit'', qui répartit les différents shaders sur chaque cœur. Enfin, on voit que chaque cœur a accès à une mémoire locale dédiée, en plus d'une mémoire vidéo partagée entre tous les cœurs.]] Les portions bleu, jaune et verte du schéma précédent méritent chacune un chapitre séparé. La hiérarchie mémoire en vert fera l'objet d'un chapitre ultérieur. Quant au répartiteur en jaune, il sera détaillé en profondeur dans le prochain chapitre. Dans ce chapitre, nous allons voir comment fonctionnent les processeurs de ''shaders'', la partie bleue. Nous allons voir que ceux-ci ne sont pas très différents des processeurs que l'on trouve dans les ordinateurs normaux, du moins dans les grandes lignes. Ce sont des processeurs séquentiels, qui exécutent des instructions les unes après les autres. Ils ont des instructions machines, des modes d'adressage, un assembleur, des registres et tout ce qui fait qu'un processeur est un processeur. Néanmoins, il y a une différence de taille : ce sont des processeurs adaptés pour effectuer un grand nombre de calculs en parallèle. ==Les registres des processeurs de shaders== Un processeur de shaders contient beaucoup de '''registres généraux''', qui servent un peu à tout. Le programmeur de shader peut les utiliser à loisir. Tout processeur digne de ce nom possède des registres généraux, mais un processeur de ''shader'' dispose aussi de registres spécialisés, qu'on ne trouve que sur les processeurs de ''shaders''. Ils servent à l'interfacer avec le reste du pipeline graphique. Par exemple, des registres pour les textures, d'autres pour recevoir des données du rastériseur, etc. [[File:Architecture carte graphique vertex avec texture.PNG|centre|vignette|upright=2|Architecture carte graphique vertex avec texture]] ===Les registres d'interface avec le pipeline graphique=== Les processeurs de ''vertex shader'' reçoivent des sommets provenant de l'''input assembler'' et envoient leur résultat au rastériseur. Les processeurs de ''pixel shader'' reçoivent des données de l'unité de rastérisation, et envoient un pixel éclairé aux ROPs. Et pour cela, le processeur de shader a des registres dédiés, qui servent d'interface avec le reste du pipeline graphique. Les '''registres de sortie''' sont là où le processeur stocke les résultats à envoyer, soit au rastériseur pour un ''vertex shader'', soit aux ROP pour un ''pixel shader''. Les registres de sorties sont en écriture seule. Pour donner un exemple, les ''vertex shaders'' ont au minimum un registre pour la position du sommet dans l'espace (trois coordonnées), un autre pour la couleur/luminosité du sommet, un autre pour la couleur du brouillard, un autre pour les coordonnées de texture. {|class="wikitable" |+ Registres de sortie des ''pixel/vertex shaders'' |- ! Vertex shader ! Pixel shader |- | Couleur du pixel | Couleur du sommet |- | Profondeur du pixel | Position du sommet |- | rowspan="2" | | Coordonnées de texture du sommet |- | Couleur de brouillard. |} Les '''registres d'entrée''', aussi appelés '''registres d'attributs''', réceptionnent soit les sommets provenant de l'''input assembler'', soit les pixels provenant de l'unité de rastérisation. Les registres d'entrée sont en lecture seule, du point de vue du processeur de shader, ils sont initialisés avant l'exécution de l'instance du ''shader''. Les '''registres de constantes''' mémorisent des constantes utiles pour le ''shader''. Par exemple, pour les ''vertex shaders'', ils stockent les matrices servant aux différentes étapes de transformation ou d'éclairage. La différence avec les registres d'attribut est qu'ils mémorisent des données constantes pour un objet/modèle 3D (pour un ''draw call'', pour être plus précis) : des matrices de transformation, les adresses de texture, et bien d'autres. A l'opposé, les registres d'attributs mémorisent des sommets/pixels qui varient d'une instance de shader à l'autre. Les ''pixel/vertex shaders'' 1.0 ne géraient que des constantes flottantes pour les ''vertex shaders'', entières pour les ''pixel shaders''. Les ''pixel/vertex shaders'' 2.0 et 3.0 ont ajouté des registres de constantes pour les nombres entiers et des opérandes booléennes. Il y en avait 16, comparé aux centaines de registres de constantes flottants. Les constantes entières et booléennes étaient utilisées pour gérer les boucles, guère plus. Avec les ''pixel/vertex shaders'' 4.0 et plus, les registres de constante n'ont plus de type prédéterminé, le programmeur gère ces registres comme il l'entend. L'adressage des registres de constante est quelque peu particulier. Il faut dire qu'il y en a plusieurs milliers sur les processeurs de ''shaders'' modernes, au point qu'il serait plus juste de parler de mémoire RAM des constantes. Les registres de constante sont en effet un ''local store'' un peu spécial, intégré directement dans le processeur. Et le processeur accède à ce ''local store'' en utilisant une mode d'adressage semblable à celui utilisé pour la mémoire, avec un mode d'adressage indirect. L'adresse à lire dans ce ''local store'' est dans un registre, séparé du reste, appelé le '''registre d'adresse de constante'''. ===Les registres spécialisés internes=== D'autres registres spécialisés ne font pas l'interface avec le reste du GPU. Ils servent à stocker des constantes ou des données importantes, qui n'ont pas vraiment leur place dans les registres généraux. Depuis les ''pixel/vertex shaders'' 3.0, les ''shaders'' sont capables d'effectuer des boucles et d'autres structures de contrôle familières pour les programmeurs. Et deux registres ont été intégrés afin d'améliorer les performances des structures de contrôle. Le premier est un registre à prédicat, qui sera vu dans la section sur le SIMD avec prédication. Le second est un '''registre compteur de boucle''', qui mémorise l'indice d'une boucle. Il est initialisé à 0, et est incrémenté à chaque fois qu'une boucle s'exécute. Certains processeurs de shader ont aussi des '''registres de texture''' , qui servent d'interface avec la mémoire pour la gestion des textures. Ils mémorisent les texels lus par l'unité de texture. L'unité de texture lit un texel, plusieurs avec ''multitexturing'', et les place dans ces registres de texture. Les registres de texture sont parfois initialisés avant l'exécution du ''shader'', mais la plupart sont initialisé quand le ''shader'' termine une instruction de lecture de texture. Ils sont généralement en lecture seule, mais il y a des exceptions. ==Les processeurs de shaders modernes : les processeurs SIMD== Maintenant, voyons quelles sont les instructions supportées par les processeurs de shaders modernes. Et si je dis moderne, c'est car nous ne parlerons que des GPU de l'époque DirectX 10 et après, pas des GPU de l'époque DirectX 9 et antérieur. La raison est que le jeu d'instruction des shaders a franchement évolué, avec le passage d'architectures VLIW à des architectures SIMD. Et cela a eu des conséquences assez profondes sur le jeu d'instruction et leur microarchitecture. Nous n'allons parler des GPU de type SIMD dans ce chapitre. Un chapitre dédié sera consacré aux GPU de type VLIW. Le jeu d'instruction des GPU NVIDIA n'est pas encore connu à l'heure où j'écris ces lignes, la documentation du constructeur n'est pas disponible. Quelques chercheurs ont tenté de faire de la rétro-ingénierie du code de divers shaders pour retrouver le jeu d'instruction des divers GPU NVIDIA, ce qui fait qu'on a cependant une idée de ce dernier. Mais rien d'officiel. Par contre, AMD fournit librement cette documentation sur le net. Ce qui fait qu'on peut trouver des documents de ce genre : * [https://developer.amd.com/wordpress/media/2012/12/AMD_Southern_Islands_Instruction_Set_Architecture.pdf Graphics Core Next 1 instruction set] ; * [https://developer.amd.com/wordpress/media/2013/07/AMD_Sea_Islands_Instruction_Set_Architecture.pdf Graphics Core Next 2 instruction set] ; * [https://developer.amd.com/wordpress/media/2013/12/AMD_GCN3_Instruction_Set_Architecture_rev1.1.pdf Graphics Core Next 3 and 4 instruction sets] ; * [https://developer.amd.com/wp-content/resources/Vega_Shader_ISA_28July2017.pdf Graphics Core Next 5 instruction set] ; * [https://developer.amd.com/wp-content/resources/Vega_7nm_Shader_ISA.pdf "Vega" 7nm instruction set architecture] (also referred to as Graphics Core Next 5.1) ; * [https://www.amd.com/content/dam/amd/en/documents/radeon-tech-docs/instruction-set-architectures/rdna3-shader-instruction-set-architecture-feb-2023_0.pdf Jeu d'instruction des GPU de type RDNA3 d'AMD]. ===Les instructions SIMD=== Les '''instructions SIMD''' manipulent plusieurs nombres en même temps. Elles manipulent plus précisément des '''vecteurs''', des ensembles de plusieurs nombres entiers ou nombres flottants placés les uns à côté des autres, le tout ayant une taille fixe, qui sont stockés dans des registres spécialisés. En général, tous les vecteurs ont une taille fixe, peu importe leur contenu. Cela implique que suivant la taille des données à manipuler, on pourra en placer plus ou moins dans un vecteur. Par exemple, un vecteur de 128 bits pourra contenir 4 entiers de 32 bits, 4 flottants 32 bits, ou 8 entiers de 16 bits. [[File:Vector register.png|centre|vignette|upright=2|Contenu d'un vecteur en fonction du type de données utilisé.]] Les vecteurs sont stockés dans des '''registres vectoriels''', aussi appelés '''registres SIMD'''. Un registre vectoriel peut contenir un vecteur complet, pas plus. En conséquence, ils ont une taille assez importante : ils font généralement 128, 256, voire 512 bits, comparé aux 32/64 bits des registres des CPU. Les cartes graphiques modernes contiennent un très grand nombre de registres SIMD. {| |+ Comparaison entre un processeur sans registres vectoriels, et avec registres vectoriels. |[[File:Non-SIMD cpu diagram1.svg|vignette|upright=1.5|CPU Non-SIMD]] |[[File:SIMD cpu diagram1.svg|vignette|upright=1.5|CPU SIMD]] |} Une instruction SIMD traite chaque donnée du vecteur indépendamment des autres. Par exemple, une instruction d'addition vectorielle va additionner ensemble les données qui sont à la même place dans deux vecteurs, et placer le résultat dans un autre vecteur, à la même place. [[File:Instructions SIMD.png|centre|vignette|upright=2.0|Instructions SIMD]] Sur les cartes graphiques modernes, les vecteurs sont généralement des vecteurs qui regroupent plusieurs nombres flottants. De plus, les flottants en question sont des flottants dits simple précision, codés sur 32 bits. Mais il y a quelques exceptions, comme [https://www.realworldtech.com/apple-custom-gpu/ certains GPU d'Apple, qui ne gèrent majoritairement que des flottants codés sur 16 bits], avec des fonctionnalités pour la simple précision. Les anciennes cartes graphiques ne géraient pas du tout de vecteurs contenant des nombres entiers. ===Les instruction scalaires entières, typiques des CPU=== Un processeur SIMD gère donc des instructions SIMD, et les anciennes cartes graphiques ne disposaient que d'instructions de ce type. Mais depuis au moins une décennie, les processeurs de shaders gèrent des instructions normales, non-SIMD. De telles instructions sont appelées des '''instruction scalaires'''. En clair, il s'agit des instructions qu'on retrouve normalement tous les processeurs principaux (les CPU). Il s'agit généralement d''''instructions entières''', agissent sur des registres entiers non-SIMD. Elles ne traitent pas de vecteur, mais de simples nombres entiers indépendants, sans regroupement d'aucune sorte. Typiquement, il s'agit d'opérations d'addition, de soustraction, des opérations logiques, des comparaisons, guère plus. On trouve aussi des opérations un peu originales, comme des calculs de valeur absolue, du minimum/maximum de deux opérandes, des opérations à prédicat comme une instruction CMOV, etc. Les cartes graphiques supportent rarement la multiplication, mais les plus récentes supportent des multiplications sur des opérandes de 16/32 bits. Par contre, aucune ne gère de division entière. Les GPU modernes gèrent aussi des instructions de test et de branchement, là encore sur des nombres entiers. Les instructions de test et branchement sont généralement considérées comme à part des instructions de calcul, mais ce sont des opérations scalaires. Les comparaisons se font entre deux entiers scalaires, pas entre deux vecteurs. Retenez bien ce détail, car il sera très important pour la suite. Les GPU modernes gèrent aussi des '''instructions flottantes scalaires''', à savoir que des instructions qui ont pour opérandes des nombres flottants isolés, qui ne sont pas dans un vecteur. Les processeurs principaux (CPU) d'un ordinateur sont capables de faire beaucoup de calculs arithmétiques simples sur des nombres flottants, comme des additions, des multiplications, des opérations bit-à-bit, éventuellement des divisions, etc. Il en est de même sur les GPUS. Mais ces derniers gèrent aussi de nombreuses instructions flottantes que les CPU n'incorporent presque pas. Il est rare que les CPU soient capables de faire des opérations flottantes complexes, comme des calculs trigonométriques, des exponentielles, des logarithmes, des racines carrées ou racines carrées inverse, etc. De tels calculs sont rares dans les programmes exécutables, alors que les calculs arithmétiques simples y sont légion. Mais le rendu 3D demande pas mal de calculs trigonométriques, de produits scalaires ou d'autres opérations. Par exemple, dans les chapitres précédents, nous avions abordé les calculs d'éclairage et avions vu qu'ils font beaucoup de calculs vectoriels avec des vecteurs comme la normale d'un sommet. Et ces calculs demandent de calculer des produits scalaires et vectoriels, qui eux-mêmes demandent des calculs trigonométriques comme le cosinus ou le sinus. Aussi, les processeurs de ''shaders'' disposent souvent d'instructions flottantes spécialisées dans les calculs complexes : exponentielle/logarithme, racine carrée, racine carrée inverse, autres. Nous appellerons ces instructions des '''instructions transcendantales''', car elles effectuent des calculs de ce type. Il faut noter que le processeur incorpore des registres dédiés aux scalaires, séparés des registres SIMD. Par séparés, on veut dire que ce sont des registres différents, adressés différemment, mais qu'ils sont aussi physiquement séparés dans le processeur, ils sont des bancs de registres différents. ===Les instructions en ''co-issue''=== Beaucoup de cartes graphiques récentes comme anciennes incorporent des '''instructions de ''co-issue''''' qui ne se trouvent que sur les cartes graphiques et n'ont aucun équivalent sur les CPUs. Les instructions de ''co-issue'' regroupent plusieurs opérations par instruction. Par exemple, elles peuvent combiner une opération vectorielle avec une opération scalaire. Ou encore, elles peuvent regrouper une opération scalaire, une opération vectorielle et un branchement. Il s'agit d'instructions qui ressemblent grandement à ce qu'on trouve sur les processeurs VLIW. Un point important est que les cartes graphiques modernes disposent d'instructions à ''co-issue'' en plus des instructions normales. Les instructions à ''co-issue'' sont complémentaire des instructions normales, elles ne les remplacent pas. Les deux peuvent s'utiliser en même temps, dans un même shader. Il a cependant existé des cartes graphiques assez anciennes sur lesquelles toutes les instructions étaient des instructions à ''co-issue'' : certains processeurs de shaders VLIW anciens sont de ce type. Il y a de nombreuses contraintes quant au regroupement des deux opérations. On ne peut pas regrouper n'importe quelle opération avec n'importe quelle autre. L'exemple type de ''co-issue'' est la ''co-issue'' entre opérations scalaires et vectorielles : il n'est pas possible de regrouper deux instructions scalaires ou deux instructions vectorielles. La seule possibilité est de regrouper une opération scalaire et une opération vectorielle. La raison à cela est qu'opérations scalaires et vectorielles sont calculées dans des circuits séparés : le processeur incorpore une unité de calcul scalaire et une unité de calcul SIMD, et peut utiliser les deux en parallèle, en même temps. Mais nous verrons cela dans quelques chapitres. Pour simplifier, cette technique permettait d’exécuter deux opérations arithmétiques en même temps, en parallèle : une opération vectorielle appliquée aux couleurs R, G, et B, et une opération scalaire appliquée à la couleur de transparence. Si cela semble intéressant sur le papier, cela complexifie fortement le processeur de shader, ainsi que la traduction à la volée des shaders en instructions machine. ===Un exemple : le jeu d’instruction du GPU de la Geforce 3=== La première carte graphique commerciale grand public à disposer d'une unité de vertex programmable est la Geforce 3. Celui-ci respectait le format de vertex shader 1.1. L'ensemble des informations à savoir sur cette unité est disponible dans l'article [https://cseweb.ucsd.edu/~ravir/6160-fall04/papers/p149-lindholm.pdf "A user programmable vertex engine"], disponible sur le net. . Le processeur de cette carte était capable de gérer un seul type de données : les nombres flottants de norme IEEE754. Toutes les informations concernant la coordonnée d'une vertice, voire ses différentes couleurs, doivent être encodées en utilisant ces flottants. Les processeurs de vertices de la Geforce 3 disposent de registres registres SIMD qui font 128 bits, soit 4 flottants de 32 bits. Elle contient 16 registres d'entrée, 16 registres de sortie, 32 registres généraux. La mémoire des constantes contient 512 "registres". Le processeur de la Geforce 3 est capable d’exécuter 17 instructions différentes, dont voici les principales : {|class="wikitable" |- !OpCode!!Nom!!Description |- ! colspan="3" | Opérations mémoire |- |MOV||Move||vector -> vector |- |ARL||Address register load||miscellaneous |- ! colspan="3" | Opérations arithmétiques |- |ADD||Add||vector -> vector |- |MUL||Multiply||vector -> vector |- |MAD||Multiply and add||vector -> vector |- |MIN||Minimum||vector -> vector |- |MAX||Maximum||vector -> vector |- |SLT||Set on less than||vector -> vector |- |SGE||Set on greater or equal||vector -> vector |- |LOG||Log base 2||miscellaneous |- |EXP||Exp base 2||miscellaneous |- |RCP||Reciprocal||scalar-> replicated scalar |- |RSQ||Reciprocal square root||scalar-> replicated scalar |- ! colspan="3" | Opérations trigonométriques |- |DP3||3 term dot product||vector-> replicated scalar |- |DP4||4 term dot product||vector-> replicated scalar |- |DST||Distance||vector -> vector |- ! colspan="3" | Opérations d'éclairage géométrique |- |LIT||Phong lighting||Calcule l'éclairage de Gouraud |} L'instruction la plus intéressante est clairement la dernière : elle éclaire un sommet, en utilisant un éclairage de Phong. Les autres instructions permettent d'implémenter un autre algorithme si besoin, mais cette forme d'éclairage est déjà là à la base. Les autres instructions sont surtout des instructions arithmétiques : multiplications, additions, exponentielles, logarithmes, racines carrées, etc. Pour les instructions d'accès à la mémoire, on trouve une instruction MOV qui déplace le contenu d'un registre dans un autre et une instruction de calcul d'adresse, mais aucune instruction d'accès à la mémoire sur le processeur de la Geforce 3. Plus tard, les unités de ''vertex shader'' ont acquis la possibilité de lire des données dans une texture. On remarque que la division est absente. Il faut dire que la contrainte qui veut que toutes ces instructions s’exécutent en un cycle d'horloge pose quelques problèmes avec la division, qui est une opération plutôt lourde en hardware. À la place, on trouve l'instruction RCP, capable de calculer 1/x, avec x un flottant. Cela permet ainsi de simuler une division : pour obtenir Y/X, il suffit de calculer 1/X avec RCP, et de multiplier le résultat par Y. ==La prédication et le SIMT== Les cartes graphiques récentes peuvent effectuer des branchements, mais ceux-ci sont tout sauf performants. Dès qu'un branchement survient, le processeur est obligé de traiter chaque élément du vecteur un par un, au lieu de tous les traiter en même temps en parallèle. Les performances s'en ressentent, ce qui fait que les branchements sont à éviter le plus possible. Pour améliorer la gestion des conditions, les cartes graphiques modernes incorporent des instructions spécialisées qui permettent de remplacer des codes remplis de branchements par des codes plus simples, compatibles avec l'organisation des données en vecteurs. Si on met de côté le support de certaines instructions courantes, comme la valeur absolue, ou le calcul du minimum/maximum, la technique la plus importante est la technique dite de '''prédication'''. L'idée est que quand une instruction effectue un calcul sur un ou deux vecteurs, certains éléments du vecteur sont ignorés. Les éléments à ignorer sont choisis suivant le résultat d'une instruction de comparaison, qui effectue un test : les éléments pour lesquels ce test est respecté sont pris en compte, ceux qui ne passent pas le test sont ignorés. Pour donner un exemple d'utilisation, imaginons que l'on ait un vecteur dans lequel on veut remplacer toutes les valeurs négatives par des 0. Dans ce cas, on utilise : * une instruction de comparaison, qui compare chaque élément du vecteur avec 0 et génère plusieurs bits de résultat ; * suivi d'une instruction à prédicat qui met à zéro les éléments pour lesquels les bits de résultat précédents sont à 1. Elle est implémentée grâce à un registre appelé le '''''Vector Mask Register'''''. Celui-ci permet de stocker des informations qui permettront de sélectionner certaines données et pas d'autres pour faire notre calcul. Il est mis à jour par des instructions de comparaison. le ''Vector Mask Register'' stocke un bit pour chaque flottant présent dans le vecteur à traiter, bit qui indique s'il faut appliquer l'instruction sur ce flottant. Si ce bit est à 1, notre instruction doit s’exécuter sur la donnée associée à ce bit. Sinon, notre instruction ne doit pas la modifier. On peut ainsi traiter seulement une partie des registres stockant des vecteurs SIMD. [[File:Vector mask register.png|centre|vignette|upright=2.0|''Vector mask register'']] ===La prédication avec une pile SIMT=== Au niveau du jeu d’instruction, les architectures SIMT implémentent de la prédication, sous une forme améliorée. Les processeurs SIMT actuels sont surtout utilisées sur les processeurs intégrés aux cartes graphiques. Et ces derniers gèrent très mal les branchements, et encore : beaucoup de cartes graphiques, même récentes, ne gèrent tout simplement pas les branchements. Elles doivent donc se débrouiller avec uniquement la prédication, là où les processeurs SIMD utilisent des branchements normaux en complément de la prédication. Insistons sur le fait que cet usage exclusif de la prédication n'est présent que sur une sous-partie des architectures SIMT, le seul exemple que l'auteur de ce wikilivre connait étant celui des cartes graphiques. Les architectures SIMT sans branchements doivent donc trouver des solutions pour gérer les structures de contrôle imbriquées, à savoir une boucle placée à l'intérieur d'une autre boucle, un IF...ELSE dans un autre IF...ELSE, etc. Elles utilisent pour cela la prédication, combinée avec des mécanismes annexes. Le premier d'entre eux est l'usage de plusieurs registres de masques organisés d'une manière bien précise, l'autre est l'usage de compteurs d'activité. Voyons ces deux techniques. La '''pile de masques''' remplace le ou les registres de masque. Sans elle, le processeur SIMD incorpore un registre de masque qui est adressé implicitement ou explicitement. Éventuellement, le processeur peut contenir plusieurs registres de masque séparés adressables via un nom de registre. Avec elle, le processeur SIMD incorpore plusieurs registres de masque organisé en pile. Le registre de masque est donc remplacé par une mémoire LIFO, une pile, dans laquelle plusieurs masques sont empilés. Le tout forme une pile, similaire à la pile d'appel, sauf qu'elle est utilisée pour empiler des masques. Un masque est calculé et empilé à chaque entrée dans une structure de contrôle, puis dépilé une fois la structure de contrôle exécutée. L'empilement et le dépilement des masques est effectué par des instructions PUSH et POP, présentes dans le jeu d'instruction du processeur SIMD. Le calcul des masques doit répondre à plusieurs impératifs. * Premièrement, chaque masque se calcule en faisant un ET entre le masque précédent et le masque calculé par l'instruction de test. Cela permet de ne pas réveiller d’élément au beau milieu d'une structure imbriquée. Si in IF désactive certains éléments du vecteur, une condition imbriquée dans ce IF ne doit pas réveiller cet élément. Le fait de faire un ET entre les masques garantit cela. * Deuxièmement, les masques doivent être empilés et dépilés correctement. Au moment de rentrer dans une structure de contrôle, on effectue une instruction de test associée à la structure de contrôle, qui calcule un masque, et on empile le masque calculé. Au moment de sortir de la structure de contrôle, on dépile le masque en question. L'implémentation demande d'utiliser une mémoire LIFO pour stocker la pile de masques, et quelques circuits annexes. Il faut notamment un circuit relié à l'ALU qui récupère les conditions, les résultats des comparaisons, et qui effectue le ET pour combiner les masques. Pour donner un exemple, prenons le code suivant, qui est volontairement simpliste et ne sert qu'à des fins d'explication : <syntaxhighlight lang="c"> if ( condition 1 ) { if ( condition 2 ) { ... } else { ... } Autres instructions } Instructions après le IF... </syntaxhighlight> Imaginons que l'on traite des vecteurs de 8 éléments. Pour le vecteur considéré, la première condition (a > 0) n'est respectée que par les 4 premiers éléments. L'instruction de condition calcule alors le masque correspondant : 1111 0000. Le masque est alors calculé, puis empilé au sommet de la pile. La seconde instruction de test, qui teste la variable b, est maintenant valide pour les 4 bits du milieu du masque. Mais n'allez pas croire que le masque correspondant soit 0011 11100 : il faut tenir compte de la condition précédente, qui a éliminé les 4 derniers éléments. Pour cela, on fait un ET logique entre le masque précédent, et le masque calculé par la condition. Le masque au sommet de la pile est donc lu, combiné avec le masque calculé par l'instruction, ce qui donne le masque final. Le masque final est alors empilé au sommet de la pile. On exécute alors l'instruction du IF, en tenant compte du masque qui est au sommet de la pile. Si le IF était plus compliqué, toutes les instructions suivantes tiendraient compte du masque. En fait, le masque est pris en compte tant qu'il n'est pas dépilé. Une fois que le IF est terminé, le masque est dépilé. On passe alors au ELSE, et rebelotte. Le masque pour le ELSE est calculé en combinant le masque au sommet de la pile avec la condition du ELSE. Le masque au sommet de la pile est celui calculé à l'entrée du premier IF, pas le second qui a été dépilé. Les instructions du ELSE sont alors exécutées en tenant compte de ce masque. Une fois qu'elles sont toutes exécutées, le masque est dépilé. Puis vient l'exécution des instructions après le ELSE. Elles utilisent le masque empilé au sommet de la pile, qui correspond à celui à l'entrée du IF. Puis vient le moment d'exécuter les instructions après le IF : pas de masque, on exécute sur tout le vecteur. ===Les compteurs d'activité=== Une variante de la technique précédente remplace la pile de masques par des '''compteurs d'activité'''. La technique est similaire, si ce n'est qu'elle utilise moins de circuits. Avant , on avait une pile de masques de même taille, dont les bits sont à 0 ou 1 suivant que la condition est remplie. La pile de masque ressemble donc à ceci : {|class="wikitable" |- ! masque 1 | 1 || 1 || 1 || 1 |- ! masque 2 | 0 || 1 || 1 || 1 |- ! masque 3 | 0 || 1 || 1 || 1 |- ! masque 4 | 0 || 0 || 0 || 1 |- ! masque 1 | colspan="4" | vide |} Une manière équivalente de représenter cette pile de masque est de compter combien de bits sont à 0 dans chaque colonne. Attention : j'ai bien dit à 0 ! On obtient alors : {|class="wikitable" |- ! masque 1 | 3 || 1 || 1 || 0 |} Et c'est le principe caché derrière la technique des compteurs d'activité. Chaque élément dans un vecteur, chaque place, se voit attribuer un compteur. Un compteur non-nul indique qu'il ne faut pas prendre en compte l’élément. Ce n'est qu'une fois que le compteur est nul que l'on effectue des opérations sur l’élément associé du vecteur. À chaque fois qu'on entre dans une structure de contrôle, on teste une condition sur chaque élément. Si la condition est respectée pour un élément, alors le compteur ne change pas. Mais si la condition n'est pas respectée, alors on incrémente le compteur associé. En sortant de la structure de contrôle, on décrémente le compteur associé. Notons que les compteurs qui n'ont pas été incrémentés en entrant dans la structure de contrôle ne sont pas décrémentés en sortant. En clair, là où on empilait/dépilait un masque, on se contente d'incrémenter/décrémenter un compteur. Utiliser un compteur en lieu et place d'une colonne entière dans la pile de masque utilise moins de bits. Et c'est sans doute pour cette raison que certaines cartes graphiques, comme les cartes graphiques intégrées d'Intel depuis 2004, utilisent cette technique. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=L'évolution vers la programmabilité : les GPUs | prevText=L'évolution vers la programmabilité : les GPUs | next=La microarchitecture des processeurs de shaders | nextText=La microarchitecture des processeurs de shaders }}{{autocat}} </noinclude> lfe7u0ucyyll5z8j0aklporzkzhklsf Les cartes graphiques/Le processeur de commandes 0 69571 764887 758175 2026-04-24T17:57:07Z Mewtow 31375 /* L'exemple du processeur de commande du NV1 */ 764887 wikitext text/x-wiki Pour rappel, les API 3D envoient des commandes graphiques standardisées au pilote de la carte graphique. Le pilote de périphérique transforme alors ces commandes graphiques, que le GPU ne peut pas comprendre, en commandes matérielles que le GPU connait. Et ce sont ces commandes matérielles qui sont exécutées par le GPU. Dans les grandes lignes, on peut classer ces commandes matérielles en quelques types principaux : celles pour le rendu 3D, celles pour le rendu 2D, celles pour le décodage/encodage vidéo, celles pour le GPGPU, et les transferts DMA. Pour ce qui est du rendu 3D, les commandes matérielles ressemblent aux commandes graphiques de l'API, mais elles restent cependant différentes. Leur encodage est différent, elles ne font pas exactement la même chose, etc. Pour donner un exemple de commandes matérielles, prenons les commandes 2D de la carte graphique AMD Radeon X1800. {|class="wikitable" |- ! Commandes 2D ! Fonction |- |PAINT |Peindre un rectangle d'une certaine couleur |- |PAINT_MULTI |Peindre des rectangles (pas les mêmes paramètres que PAINT) |- |BITBLT |Copie d'un bloc de mémoire dans un autre |- |BITBLT_MULTI |Plusieurs copies de blocs de mémoire dans d'autres |- |TRANS_BITBLT |Copie de blocs de mémoire avec un masque |- |NEXTCHAR |Afficher un caractère avec une certaine couleur |- |HOSTDATA_BLT |Écrire une chaîne de caractères à l'écran ou copier une série d'image bitmap dans la mémoire vidéo |- |POLYLINE |Afficher des lignes reliées entre elles |- |POLYSCANLINES |Afficher des lignes |- |PLY_NEXTSCAN |Afficher plusieurs lignes simples |- |SET_SCISSORS |Utiliser des coupes (ciseaux) |- |LOAD_PALETTE |Charger la palette pour affichage 2D |} La gestion des commandes matérielle est le rôle du '''processeur de commande'''. Il s'occupe d'exécuter les commandes, en répartissant le travail sur les processeurs de shaders, en configurant les circuits fixes, en configurant les contrôleurs DMA, et bien d'autres choses. ==L'architecture interne du processeur de commande== Le processeur de commande est un circuit assez compliqué. Sur les cartes graphiques anciennes, c'était un circuit séquentiel complexe, fabriqué à la main et était la partie la plus complexe du processeur graphique. Sur les cartes graphiques modernes, c'est un véritable microcontrôleur, avec un processeur, de la mémoire RAM, etc. Certains GPU utilisent parfois plusieurs microcontrôleurs séparés, avec souvent une séparation du processeur de commande en deux, voyons pourquoi. Le processeur de commande a deux rôles : récupérer les commandes depuis la mémoire RAM, les exécuter. Pour rappel, les commandes matérielles sont accumulées dans une file de commande, en mémoire RAM ou en mémoire vidéo. Le processeur de commande lit la commande la plus ancienne dans la file de commande, puis l’exécute. Les deux fonctions sont souvent prises en charge par deux processeurs séparés. Le premier récupére les commandes dans la file de commandes et les envoie au second. Le second exécute les commandes, configure les circuits fixes du GPU, envoie les shaders sur les processeurs de shaders, et autres. Il y a souvent une mémoire FIFO entre les deux, afin d'assouplir les transferts de données entre les deux processeurs de commande. L'intérêt est que le premier processeur de commande peut précharger à l'avance des commandes. Au lieu d'envoyer le commandes une par une au second processeur de commande, elle lui envoie à l'avance des commandes prêtes et les accumule dans la FIFO. Le second processeur de commande est alors constamment alimenté, les situations où il attend le premier processeur sont réduites. Le second processeur de commande a plusieurs fonctionnalités : configurer les contrôleurs DMA intégrés au GPU, répartir les shaders sur les processeurs de shaders, gérer les commandes de changement d'état et de synchronisation (barrières et sémaphores), configurer les circuits fixes comme l’''input assembler'' ou les ROP. Notamment, il répartit les ''shaders'' sur les processeurs de ''shaders'', en faisant en sorte qu'ils soient utilisés le plus possible. Pour simplifier, il lance les shaders et gére le DMA. Sur les anciens GPU, le processeur de commande cadencait le flot des données dans le pipeline graphique. Par exemple, si tous les processeurs de ''vertex shader'' sont occupés, l’''input assembler'' ne peut pas charger le paquet suivant car il n'y a aucun processeur de libre pour l’accueillir. Dans ce cas, l'étape d’''input assembly'' est mise en pause en attendant qu'un processeur de ''shader'' soit libre. La même chose a lieu pour l'étape de rastérisation : si aucun processeur de ''shader'' n'est libre, elle est mise en pause et les étages précédents sont potentiellement bloqués. Plus un étape est situé vers la fin du pipeline graphique, plus sa mise en pause a de chances de se répercuter sur les étapes précédentes et de les mettre en pause aussi. Le processeur de commande doit gérer ces situations. ==La gestion du ''render state''== S'il y a une différence entre les commandes matérielles et les commandes graphiques, il en est de même pour le ''render state''. Le GPU a bien besoin de mémoriser des informations de configuration, quelles textures utiliser, quels shaders exécuter, etc. Mais autant l'API regroupe le tout dans un ''render state'' unique, autant ce n'est pas forcément le cas sur le GPU. La manière la plus simple mémorise le ''render state'' tel quel, dans divers registres de configuration, dispersés dans le GPU, souvent dans les unités non-programmables. Les unités de texture mémorisent les textures à rendre, ainsi que les options de filtrage de texture. Les ROP mémorisent les options de résolution, d'antialiasing et celles pour le tampon de profondeur. Et ainsi de suite. Tout changement dans le ''render state'' correspondra à une commande matérielle qui modifiera le registre adéquat. Changer de shader ou de texture demande de modifier un registre qui pointe vers la texture ou le shader, cela revient à modifier un pointeur mémorisé dans un registre. Mais les GPU modernes ne font pas cela à la lettre. Des informations ne sont pas mémorisées dans des registres statiques et sont transmises dans le pipeline, d'étage en étage. Par exemple, les unité de textures sont totalement ''bindless'' : le ''shader'' leur envoie l'adresse de la texture à utiliser à chaque lecture, elles n'ont pas besoin de la mémoriser dans un registre. En clair, changer de texture changera le ''render state'', mais n'impliquera pas de commande de changement d'état. ==L'exécution parallèle des commandes== Un processeur de commande basique exécute les commandes l'une après l'autre. Mais un processeur de commande évolué peut parfois exécuter plusieurs commandes en même temps. Nous verrons dans le chapitre suivant comment une telle sorcellerie est possible pour les commandes de rendu 3D. Mais n'oublions pas les autres commandes qui n'ont rien à voir avec le rendu 3D : commandes de rendu 2D, de calcul GPGPU, de décodage vidéo, ou des transferts DMA. Il est possible d'exécuter des commandes de type différent, sous certaines conditions. Par exemple, exécuter un transfert DMA pendant que le GPU fait un rendu 2D ou des calculs GPGPU. Mais il faut pour cela que les deux commandes n'utilisent pas les mêmes circuits. Le rendu 2D et 3D accèdent tous deux au ''framebuffer'', ce qui fait qu'on ne peut pas lancer une commande 2D et une commande 3D en même temps, du moins sans les optimisations qu'on verra dans le prochain chapitre. Il en est de même avec le GPGPU, le rendu 2D et le rendu 3D, qui utilisent tous les trois les processeurs de shaders. Par contre, les processeurs de shader peuvent traiter une commande 3D, alors qu'une commande de transfert DMA est en cours dans le contrôleur DMA. Les deux sont traités dans des circuits séparés, si on omet le fait que les deux adressent la VRAM, mais les deux peuvent se partager la bande passante mémoire naturellement, sans intervention du processeur de commande. La seule contrainte est que le transfert DMA et la commande 3D n'utilisent pas les mêmes zones de mémoire. En clair, il ne faut pas faire de transfert DMA dans un tampon de sommet si celui-ci est en cours d'utilisation. Mais le pilote de périphérique peut détecter ce genre de cas et le processeur de commande peut bloquer l'exécution de la seconde commande si besoin. ==La synchronisation avec le processeur== Il arrive que le processeur doive savoir où en est le traitement des commandes, ce qui est très utile pour la gestion de la mémoire vidéo. Par exemple, comment éviter d'enlever une texture tant que les commandes qui l'utilisent ne sont pas terminées ? Ce problème ne se limite pas aux textures, mais vaut pour tout ce qui est placé en mémoire vidéo. Il faut donc que la carte graphique trouve un moyen de prévenir le processeur que le traitement de telle commande est terminée, que telle commande en est rendue à tel ou tel point, etc. Pour cela, on a globalement deux grandes solutions. La première est celle des interruptions, une fonctionnalité de communication entre CPU et périphérique, qui sont gérées par le pilote du GPU. Mais elles sont assez couteuses et ne sont utilisées que pour des évènements vraiment importants, critiques, qui demandent une réaction rapide du processeur. L'autre solution est celle du ''pooling'', où le processeur monitore la carte graphique à intervalles réguliers. Deux solutions bien connues de ceux qui ont déjà lu un cours d'architecture des ordinateurs digne de ce nom, rien de bien neuf : la carte graphique communique avec le processeur comme tout périphérique. Pour faciliter l'implémentation du ''pooling'', la carte graphique contient des registres de statut, dans le processeur de commande, qui mémorisent tout ou partie de l'état de la carte graphique. Si un problème survient, certains bits du registre de statut seront mis à 1 pour indiquer que telle erreur bien précise a eu lieu. Il existe aussi un registre de statut qui mémorise le numéro de la commande en cours, ou de la dernière commande terminée, ce qui permet de savoir où en est la carte graphique dans l'exécution des commandes. Et certaines registres de statut sont dédiés à la gestion des commandes. Ils sont totalement programmable, la carte graphique peut écrire dedans sans problème. Les cartes graphiques récentes incorporent des commandes pour modifier ces registres de statut au besoin. Elles sont appelées des '''commandes de synchronisation''' : les barrières (''fences''). Elles permettent d'écrire une valeur dans un registre de statut quand telle ou telle condition est remplie. Par exemple, si jamais une commande est terminée, on peut écrire la valeur 1 dans tel ou tel registre. La condition en question peut être assez complexe et se résumer à quelque chose du genre : "si jamais toutes les ''shaders'' ont fini de traiter tel ensemble de textures, alors écrit la valeur 1024 dans le registre de statut numéro 9". ==L'exemple du processeur de commande du NV1== Pour donner un exemple, prenons la première carte graphique de NVIDIA, le NV1. Il s'agissait d'une carte multimédia qui incorporait non seulement une carte 2D/3D, mais aussi une carte son un contrôleur de disque et de quoi communiquer avec des manettes. Il utilisait une mémoire FIFO dédiée aux commandes matérielles. Le processeur pouvait ainsi envoyer plusieurs commandes au GPU, en une seule transaction. Il y avait donc une copie de la file de commandes vers cette FIFO. Le GPU exécutait alors les commandes une par une. Le processeur pouvait consulter la FIFO pour savoir s'il restait des entrées libres et combien. Le processeur savait ainsi combien d'écritures il pouvait envoyer en une fois au GPU. : Le fonctionnement de la FIFO du NV1 est décrit dans le brevet ''US5805930A : System for FIFO informing the availability of stages to store commands which include data and virtual address sent directly from application programs''. En plus de cette FIFO de commandes, il incorporait un contrôleur DMA pour échanger des données entre RAM système et les autres circuits. Lorsque le processeur voulait copier des données en mémoire vidéo, il envoyait une commande de copie, qui était stockée dans la FIFO de commande, puis était exécutée par le processeur de commande. Le processeur de commande envoyait alors les ordres adéquats au contrôleur DMA, qui faisait la copie des données. [[File:Microarchitecture du GPU NV1 de NVIDIA.png|centre|vignette|upright=2|Microarchitecture du GPU NV1 de NVIDIA]] Le NVIDIA NV1 avait diverses optimisations pour supporter plusieurs applications à la fois. L'une d'entre elle est le support de plusieurs tampons de commande. La carte graphique gérait en tout 128 tampons de commandes, chacun contenant 32 commandes consécutives. Le tout permettait à 128 logiciels différents d'avoir chacun son propre tampon de commande. L'implémentation du NV1 utilisait en réalité une FIFO unique, dans une mémoire RAM unique, qui était segmentée en 128 sous-FIFOs. Mais il est techniquement possible d'utiliser plusieurs FIFOs séparées connectées à un multiplexeur en sortie et un démultiplexeur en entrée. Le NV1 utilisait des adresses de 23 bits, ce qui fait 8 méga-octets de RAM. Les 8 méga-octets étaient découpées en 128 blocs de mémoire consécutifs, chacun étant associé à une application et faisant 64 kilo-octets. Les adresses de 23 bits étaient donc découpées en une portion de 7 bit pour identifier le logiciel qui envoie la commande, et une portion de 16 bits pour identifier la position des données dans le bloc de RAM. Une entrée dans la FIFO du NV1 faisait 48 bits, contenant une donnée de 32 bits et les 16 bits de l'adresse. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le rendu d'une scène 3D : l'API graphique | prevText=Le rendu d'une scène 3D : l'API graphique | next=La répartition du travail sur les unités de shaders | netxText=La répartition du travail sur les unités de shaders }}{{autocat}} </noinclude> aqw6pg1morvayhzxwyk3ocznp9dplxi Les opérations bit à bit/Les prédicats de comparaison 0 70456 765011 667236 2026-04-25T09:25:19Z DavidL 1746 765011 wikitext text/x-wiki Tous les langages de programmation gèrent les comparaisons et conditions, à l'exception de quelques langages très rares. Le résultat d'une comparaison est ce qu'on appelle un booléen, une variable qui ne peut prendre que les valeurs vrai et faux (True et False). Un bit suffit pour stocker cette valeur : en général 0 représente faux et 1 représente vrai. Au niveau du processeur, ce résultat peut être mémorisé de plusieurs manières. Les processeurs x86 mémorisent le résultat de la comparaison dans un registre d"état, dont les bits ont une interprétation prédéfinie. Ces bits sont accédés par des instructions de branchement, ce qui permet de programmer des structures de contrôles, comme des IF, WHILE, et autres. Mais il arrive que le programmeurs souhaite utiliser des booléens et faire des opérations dessus sans forcément les utiliser dans une structure de contrôle. Il est alors possible de stocker un booléen dans une variable, certains langages ayant même un type booléen dédié. Dans le langage Java, le type <code>boolean</code> permet d'utiliser les valeurs booléennes <code>false</code> et <code>true</code>. Dans le langage C, il n'existe pas de type booléen, le résultat des comparaisons pouvant cependant mémorisé dans une variable entière. Le standard C ANSI stipule que cet entier code la valeur False par un 0 et la valeur True par la valeur 1. Des calculs du style x = (a < 15) * (b > 0) * d sont alors possibles. Cependant, le processeur peut ne pas gérer de telles opérations nativement. Autant les processeurs sans registre d'état (les MIPS, ARM et quelques CPU RISC) le peuvent grâce à la présence de certaines instructions, ce n'est pas le cas sur les processeurs x86 ou quelques autres jeux d'instructions avec un registre d'état. Les résultats de comparaison doivent alors être calculés sans recourir à des instructions de comparaison et être calculées à grand coup d'opérations bit à bit. Voyons comment faire. Les formules que nous allons voir placent le prédicat (le résultat de la comparaison) dans un entier, et précisément dans son bit de signe. Un simple décalage peut être utilisé pour respecter la convention 0 = False et 1 = True. Dans le cas où on doit traiter plusieurs prédicats avec des opérations logiques on peut parfaitement imaginer combiner les bits de signe avec des opérations logiques et ne faire le décalage qu'au moment où l'on doit effectivement respecter la convention. La raison qui fait que le résultat se situe dans le bit de signe tient à la manière dont on peut effectuer une comparaison. Dans la plupart des unités de calcul, les comparaisons sont implémentées avec des soustractions : on soustrait les opérandes à comparer et on effectue quelques tests sur le résultat pour déterminer les prédicats. Par exemple, un débordement de la soustraction indique que la première opérande est plus petite que celle soustraite. La logique des formules qui vont suivre est plus ou moins la même : on soustrait les deux opérandes, et on fait quelques bidouilles sur les signes ou bits de débordement. Dans ce qui va suivre, <code>abs()</code> désigne la valeur absolue, <code>nabs</code> son opposé, et <code>nlz</code> désigne l'opération Count Leading Zero et les opérandes à comparer seront notées A et B. ==Le prédicat d'égalité/inégalité== Le prédicat d'inégalité, qui indique si les deux nombres comparés sont inégaux, se calcule avec les formules suivantes. La première formule est assez simple à comprendre. Il faut juste remarquer que B - A et A - B sont opposés et ont donc des signes différents : leur OU donnera un bit de signe à 1 dans le résultat. Par contre, si les deux opérandes sont égaux, leur soustraction donnera 0 : le bit de signe vaudra 0 pour les deux soustractions et leur OU aussi. Ainsi, le résultat aura un bit de signe à 0 quand A = B, et à 1 sinon. La seconde formule est une reformulation de la première. * <math>(B - A) | (A - B)</math> * <math>nabs( A - B ) </math> Pour le prédicat d'égalité, il suffit de prendre l'opposé des formules précédentes. Cela donne les formules suivantes : * <math>\overline{ (B - A) | (A - B) }</math> * <math>abs( A - B ) - 1</math> ==Le prédicat d'infériorité/supériorité== Le prédicat d'infériorité et de supériorité sont deux faces d'une même pièce : il suffit de faire le calcul de l'un en inversant les opérandes pour calculer l'autre. Aussi, nous allons donc voir le prédicat d'infériorité A < B. Celui-ci existe en une version stricte : A < B, et une version non-stricte : <math>A \leq B</math>. Nous allons les voir dans cet ordre. ===Le prédicat d'infériorité/supériorité stricte=== Celui-ci se calcule, comme le prédicat d'égalité, en calculant A - B et en testant les signes du résultat. Mais les opérations à réaliser sur les signes sont assez complexes à comprendre dans le détail. Pour mieux les comprendre, nous allons voir quel est le signe de A - B selon les signes de A et B, et quel est le résultat de la comparaison. Quatre cas peuvent se présenter : on soustrait un nombre positif à un autre positif, on soustrait un négatif à un positif, on soustrait un positif à un négatif et on soustrait un négatif à un négatif. Quand les opérandes sont de signes différents, on sait d'avance comment calculer le prédicat : un négatif est toujours inférieur à un positif. Maintenant, regardons le cas où les opérandes sont de même signe. On se retrouve alors face à 4 cas différents, selon le signe de A - B. Le premier cas est celui où A et B sont positifs et A - B aussi. Dans ce cas, on sait que A > B : le prédicat est donc faux. Le second cas est celui où A et B sont positifs mais pas A - B. Dans ce cas, on sait que A < B : le prédicat est vrai. Le troisième cas est celui où les deux opérandes sont négatifs : la soustraction donne donc <math>- A - ( - B ) = B - A</math>. Si leur soustraction donne un résultat négatif, cela signifie que B - A est positif et donc que A < B : le prédicat est vrai. Si le résultat est positif, on est dans la situation inverse : le prédicat est donc faux. En traduisant les signes en bits de signe, on a alors : {|class="wikitable" |- !Signe de A !Signe de B !Signe de A - B !Prédicat A < B |- |0 |0 |0 |0 |- |0 |0 |1 |1 |- |0 |1 |0 |0 |- |0 |1 |1 |0 |- |1 |0 |0 |1 |- |1 |0 |1 |1 |- |1 |1 |0 |0 |- |1 |1 |1 |1 |} En utilisant la méthode des minterms, on trouve l'équation suivante : : <math> ( a . \overline{b} ) | \left[ ( a - b ) . \overline{ a \oplus b } \right] </math> Dans ce cas précis, l'équation précédente peut se simplifier en : : <math> ( a . \overline{b} ) | \left[ ( a - b ) . ( a | \overline{b} ) \right] </math> Il faut cependant faire une précision importante : les opérations précédentes doivent modifier directement l'écriture binaire des opérandes. Autant cela ne pose pas de problèmes pour les opérations logiques et bit à bit, autant la soustraction ne donnera pas le bon résultat sans conversion. En C, cela demande d'utiliser des opérandes qui sont de type unsigned, et non des int. La conversion se fait en passant par des conversions de pointeurs assez spéciales. ===Le prédicat d'infériorité/supériorité non-stricte=== Les formules précédentes donnent un prédicat pour l'infériorité stricte A < B. Mais il est aussi possible de dériver un critère pour l'infériorité non-stricte A <= B. Pour cela, il faut simplement fusionner le critère d'égalité et celui d'infériorité : un simple OU entre les deux suffit ! L'équation obtenue peut naturellement se simplifier, avec beaucoup de labeur. La formule final obtenue est la suivante : : <math> ( \overline{a} | b ) . \left[ ( a \oplus b ) | (\overline{b - a} ) \right] </math> Enfin, ce prédicat peut se calculer avec une seule instruction sur certaines processeurs. La plupart des processeurs ont dans leur registre d'état un bit qui indique si une retenue a été générée par une addition/soustraction. Tout addition/soustraction modifie ce bit selon son résultat. Certains processeurs permettent, à la suite d'un calcul arithmétique, de déplacer cette retenue dans un registre en une seule instruction. Dans le cas d'une soustraction, ce bit est mis à 1 si <math>A\leq B</math>. En clair, l'instruction précédente permet de calculer ce prédicat en une fois, sans passer par des opérations compliquées. ==Le prédicat de comparaison== Le '''prédicat de comparaison''' permet de connaitre le signe du nombre. Traditionnellement, il s'agit d'une fonction qui vaut : <math>signe ( x , y ) = \left \{ \begin{array}{r c l} 1 , x > y \\ 0 , x = y \\ -1 , x < y \\ \end{array} \right . </math> En utilisant les prédicats de comparaison précédent, on peut calculer cette fonction signe avec la formule suivante : : <math>( x > y ) - ( x < y )</math> Pour comprendre cette formule, le mieux est de regarder d'étudier tous les cas possibles pour les comparaisons <math>x > y</math> et <math>x < y</math> et d'en déduire le résultat du calcul complet. {|class="wikitable" |- ! <math>x > y</math> ! <math>x < y</math> ! ! <math>( x > y ) - ( x < y )</math> |- | 0 | 0 | | 0 |- | 0 | 1 | | -1 |- | 1 | 0 | | 1 |- | 1 | 1 | | Impossible |} Une autre formule possible est la suivante : : <math>( x \geq y ) - ( x \leq y )</math> Là encore, étudions tous les cas possibles pour voir ce que fait ce calcul. {|class="wikitable" |- ! <math>x \geq y</math> ! <math>x \leq y</math> ! ! <math>( x \geq y ) - ( x \leq y )</math> |- | 0 | 0 | | Impossible |- | 0 | 1 | | -1 |- | 1 | 0 | | 1 |- | 1 | 1 | | 0 |} ===Le prédicat de signe=== Le '''prédicat de signe''' est une fonction qui vaut : <math>signe ( n ) = \left \{ \begin{array}{r c l} 1 , n > 0 \\ 0 , n = 0 \\ -1 , n < 0 \\ \end{array} \right . </math> On peut remarquer que celui-ci se calcule en comparant le nombre avec 0 : il suffit d'utiliser la fonction précédente avec y = 0. On peut donc le calculer avec la fonction suivante : : <math> ( x > 0 ) - ( x < 0 )</math> : <math> ( x \geq 0 ) - ( x \leq 0 )</math> ==Le prédicat d'inégalité des signes== Déterminer si deux entiers ont des signes différents peut sembler trivial, mais vous n'aurez peut-être pas pensé que cela pouvait se faire avec une seule comparaison. Un code naïf pour résoudre ce problème devrait utiliser plusieurs comparaisons : une expression pour vérifier si la première variable est positive et l'autre négative (deux comparaisons), et une autre expression pour vérifier l'inverse (deux comparaisons, encore). Le code qui correspond serait le suivant : <syntaxhighlight lang="c"> int SignUnequals (int a , int b) { return ( a >= 0 && b < 0 ) || ( a < 0 && b >= 0 ); } </syntaxhighlight> Ou bien avec 3 comparaisons : <syntaxhighlight lang="c"> int SignUnequals (int a , int b) { return ( a < 0 ) != ( b < 0 ); // Ou encore ( a >= 0 ) != ( b >= 0 ) } </syntaxhighlight> Mais l'opération XOR permet de faire cette vérification en une seule comparaison. Pour comprendre pourquoi, il faut rappeler que le bit de poids fort donne le signe du nombre, peu importe la représentation des nombres utilisée. Cela fonctionne non seulement en signe-magnitude, mais aussi en complément à 1 ou à 2. Lorsque l'on fait un XOR entre deux nombres, les deux "bits de signe" seront XORés, comme tous les autres bits. Or, l'opération XOR renvoie un 1 si les deux bits sont différents et un 0 s'ils sont égaux ! Ainsi, après avoir XORé les deux nombres, le bit de poids fort dira si les deux bits de signe étaient égaux ou non. Il faudra juste comparer sa valeur avec 1 et/ou 0. Pour cela, on pourrait penser utiliser le code suivant : <syntaxhighlight lang="c"> int SignUnequals (int a , int b) { return ((a ^ b) >> 31) & 1 ; } </syntaxhighlight> Mais il y a plus simple encore : on peut déduire le signe du résultat (et donc la valeur du bit de signe) en comparant avec 0 ! Si le résultat a pour bit de signe 1, il est négatif, donc inférieur à 0. Si ce bit de signe vaut 0, le résultat est supérieur ou égal à 0. On peut donc remplacer la sélection du bit de signe assez simplement par une comparaison avec 0. Ce qui donne le code suivant : <syntaxhighlight lang="c"> int SignUnequals (int a , int b) { return (a ^ b) < 0 ; } </syntaxhighlight> {{NavChapitre | book=Les opérations bit à bit | prev=Manipulations intra-mots | prevText=Manipulations intra-mots | next=Le branch-free code | nextText=Le branch-free code }} {{autocat}} 4fi8h89at7h30dph5l1bp231mcwzvtu Fonctionnement d'un ordinateur/Les mémoires RAM dynamiques (DRAM) 0 71327 764843 764702 2026-04-24T14:04:09Z Mewtow 31375 /* Le contrôleur de DRAM */ 764843 wikitext text/x-wiki Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un '''rafraîchissement mémoire'''. Et celui-ci rend les DRAM très différentes des SRAM. Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires ''Fast Page Mode'' sont apparues, suivies par les mémoires ''Extended Data Out'', puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles. Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des '''chips mémoire''', ou encore, des puces mémoires. [[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]] Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un. ==L'interface des DRAM et le contrôleur mémoire== L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un '''contrôleur mémoire externe'''. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de '''contrôleur de DRAM''', plus parlant. ===Le bus d'adresse des DRAM est multiplexé=== Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un '''bus d'adresse multiplexé'''. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale. Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse. Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne. [[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]] Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée. [[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]] ===Le rafraichissement mémoire=== La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture. La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare. Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir. [[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]] Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des '''mémoires pseudo-statiques''', qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même. L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un '''rafraichissement en rafale''', le second un '''rafraichissement étalé'''. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire. Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas. ===Le contrôleur de DRAM=== Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM. Il est possible de connecter plusieurs barrettes sur le même contrôleur mémoire, ou alors celles-ci sont connectées au contrôleur de DRAM avec un bus par barrette/boitier. C'est ce qui permet de placer plusieurs barrettes de mémoire sur la même carte mère : toutes les barrettes sont connectées au contrôleur de DRAM d'une manière ou d'une autre. ==Les rangées : l'arrangement horizontal et vertical== Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités. La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul. ===L'arrangement vertical : cumuler des adresses mémoire=== Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]] Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux ''Chip Select'' sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un '''décodage d'adresse'''. Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} ===L'arrangement horizontal : élargir le bus de données=== L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM. Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits. [[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]] Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une '''rangée''' (le terme anglais est ''rank''). [[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]] ===L'arrangement horizontal et vertical combinés=== Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée. Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips. [[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]] Le choix entre la première ou la seconde rangée se fait en configurant les bits ''Chip Select'' de chaque rangée. Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et envoyés sur le bus de commande. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée. : Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM. ==Les barrettes de mémoire DRAM== [[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]] Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des ''barrettes mémoires'''. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé '''slot mémoire'''. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un ''slot'' mémoire. [[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]] Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques. Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité. {|class="wikitable" |- !Type de barrette !Type de mémoire !Nombre de broches |- | rowspan="2" | SIMM | rowspan="2" | FPM/EDO |30 |- |72 |- | rowspan="4" | DIMM |SDRAM |168 |- |DDR |184 |- |DDR2 |214, 240 ou 244, suivant la barrette ou la carte mère. |- |DDR3 |204 ou 240, suivant la barrette ou la carte mère. |} ===Le format des barrettes de mémoire=== Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM. * Les '''barrettes SIMM''' ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM. * Les '''barrettes DIMM''' ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR. {| class="flexible" |+ '''Barrette SIMM''' |- |[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]] |[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]] |} : Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux. Les barrettes '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes. {| |- |[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]] |[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]] |} Les barrettes de Rambus ont parfois été appelées des '''barrettes RB-DIMM''', mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux. ===Les interconnexions à l'intérieur d'une barrette de mémoire=== Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée. Les DDR1 et 2 utilisent ce qu'on appelle une '''topologie en T''', illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements. [[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]] En comparaison, les DDR3 utilisent une '''topologie ''fly-by''''', où les puces sont connectées en série sur le bus de commande/adresse. La topologie ''fly-by'' n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence. [[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']] ===Les barrettes tamponnées (à registres)=== Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre. Les barrettes de ce genre sont appelées des '''barrettes RIMM'''. Il en existe deux types : * Avec les '''barrettes RDIMM''', le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données. * Avec les '''barrettes LRDIMM''' (''Load Reduced DIMMs''), le registre fait tampon pour tous les bus, y compris le bus de données. [[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]] ===Le ''Serial Presence Detect''=== [[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]] Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le '''''Serial Presence Detect''''', aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut. Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect]. ==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM== Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des '''mémoires asynchrones'''. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les '''mémoires FPM''' et '''mémoires EDO'''. Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. ===Les mémoires FPM=== Les '''mémoires FPM (''Fast Page Mode'')''' possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse. Il existe une petite différence entre les mémoire ''Page Mode'' et les mémoires ''Fast-Page Mode'' proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les ''Fast-Page Mode'', l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Avec les '''mémoires en mode quartet''', il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS. [[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]] Les '''mémoires FPM à colonne statique''' se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS. [[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]] ===Les mémoires EDO-RAM=== L''''EDO-RAM''' a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée ''Ouput Enable'' à une mémoire FPM. Pour rappel, l'entrée ''Ouput Enable'' permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées. Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de ''pipelining'', sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie. La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides. [[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]] Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours. ===Les mémoires EDO-RAM avec mode rafale=== Les '''EDO en rafale''' effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale. [[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]] Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout. [[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]] ===Le rafraichissement mémoire=== Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de '''rafraichissement par adresse''' qui est donné à cette méthode de commande du rafraichissement mémoire. Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un ''timer'' interne permettait de savoir quand rafraichir la mémoire : quand ce ''timer'' atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le ''timer'' était ''reset''. [[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]] Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme '''rafraichissement interne'''. [[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]] On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements. [[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]] ==Les mémoires SDRAM== Dans les années 90, les mémoires asynchrones ont laissé la place aux '''mémoires SDRAM''', qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des ''wait states'' en attendant que la mémoire ait fini. Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous : {| class="wikitable" ! Nom standard ! Fréquence ! Bande passante |- | PC66 | 66 mhz | 528 Mio/s |- | PC66 | 100 mhz | 800 Mio/s |- | PC66 | 133 mhz | 1064 Mio/s |- | PC66 | 150 mhz | 1200 Mio/s |} ===Les banques internes aux chips mémoires SDRAM=== L'intérieur d'une mémoire SDRAM contient plusieurs '''banques''', aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO. De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps. Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || || || || || || || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || |- ! Banque Numéro 3 | || || || || || || || || || || |- ! Banque Numéro 4 | || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || |} ===Le mode rafale des SDRAM=== Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale. les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre : {|class="wikitable" |+ Signification des bits du registre de mode des SDRAM |- ! Bit n°9 | Type d'accès : en rafale ou normal |- ! Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |- ! Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |- ! Bit n°3 | Type de rafale : linéaire ou entrelacée |- ! Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |} ===L'interface d'une mémoire SDRAM=== Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée ''Chip Select'' (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO. Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le '''bit CKE''' est l'abréviation de ''Clock Enable'', qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien. Le '''bit DQM''' est une sorte de bit ''Output Enable'', avec une nuance importante. Le terme DQM est l'abréviation de ''Data Mask'', ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet. Le bus d'adresse est particulier, car il tient compte de la présence de ''banques mémoires''. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une '''adresse de banque''' et une '''adresse intra-banque'''. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5. Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres. ===Les commandes SDRAM=== Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ... Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM. La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL. Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus. Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA. {| class="wikitable" style="text-align:center" ! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bus d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Stoppe un accès en rafale (en cours). |- | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lit une donnée depuis la ligne active. |- | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lit une donnée depuis la ligne active, puis ferme la ligne. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrit une donnée dans la ligne active. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |- | 0 || 0 || 1 || 1 || Adresse de la banque || colspan="2" | Adresse de la ligne || ACT : charge une ligne dans le tampon de ligne. |- | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |- | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées. Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme : [[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]] ===Les délais mémoires=== Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. Les délais mémoire le plus importants sont résumés ci-dessous : {|class="wikitable" |- !Timing!!Description |- | colspan="2" | |- ! colspan="2" | Délais primaires |- ||tRP|| Temps entre une commande PRECHARGE et une commande ACT |- ||tRCD|| Temps entre une commande ACT et une commande READ/WRITE. |- ||tCL|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |- ||tDQSS|| Temps entre une commande WRITE et l'écriture de la donnée. |- ||tCAS-to-CAS|| Temps minimum entre deux commandes READ. |- ! colspan="2" | Délais secondaires |- ||tWTR|| Temps entre une lecture et une écriture consécutives. |- ||tRAS || Temps entre une commande ACT et une commande PRECHARGE. |} La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM. Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le ''Serial Presence Detect'' de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM. ===Les commandes anticipées=== Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de '''commandes SDRAM anticipées'''. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale, qui envoie plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours. Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Enregistrement de la commande dans le registre d'adresse/commande | bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Accès au cœur asynchrone | || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || || || |- ! Lecture/écriture du registre de données | || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Les DDR2 et 3 vont encore plus loin avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des ''timings''. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire. ==Les mémoires DDR== Les mémoires SDRAM récentes sont des mémoires de type ''dual data rate'', ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires ''dual data rate'' ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même. Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts. ===Les performances des mémoires DDR=== Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser. {|class="wikitable" |- ! Année ! Type de mémoire ! Fréquence de la mémoire (haut de gamme) ! Fréquence du bus ! Coefficient multiplicateur entre les deux fréquences |- | 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |- | 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |- | 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |- | 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |- | 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |} Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration. ===Les commandes des mémoires DDR=== Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative. Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer. Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande ''Burst Terminate'', la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des '''CAS postés'''. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des ''timings'' nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM. Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes. {| class="wikitable" style="text-align:center" |+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM ! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (4 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- style="background: #CCFFCC" | 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} ==Les VRAM des cartes vidéo== Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des '''''Graphics RAM''''' (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique. Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU/GPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Les mémoires SGRAM et GDDR=== De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que ''Graphic RAM''. Les plus connues sont les '''mémoires GDDR''', pour ''graphics double data rate'', utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port. ==Les mémoires SLDRAM, RDRAM et associées== Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large. Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de '''DRAM à commutation par paquets'''. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception. Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la ''RDRAM'' (''Rambus DRAM'') et ses deux successeurs ''XDR RAM'' et ''XDR RAM 2''. La ''Synchronous-link DRAM'' (''SLDRAM'') est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire. ===La SLDRAM (''Synchronous-link DRAM'')=== Les '''mémoires SLDRAM''' avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes. Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. A la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas. Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non. {|class="wikitable" style="text-align:center" |+SLDRAM Read, write or row op request packet ! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0 |- ! 1 | colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande |- ! 0 | colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne |- ! 0 | colspan=9 bgcolor=#ffffcc| Ligne || 0 |- ! 0 | 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne |} ===Les mémoires Rambus=== Les mémoires conçues par la société Rambus regroupent la '''RDRAM''' (''Rambus DRAM'') et ses deux successeurs '''XDR RAM''' et '''XDR RAM 2'''. Les toutes premières étaient les '''mémoires RDRAM''', où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame. Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en ''dual-channel'', pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM. ==Les eDRAM : des DRAM adaptées aux ''chiplets''== Les '''mémoires eDRAM''', pour ''embedded DRAM'', sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire. Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un ''chiplet'', , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type ''chiplet'' avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM. Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte. Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés. ''Crystal Well'' était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de ''double data rate'', entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. ''Crystal Well'' consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires SRAM synchrones | prevText=Les mémoires SRAM synchrones | next=Contrôleur mémoire externe | nextText=Le contrôleur mémoire externe }}{{autocat}} </noinclude> auv8hxfahmrk9vonajm1macd0plx4b3 764845 764843 2026-04-24T14:06:01Z Mewtow 31375 /* L'interface des DRAM et le contrôleur mémoire */ 764845 wikitext text/x-wiki Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un '''rafraîchissement mémoire'''. Et celui-ci rend les DRAM très différentes des SRAM. Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires ''Fast Page Mode'' sont apparues, suivies par les mémoires ''Extended Data Out'', puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles. Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des '''chips mémoire''', ou encore, des puces mémoires. [[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]] Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un. ==L'interface des DRAM et le contrôleur mémoire== L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un '''contrôleur mémoire externe'''. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de '''contrôleur de DRAM''', plus parlant. Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM. ===Le bus d'adresse des DRAM est multiplexé=== Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un '''bus d'adresse multiplexé'''. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale. Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse. Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne. [[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]] Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée. [[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]] ===Le rafraichissement mémoire=== La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture. La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare. Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir. [[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]] Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des '''mémoires pseudo-statiques''', qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même. L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un '''rafraichissement en rafale''', le second un '''rafraichissement étalé'''. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire. Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas. ==Les rangées : l'arrangement horizontal et vertical== Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités. La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul. ===L'arrangement vertical : cumuler des adresses mémoire=== Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]] Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux ''Chip Select'' sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un '''décodage d'adresse'''. Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} ===L'arrangement horizontal : élargir le bus de données=== L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM. Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits. [[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]] Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une '''rangée''' (le terme anglais est ''rank''). [[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]] ===L'arrangement horizontal et vertical combinés=== Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée. Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips. [[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]] Le choix entre la première ou la seconde rangée se fait en configurant les bits ''Chip Select'' de chaque rangée. Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et envoyés sur le bus de commande. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée. : Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM. ==Les barrettes de mémoire DRAM== [[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]] Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des ''barrettes mémoires'''. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé '''slot mémoire'''. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un ''slot'' mémoire. [[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]] Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques. Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité. {|class="wikitable" |- !Type de barrette !Type de mémoire !Nombre de broches |- | rowspan="2" | SIMM | rowspan="2" | FPM/EDO |30 |- |72 |- | rowspan="4" | DIMM |SDRAM |168 |- |DDR |184 |- |DDR2 |214, 240 ou 244, suivant la barrette ou la carte mère. |- |DDR3 |204 ou 240, suivant la barrette ou la carte mère. |} ===Le format des barrettes de mémoire=== Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM. * Les '''barrettes SIMM''' ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM. * Les '''barrettes DIMM''' ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR. {| class="flexible" |+ '''Barrette SIMM''' |- |[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]] |[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]] |} : Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux. Les barrettes '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes. {| |- |[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]] |[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]] |} Les barrettes de Rambus ont parfois été appelées des '''barrettes RB-DIMM''', mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux. ===Les interconnexions à l'intérieur d'une barrette de mémoire=== Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée. Les DDR1 et 2 utilisent ce qu'on appelle une '''topologie en T''', illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements. [[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]] En comparaison, les DDR3 utilisent une '''topologie ''fly-by''''', où les puces sont connectées en série sur le bus de commande/adresse. La topologie ''fly-by'' n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence. [[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']] ===Les barrettes tamponnées (à registres)=== Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre. Les barrettes de ce genre sont appelées des '''barrettes RIMM'''. Il en existe deux types : * Avec les '''barrettes RDIMM''', le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données. * Avec les '''barrettes LRDIMM''' (''Load Reduced DIMMs''), le registre fait tampon pour tous les bus, y compris le bus de données. [[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]] ===Le ''Serial Presence Detect''=== [[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]] Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le '''''Serial Presence Detect''''', aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut. Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect]. ==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM== Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des '''mémoires asynchrones'''. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les '''mémoires FPM''' et '''mémoires EDO'''. Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. ===Les mémoires FPM=== Les '''mémoires FPM (''Fast Page Mode'')''' possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse. Il existe une petite différence entre les mémoire ''Page Mode'' et les mémoires ''Fast-Page Mode'' proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les ''Fast-Page Mode'', l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Avec les '''mémoires en mode quartet''', il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS. [[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]] Les '''mémoires FPM à colonne statique''' se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS. [[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]] ===Les mémoires EDO-RAM=== L''''EDO-RAM''' a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée ''Ouput Enable'' à une mémoire FPM. Pour rappel, l'entrée ''Ouput Enable'' permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées. Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de ''pipelining'', sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie. La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides. [[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]] Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours. ===Les mémoires EDO-RAM avec mode rafale=== Les '''EDO en rafale''' effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale. [[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]] Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout. [[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]] ===Le rafraichissement mémoire=== Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de '''rafraichissement par adresse''' qui est donné à cette méthode de commande du rafraichissement mémoire. Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un ''timer'' interne permettait de savoir quand rafraichir la mémoire : quand ce ''timer'' atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le ''timer'' était ''reset''. [[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]] Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme '''rafraichissement interne'''. [[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]] On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements. [[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]] ==Les mémoires SDRAM== Dans les années 90, les mémoires asynchrones ont laissé la place aux '''mémoires SDRAM''', qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des ''wait states'' en attendant que la mémoire ait fini. Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous : {| class="wikitable" ! Nom standard ! Fréquence ! Bande passante |- | PC66 | 66 mhz | 528 Mio/s |- | PC66 | 100 mhz | 800 Mio/s |- | PC66 | 133 mhz | 1064 Mio/s |- | PC66 | 150 mhz | 1200 Mio/s |} ===Les banques internes aux chips mémoires SDRAM=== L'intérieur d'une mémoire SDRAM contient plusieurs '''banques''', aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO. De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps. Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || || || || || || || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || |- ! Banque Numéro 3 | || || || || || || || || || || |- ! Banque Numéro 4 | || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || |} ===Le mode rafale des SDRAM=== Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale. les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre : {|class="wikitable" |+ Signification des bits du registre de mode des SDRAM |- ! Bit n°9 | Type d'accès : en rafale ou normal |- ! Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |- ! Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |- ! Bit n°3 | Type de rafale : linéaire ou entrelacée |- ! Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |} ===L'interface d'une mémoire SDRAM=== Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée ''Chip Select'' (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO. Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le '''bit CKE''' est l'abréviation de ''Clock Enable'', qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien. Le '''bit DQM''' est une sorte de bit ''Output Enable'', avec une nuance importante. Le terme DQM est l'abréviation de ''Data Mask'', ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet. Le bus d'adresse est particulier, car il tient compte de la présence de ''banques mémoires''. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une '''adresse de banque''' et une '''adresse intra-banque'''. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5. Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres. ===Les commandes SDRAM=== Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ... Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM. La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL. Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus. Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA. {| class="wikitable" style="text-align:center" ! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bus d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Stoppe un accès en rafale (en cours). |- | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lit une donnée depuis la ligne active. |- | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lit une donnée depuis la ligne active, puis ferme la ligne. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrit une donnée dans la ligne active. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |- | 0 || 0 || 1 || 1 || Adresse de la banque || colspan="2" | Adresse de la ligne || ACT : charge une ligne dans le tampon de ligne. |- | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |- | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées. Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme : [[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]] ===Les délais mémoires=== Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. Les délais mémoire le plus importants sont résumés ci-dessous : {|class="wikitable" |- !Timing!!Description |- | colspan="2" | |- ! colspan="2" | Délais primaires |- ||tRP|| Temps entre une commande PRECHARGE et une commande ACT |- ||tRCD|| Temps entre une commande ACT et une commande READ/WRITE. |- ||tCL|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |- ||tDQSS|| Temps entre une commande WRITE et l'écriture de la donnée. |- ||tCAS-to-CAS|| Temps minimum entre deux commandes READ. |- ! colspan="2" | Délais secondaires |- ||tWTR|| Temps entre une lecture et une écriture consécutives. |- ||tRAS || Temps entre une commande ACT et une commande PRECHARGE. |} La façon de mesurer ces délais varie : sur les mémoires FPM et EDO, on les mesure en unités de temps (secondes, millisecondes, micro-secondes, etc.), tandis qu'on les mesure en cycles d'horloge sur les mémoires SDRAM. Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le ''Serial Presence Detect'' de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM. ===Les commandes anticipées=== Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de '''commandes SDRAM anticipées'''. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale, qui envoie plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours. Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Enregistrement de la commande dans le registre d'adresse/commande | bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Accès au cœur asynchrone | || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || || || |- ! Lecture/écriture du registre de données | || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Les DDR2 et 3 vont encore plus loin avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des ''timings''. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire. ==Les mémoires DDR== Les mémoires SDRAM récentes sont des mémoires de type ''dual data rate'', ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires ''dual data rate'' ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même. Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts. ===Les performances des mémoires DDR=== Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser. {|class="wikitable" |- ! Année ! Type de mémoire ! Fréquence de la mémoire (haut de gamme) ! Fréquence du bus ! Coefficient multiplicateur entre les deux fréquences |- | 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |- | 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |- | 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |- | 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |- | 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |} Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration. ===Les commandes des mémoires DDR=== Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative. Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer. Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande ''Burst Terminate'', la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des '''CAS postés'''. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des ''timings'' nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM. Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes. {| class="wikitable" style="text-align:center" |+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM ! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (4 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- style="background: #CCFFCC" | 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} ==Les VRAM des cartes vidéo== Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des '''''Graphics RAM''''' (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique. Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU/GPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Les mémoires SGRAM et GDDR=== De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que ''Graphic RAM''. Les plus connues sont les '''mémoires GDDR''', pour ''graphics double data rate'', utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port. ==Les mémoires SLDRAM, RDRAM et associées== Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large. Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de '''DRAM à commutation par paquets'''. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception. Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la ''RDRAM'' (''Rambus DRAM'') et ses deux successeurs ''XDR RAM'' et ''XDR RAM 2''. La ''Synchronous-link DRAM'' (''SLDRAM'') est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire. ===La SLDRAM (''Synchronous-link DRAM'')=== Les '''mémoires SLDRAM''' avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes. Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. A la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas. Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non. {|class="wikitable" style="text-align:center" |+SLDRAM Read, write or row op request packet ! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0 |- ! 1 | colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande |- ! 0 | colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne |- ! 0 | colspan=9 bgcolor=#ffffcc| Ligne || 0 |- ! 0 | 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne |} ===Les mémoires Rambus=== Les mémoires conçues par la société Rambus regroupent la '''RDRAM''' (''Rambus DRAM'') et ses deux successeurs '''XDR RAM''' et '''XDR RAM 2'''. Les toutes premières étaient les '''mémoires RDRAM''', où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame. Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en ''dual-channel'', pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM. ==Les eDRAM : des DRAM adaptées aux ''chiplets''== Les '''mémoires eDRAM''', pour ''embedded DRAM'', sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire. Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un ''chiplet'', , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type ''chiplet'' avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM. Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte. Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés. ''Crystal Well'' était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de ''double data rate'', entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. ''Crystal Well'' consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires SRAM synchrones | prevText=Les mémoires SRAM synchrones | next=Contrôleur mémoire externe | nextText=Le contrôleur mémoire externe }}{{autocat}} </noinclude> nbjjg10bxxa8cvhpj7w98vkyrgvg7uo 764848 764845 2026-04-24T14:19:15Z Mewtow 31375 /* Les délais mémoires */ 764848 wikitext text/x-wiki Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un '''rafraîchissement mémoire'''. Et celui-ci rend les DRAM très différentes des SRAM. Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires ''Fast Page Mode'' sont apparues, suivies par les mémoires ''Extended Data Out'', puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles. Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des '''chips mémoire''', ou encore, des puces mémoires. [[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]] Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un. ==L'interface des DRAM et le contrôleur mémoire== L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un '''contrôleur mémoire externe'''. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de '''contrôleur de DRAM''', plus parlant. Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM. ===Le bus d'adresse des DRAM est multiplexé=== Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un '''bus d'adresse multiplexé'''. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale. Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse. Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne. [[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]] Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée. [[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]] ===Le rafraichissement mémoire=== La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture. La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare. Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir. [[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]] Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des '''mémoires pseudo-statiques''', qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même. L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un '''rafraichissement en rafale''', le second un '''rafraichissement étalé'''. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire. Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas. ==Les rangées : l'arrangement horizontal et vertical== Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités. La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul. ===L'arrangement vertical : cumuler des adresses mémoire=== Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]] Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux ''Chip Select'' sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un '''décodage d'adresse'''. Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} ===L'arrangement horizontal : élargir le bus de données=== L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM. Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits. [[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]] Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une '''rangée''' (le terme anglais est ''rank''). [[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]] ===L'arrangement horizontal et vertical combinés=== Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée. Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips. [[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]] Le choix entre la première ou la seconde rangée se fait en configurant les bits ''Chip Select'' de chaque rangée. Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et envoyés sur le bus de commande. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée. : Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM. ==Les barrettes de mémoire DRAM== [[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]] Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des ''barrettes mémoires'''. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé '''slot mémoire'''. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un ''slot'' mémoire. [[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]] Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques. Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité. {|class="wikitable" |- !Type de barrette !Type de mémoire !Nombre de broches |- | rowspan="2" | SIMM | rowspan="2" | FPM/EDO |30 |- |72 |- | rowspan="4" | DIMM |SDRAM |168 |- |DDR |184 |- |DDR2 |214, 240 ou 244, suivant la barrette ou la carte mère. |- |DDR3 |204 ou 240, suivant la barrette ou la carte mère. |} ===Le format des barrettes de mémoire=== Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM. * Les '''barrettes SIMM''' ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM. * Les '''barrettes DIMM''' ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR. {| class="flexible" |+ '''Barrette SIMM''' |- |[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]] |[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]] |} : Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux. Les barrettes '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes. {| |- |[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]] |[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]] |} Les barrettes de Rambus ont parfois été appelées des '''barrettes RB-DIMM''', mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux. ===Les interconnexions à l'intérieur d'une barrette de mémoire=== Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée. Les DDR1 et 2 utilisent ce qu'on appelle une '''topologie en T''', illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements. [[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]] En comparaison, les DDR3 utilisent une '''topologie ''fly-by''''', où les puces sont connectées en série sur le bus de commande/adresse. La topologie ''fly-by'' n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence. [[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']] ===Les barrettes tamponnées (à registres)=== Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre. Les barrettes de ce genre sont appelées des '''barrettes RIMM'''. Il en existe deux types : * Avec les '''barrettes RDIMM''', le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données. * Avec les '''barrettes LRDIMM''' (''Load Reduced DIMMs''), le registre fait tampon pour tous les bus, y compris le bus de données. [[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]] ===Le ''Serial Presence Detect''=== [[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]] Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le '''''Serial Presence Detect''''', aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut. Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect]. ==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM== Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des '''mémoires asynchrones'''. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les '''mémoires FPM''' et '''mémoires EDO'''. Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. ===Les mémoires FPM=== Les '''mémoires FPM (''Fast Page Mode'')''' possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse. Il existe une petite différence entre les mémoire ''Page Mode'' et les mémoires ''Fast-Page Mode'' proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les ''Fast-Page Mode'', l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Avec les '''mémoires en mode quartet''', il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS. [[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]] Les '''mémoires FPM à colonne statique''' se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS. [[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]] ===Les mémoires EDO-RAM=== L''''EDO-RAM''' a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée ''Ouput Enable'' à une mémoire FPM. Pour rappel, l'entrée ''Ouput Enable'' permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées. Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de ''pipelining'', sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie. La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides. [[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]] Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours. ===Les mémoires EDO-RAM avec mode rafale=== Les '''EDO en rafale''' effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale. [[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]] Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout. [[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]] ===Le rafraichissement mémoire=== Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de '''rafraichissement par adresse''' qui est donné à cette méthode de commande du rafraichissement mémoire. Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un ''timer'' interne permettait de savoir quand rafraichir la mémoire : quand ce ''timer'' atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le ''timer'' était ''reset''. [[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]] Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme '''rafraichissement interne'''. [[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]] On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements. [[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]] ==Les mémoires SDRAM== Dans les années 90, les mémoires asynchrones ont laissé la place aux '''mémoires SDRAM''', qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des ''wait states'' en attendant que la mémoire ait fini. Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous : {| class="wikitable" ! Nom standard ! Fréquence ! Bande passante |- | PC66 | 66 mhz | 528 Mio/s |- | PC66 | 100 mhz | 800 Mio/s |- | PC66 | 133 mhz | 1064 Mio/s |- | PC66 | 150 mhz | 1200 Mio/s |} ===Les banques internes aux chips mémoires SDRAM=== L'intérieur d'une mémoire SDRAM contient plusieurs '''banques''', aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO. De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps. Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || || || || || || || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || |- ! Banque Numéro 3 | || || || || || || || || || || |- ! Banque Numéro 4 | || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || |} ===Le mode rafale des SDRAM=== Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale. les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre : {|class="wikitable" |+ Signification des bits du registre de mode des SDRAM |- ! Bit n°9 | Type d'accès : en rafale ou normal |- ! Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |- ! Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |- ! Bit n°3 | Type de rafale : linéaire ou entrelacée |- ! Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |} ===L'interface d'une mémoire SDRAM=== Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée ''Chip Select'' (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO. Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le '''bit CKE''' est l'abréviation de ''Clock Enable'', qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien. Le '''bit DQM''' est une sorte de bit ''Output Enable'', avec une nuance importante. Le terme DQM est l'abréviation de ''Data Mask'', ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet. Le bus d'adresse est particulier, car il tient compte de la présence de ''banques mémoires''. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une '''adresse de banque''' et une '''adresse intra-banque'''. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5. Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres. ===Les commandes SDRAM=== Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ... Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM. La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL. Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus. Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA. {| class="wikitable" style="text-align:center" ! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bus d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Stoppe un accès en rafale (en cours). |- | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lit une donnée depuis la ligne active. |- | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lit une donnée depuis la ligne active, puis ferme la ligne. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrit une donnée dans la ligne active. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |- | 0 || 0 || 1 || 1 || Adresse de la banque || colspan="2" | Adresse de la ligne || ACT : charge une ligne dans le tampon de ligne. |- | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |- | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées. Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme : [[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]] ===Les délais mémoires=== Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. Les délais mémoire le plus importants sont résumés ci-dessous : {|class="wikitable" |- !Timing!!Description |- | colspan="2" | |- ! colspan="2" | Délais primaires |- ||tRP|| Temps entre une commande PRECHARGE et une commande ACT |- ||tRCD|| Temps entre une commande ACT et une commande READ/WRITE. |- ||tCL|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |- ||tDQSS|| Temps entre une commande WRITE et l'écriture de la donnée. |- ||tCAS-to-CAS|| Temps minimum entre deux commandes READ. |- ! colspan="2" | Délais secondaires |- ||tWTR|| Temps entre une lecture et une écriture consécutives. |- ||tRAS || Temps entre une commande ACT et une commande PRECHARGE. |} Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le ''Serial Presence Detect'' de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM. Il y a cependant quelques régularités qui reviennent souvent, d'une SDRAM à l'autre. La plus importante est que les délais ne sont pas les mêmes quand on alterne des lectures et écritures. Les délais les plus courts sont observés quand on a des lectures successives, ou des écritures successives. Par contre, les délais s'allongent quand on doit passer d'une lecture à une écriture ou inversement. Les SDRAM préférent qu'on regroupe les lectures avec d'autres lectures, les écritures avec d'autres écritures. ===Les commandes anticipées=== Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de '''commandes SDRAM anticipées'''. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale, qui envoie plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours. Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Enregistrement de la commande dans le registre d'adresse/commande | bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Accès au cœur asynchrone | || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || || || |- ! Lecture/écriture du registre de données | || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Les DDR2 et 3 vont encore plus loin avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des ''timings''. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire. ==Les mémoires DDR== Les mémoires SDRAM récentes sont des mémoires de type ''dual data rate'', ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires ''dual data rate'' ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même. Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts. ===Les performances des mémoires DDR=== Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser. {|class="wikitable" |- ! Année ! Type de mémoire ! Fréquence de la mémoire (haut de gamme) ! Fréquence du bus ! Coefficient multiplicateur entre les deux fréquences |- | 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |- | 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |- | 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |- | 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |- | 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |} Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration. ===Les commandes des mémoires DDR=== Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative. Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer. Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande ''Burst Terminate'', la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des '''CAS postés'''. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des ''timings'' nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM. Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes. {| class="wikitable" style="text-align:center" |+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM ! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (4 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- style="background: #CCFFCC" | 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} ==Les VRAM des cartes vidéo== Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des '''''Graphics RAM''''' (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique. Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU/GPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Les mémoires SGRAM et GDDR=== De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que ''Graphic RAM''. Les plus connues sont les '''mémoires GDDR''', pour ''graphics double data rate'', utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port. ==Les mémoires SLDRAM, RDRAM et associées== Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large. Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de '''DRAM à commutation par paquets'''. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception. Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la ''RDRAM'' (''Rambus DRAM'') et ses deux successeurs ''XDR RAM'' et ''XDR RAM 2''. La ''Synchronous-link DRAM'' (''SLDRAM'') est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire. ===La SLDRAM (''Synchronous-link DRAM'')=== Les '''mémoires SLDRAM''' avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes. Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. A la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas. Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non. {|class="wikitable" style="text-align:center" |+SLDRAM Read, write or row op request packet ! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0 |- ! 1 | colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande |- ! 0 | colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne |- ! 0 | colspan=9 bgcolor=#ffffcc| Ligne || 0 |- ! 0 | 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne |} ===Les mémoires Rambus=== Les mémoires conçues par la société Rambus regroupent la '''RDRAM''' (''Rambus DRAM'') et ses deux successeurs '''XDR RAM''' et '''XDR RAM 2'''. Les toutes premières étaient les '''mémoires RDRAM''', où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame. Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en ''dual-channel'', pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM. ==Les eDRAM : des DRAM adaptées aux ''chiplets''== Les '''mémoires eDRAM''', pour ''embedded DRAM'', sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire. Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un ''chiplet'', , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type ''chiplet'' avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM. Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte. Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés. ''Crystal Well'' était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de ''double data rate'', entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. ''Crystal Well'' consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires SRAM synchrones | prevText=Les mémoires SRAM synchrones | next=Contrôleur mémoire externe | nextText=Le contrôleur mémoire externe }}{{autocat}} </noinclude> eep97hj5x8uhxwoaqhe90qeg6tar1b2 764849 764848 2026-04-24T14:19:46Z Mewtow 31375 /* Les commandes anticipées */ 764849 wikitext text/x-wiki Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un '''rafraîchissement mémoire'''. Et celui-ci rend les DRAM très différentes des SRAM. Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires ''Fast Page Mode'' sont apparues, suivies par les mémoires ''Extended Data Out'', puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles. Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des '''chips mémoire''', ou encore, des puces mémoires. [[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]] Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un. ==L'interface des DRAM et le contrôleur mémoire== L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un '''contrôleur mémoire externe'''. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de '''contrôleur de DRAM''', plus parlant. Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM. ===Le bus d'adresse des DRAM est multiplexé=== Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un '''bus d'adresse multiplexé'''. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale. Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse. Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne. [[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]] Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée. [[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]] ===Le rafraichissement mémoire=== La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture. La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare. Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir. [[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]] Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des '''mémoires pseudo-statiques''', qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même. L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un '''rafraichissement en rafale''', le second un '''rafraichissement étalé'''. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire. Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas. ==Les rangées : l'arrangement horizontal et vertical== Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités. La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul. ===L'arrangement vertical : cumuler des adresses mémoire=== Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]] Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux ''Chip Select'' sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un '''décodage d'adresse'''. Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} ===L'arrangement horizontal : élargir le bus de données=== L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM. Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits. [[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]] Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une '''rangée''' (le terme anglais est ''rank''). [[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]] ===L'arrangement horizontal et vertical combinés=== Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée. Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips. [[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]] Le choix entre la première ou la seconde rangée se fait en configurant les bits ''Chip Select'' de chaque rangée. Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et envoyés sur le bus de commande. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée. : Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM. ==Les barrettes de mémoire DRAM== [[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]] Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des ''barrettes mémoires'''. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé '''slot mémoire'''. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un ''slot'' mémoire. [[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]] Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques. Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité. {|class="wikitable" |- !Type de barrette !Type de mémoire !Nombre de broches |- | rowspan="2" | SIMM | rowspan="2" | FPM/EDO |30 |- |72 |- | rowspan="4" | DIMM |SDRAM |168 |- |DDR |184 |- |DDR2 |214, 240 ou 244, suivant la barrette ou la carte mère. |- |DDR3 |204 ou 240, suivant la barrette ou la carte mère. |} ===Le format des barrettes de mémoire=== Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM. * Les '''barrettes SIMM''' ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM. * Les '''barrettes DIMM''' ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR. {| class="flexible" |+ '''Barrette SIMM''' |- |[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]] |[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]] |} : Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux. Les barrettes '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes. {| |- |[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]] |[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]] |} Les barrettes de Rambus ont parfois été appelées des '''barrettes RB-DIMM''', mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux. ===Les interconnexions à l'intérieur d'une barrette de mémoire=== Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée. Les DDR1 et 2 utilisent ce qu'on appelle une '''topologie en T''', illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements. [[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]] En comparaison, les DDR3 utilisent une '''topologie ''fly-by''''', où les puces sont connectées en série sur le bus de commande/adresse. La topologie ''fly-by'' n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence. [[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']] ===Les barrettes tamponnées (à registres)=== Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre. Les barrettes de ce genre sont appelées des '''barrettes RIMM'''. Il en existe deux types : * Avec les '''barrettes RDIMM''', le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données. * Avec les '''barrettes LRDIMM''' (''Load Reduced DIMMs''), le registre fait tampon pour tous les bus, y compris le bus de données. [[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]] ===Le ''Serial Presence Detect''=== [[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]] Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le '''''Serial Presence Detect''''', aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut. Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect]. ==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM== Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des '''mémoires asynchrones'''. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les '''mémoires FPM''' et '''mémoires EDO'''. Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. ===Les mémoires FPM=== Les '''mémoires FPM (''Fast Page Mode'')''' possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse. Il existe une petite différence entre les mémoire ''Page Mode'' et les mémoires ''Fast-Page Mode'' proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les ''Fast-Page Mode'', l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Avec les '''mémoires en mode quartet''', il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS. [[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]] Les '''mémoires FPM à colonne statique''' se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS. [[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]] ===Les mémoires EDO-RAM=== L''''EDO-RAM''' a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée ''Ouput Enable'' à une mémoire FPM. Pour rappel, l'entrée ''Ouput Enable'' permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées. Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de ''pipelining'', sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie. La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides. [[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]] Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours. ===Les mémoires EDO-RAM avec mode rafale=== Les '''EDO en rafale''' effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale. [[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]] Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout. [[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]] ===Le rafraichissement mémoire=== Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de '''rafraichissement par adresse''' qui est donné à cette méthode de commande du rafraichissement mémoire. Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un ''timer'' interne permettait de savoir quand rafraichir la mémoire : quand ce ''timer'' atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le ''timer'' était ''reset''. [[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]] Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme '''rafraichissement interne'''. [[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]] On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements. [[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]] ==Les mémoires SDRAM== Dans les années 90, les mémoires asynchrones ont laissé la place aux '''mémoires SDRAM''', qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des ''wait states'' en attendant que la mémoire ait fini. Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous : {| class="wikitable" ! Nom standard ! Fréquence ! Bande passante |- | PC66 | 66 mhz | 528 Mio/s |- | PC66 | 100 mhz | 800 Mio/s |- | PC66 | 133 mhz | 1064 Mio/s |- | PC66 | 150 mhz | 1200 Mio/s |} ===Les banques internes aux chips mémoires SDRAM=== L'intérieur d'une mémoire SDRAM contient plusieurs '''banques''', aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO. De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps. Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || || || || || || || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || |- ! Banque Numéro 3 | || || || || || || || || || || |- ! Banque Numéro 4 | || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || |} ===Le mode rafale des SDRAM=== Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale. les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre : {|class="wikitable" |+ Signification des bits du registre de mode des SDRAM |- ! Bit n°9 | Type d'accès : en rafale ou normal |- ! Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |- ! Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |- ! Bit n°3 | Type de rafale : linéaire ou entrelacée |- ! Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |} ===L'interface d'une mémoire SDRAM=== Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée ''Chip Select'' (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO. Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le '''bit CKE''' est l'abréviation de ''Clock Enable'', qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien. Le '''bit DQM''' est une sorte de bit ''Output Enable'', avec une nuance importante. Le terme DQM est l'abréviation de ''Data Mask'', ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet. Le bus d'adresse est particulier, car il tient compte de la présence de ''banques mémoires''. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une '''adresse de banque''' et une '''adresse intra-banque'''. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5. Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres. ===Les commandes SDRAM=== Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ... Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM. La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL. Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus. Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA. {| class="wikitable" style="text-align:center" ! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bus d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Stoppe un accès en rafale (en cours). |- | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lit une donnée depuis la ligne active. |- | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lit une donnée depuis la ligne active, puis ferme la ligne. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrit une donnée dans la ligne active. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |- | 0 || 0 || 1 || 1 || Adresse de la banque || colspan="2" | Adresse de la ligne || ACT : charge une ligne dans le tampon de ligne. |- | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |- | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées. Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme : [[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]] ===Les délais mémoires=== Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. Les délais mémoire le plus importants sont résumés ci-dessous : {|class="wikitable" |- !Timing!!Description |- | colspan="2" | |- ! colspan="2" | Délais primaires |- ||tRP|| Temps entre une commande PRECHARGE et une commande ACT |- ||tRCD|| Temps entre une commande ACT et une commande READ/WRITE. |- ||tCL|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |- ||tDQSS|| Temps entre une commande WRITE et l'écriture de la donnée. |- ||tCAS-to-CAS|| Temps minimum entre deux commandes READ. |- ! colspan="2" | Délais secondaires |- ||tWTR|| Temps entre une lecture et une écriture consécutives. |- ||tRAS || Temps entre une commande ACT et une commande PRECHARGE. |} Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le ''Serial Presence Detect'' de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM. Il y a cependant quelques régularités qui reviennent souvent, d'une SDRAM à l'autre. La plus importante est que les délais ne sont pas les mêmes quand on alterne des lectures et écritures. Les délais les plus courts sont observés quand on a des lectures successives, ou des écritures successives. Par contre, les délais s'allongent quand on doit passer d'une lecture à une écriture ou inversement. Les SDRAM préférent qu'on regroupe les lectures avec d'autres lectures, les écritures avec d'autres écritures. ===Les commandes anticipées=== Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de '''commandes SDRAM anticipées'''. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale. Le cache envoie alors plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours. Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Enregistrement de la commande dans le registre d'adresse/commande | bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Accès au cœur asynchrone | || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || || || |- ! Lecture/écriture du registre de données | || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Les DDR2 et 3 vont encore plus loin avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des ''timings''. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire. ==Les mémoires DDR== Les mémoires SDRAM récentes sont des mémoires de type ''dual data rate'', ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires ''dual data rate'' ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même. Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts. ===Les performances des mémoires DDR=== Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser. {|class="wikitable" |- ! Année ! Type de mémoire ! Fréquence de la mémoire (haut de gamme) ! Fréquence du bus ! Coefficient multiplicateur entre les deux fréquences |- | 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |- | 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |- | 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |- | 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |- | 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |} Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration. ===Les commandes des mémoires DDR=== Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative. Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer. Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande ''Burst Terminate'', la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des '''CAS postés'''. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des ''timings'' nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM. Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes. {| class="wikitable" style="text-align:center" |+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM ! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (4 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- style="background: #CCFFCC" | 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} ==Les VRAM des cartes vidéo== Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des '''''Graphics RAM''''' (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique. Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU/GPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Les mémoires SGRAM et GDDR=== De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que ''Graphic RAM''. Les plus connues sont les '''mémoires GDDR''', pour ''graphics double data rate'', utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port. ==Les mémoires SLDRAM, RDRAM et associées== Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large. Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de '''DRAM à commutation par paquets'''. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception. Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la ''RDRAM'' (''Rambus DRAM'') et ses deux successeurs ''XDR RAM'' et ''XDR RAM 2''. La ''Synchronous-link DRAM'' (''SLDRAM'') est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire. ===La SLDRAM (''Synchronous-link DRAM'')=== Les '''mémoires SLDRAM''' avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes. Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. A la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas. Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non. {|class="wikitable" style="text-align:center" |+SLDRAM Read, write or row op request packet ! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0 |- ! 1 | colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande |- ! 0 | colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne |- ! 0 | colspan=9 bgcolor=#ffffcc| Ligne || 0 |- ! 0 | 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne |} ===Les mémoires Rambus=== Les mémoires conçues par la société Rambus regroupent la '''RDRAM''' (''Rambus DRAM'') et ses deux successeurs '''XDR RAM''' et '''XDR RAM 2'''. Les toutes premières étaient les '''mémoires RDRAM''', où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame. Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en ''dual-channel'', pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM. ==Les eDRAM : des DRAM adaptées aux ''chiplets''== Les '''mémoires eDRAM''', pour ''embedded DRAM'', sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire. Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un ''chiplet'', , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type ''chiplet'' avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM. Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte. Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4 était appelée ''Crystal Well''. La puce ''Crystal Well'' était une puce gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés. ''Crystal Well'' était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de ''double data rate'', entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. ''Crystal Well'' consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires SRAM synchrones | prevText=Les mémoires SRAM synchrones | next=Contrôleur mémoire externe | nextText=Le contrôleur mémoire externe }}{{autocat}} </noinclude> qdj3sxor19247f8b5pa3wngpov766eh 764857 764849 2026-04-24T14:46:59Z Mewtow 31375 /* Les eDRAM : des DRAM adaptées aux chiplets */ 764857 wikitext text/x-wiki Après avoir vu les mémoires statiques (SRAM), il est temps de passer aux mémoires RAM dynamiques, aussi appelées mémoires DRAM. Pour rappel, les DRAM dynamiques ont pour défaut que leurss données s'effacent après un certain temps, en quelques millièmes ou centièmes de secondes . En conséquence, il faut réécrire chaque bit de la mémoire régulièrement pour éviter qu'il ne s'efface. On dit qu'on doit effectuer régulièrement un '''rafraîchissement mémoire'''. Et celui-ci rend les DRAM très différentes des SRAM. Les DRAM des PC ont beaucoup évolués dans le temps. Les toutes premières mémoires DRAM étaient des mémoires asynchrones, mais elles ont été remplacées par des modèles synchrones. Les modèles asynchrones ont été très nombreux. Après l'apparition des premières DRAM, les mémoires ''Fast Page Mode'' sont apparues, suivies par les mémoires ''Extended Data Out'', puis les EDO en mode rafale. Elles ont été utilisées jusque dans la moitié des années 90, pour ensuite être supplantées par les mémoires SDRAM. Les mémoires DDR actuelles sont des améliorations des mémoires SDRAM actuelles. Le fait est que les DRAM sont des mémoires électroniques comme les autres, qui se présentent sous la forme de circuits intégrés, à savoir que ce sont des petits boitiers noirs avec des broches. Il est possible de souder ces boitiers sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais il est aussi possible de regrouper plusieurs boitiers sur une barrette de RAM séparée. Dans ce qui suit, nous les appellerons des '''chips mémoire''', ou encore, des puces mémoires. [[File:Canyon CN-WF514 - EtronTech EM638325TS-6-4022.jpg|centre|vignette|upright=2|Exemple de chip mémoire.]] Dans ce qui suit, nous allons étudier ces chips de DRAM, avant de voir comment ils sont regroupés sur une barrette de RAM. Puis, nous allons voire chaque type de mémoire, FPM, EDO, SDRAM, DDR, ... ; un par un. ==L'interface des DRAM et le contrôleur mémoire== L'interface d'une mémoire DRAM est plus compliquée que l'interface d'une SRAM basique. Et c'est suffisant pour qu'on ait besoin d'un intermédiaire pour faire la conversion entre processeur et DRAM. Les DRAM modernes ne sont pas connectées directement au processeur, mais le sont par l'intermédiaire d'un '''contrôleur mémoire externe'''. Il ne faut pas le confondre avec le contrôleur mémoire interne, placé dans la mémoire RAM, et qui contient notamment le décodeur. Les deux sont totalement différents, bien que leur nom soit similaire. Pour éviter toute confusion, j'utiliserais le terme de '''contrôleur de DRAM''', plus parlant. Le contrôleur de DRAM gère le bus mémoire et tout ce qui est envoyé dessus. Il envoie des commandes aux barrettes de mémoire, commandes qui peuvent être des lectures, des écritures, ou des demandes de rafraichissement, parfois d'autres commandes. La mémoire répond à ces commandes par l'action adéquate : lire la donnée et la placer sur le bus de données pour une commande de lecture, par exemple. Le rôle du contrôleur de DRAM varie grandement suivant le contrôleur en question, ainsi que selon le type de DRAM. ===Le bus d'adresse des DRAM est multiplexé=== Un point important pour le contrôleur de DRAM est de transformer les adresses mémoires fournies par le processeur, en adresses utilisables par la DRAM. Car les DRAM ont une interface assez spécifique. Les DRAM ont ce qui s'appelle un '''bus d'adresse multiplexé'''. Avec de tels bus, l'adresse est envoyée en deux fois. Les bits de poids fort sont envoyés avant les bits de poids faible. On peut ainsi envoyer une adresse de 32 bits sur un bus d'adresse de 16 bits, par exemple. Le bus d'adresse contient alors environ moitié moins de fils que la normale. Pour rappel, l'avantage de cette méthode est qu'elle permet de limiter le nombre de fils du bus d'adresse, ce qui très intéressant sur les mémoires de grande capacité. Les mémoires DRAM étant utilisées comme mémoire principale d'un ordinateur, elles devaient avoir une grande capacité. Cependant, avoir un petit nombre de broches sur les barrettes de mémoire est clairement important, ce qui impose d'utiliser des stratagèmes. Envoyer l'adresse en deux fois répond parfaitement à ce problème : cela permet d'avoir des adresses larges et donc des mémoires de forte capacité, avec une performance acceptable et peu de fils sur le bus d'adresse. Les bus multiplexés se marient bien avec le fait que les DRAM sont des mémoires à adressage par coïncidence ou à tampon de ligne. Sur ces mémoires, l'adresse est découpée en deux : une adresse haute pour sélectionner la ligne, et une adresse basse qui sélectionne la colonne. L'adresse est envoyée en deux fois : la ligne, puis la colonne. Pour savoir si une donnée envoyée sur le bus d'adresse est une adresse de ligne ou de colonne, le bus de commande de ces mémoires contenait deux fils bien particuliers : les RAS et le CAS. Pour simplifier, le signal RAS permettait de sélectionner une ligne, et le signal CAS permettait de sélectionner une colonne. [[File:Signaux RAS et CAS.png|centre|vignette|upright=2|Signaux RAS et CAS.]] Si on a deux bits RAS et CAS, c'est parce que la mémoire prend en compte les signaux RAS et CAS quand ils passent de 1 à 0. C'est à ce moment là que la ligne ou colonne dont l'adresse est sur le bus sera sélectionnée. Tant que des signaux sont à zéro, la ligne ou colonne reste sélectionnée : on peut changer l'adresse sur le bus, cela ne désélectionnera pas la ligne ou la colonne et la valeur présente lors du front descendant est conservée. [[File:L'intérieur d'une FPM.png|centre|vignette|upright=2|L'intérieur d'une FPM.]] ===Le rafraichissement mémoire=== La spécificité des DRAM est qu'elles doivent être rafraichies régulièrement, sans quoi leurs cellules perdent leurs données. Le rafraichissement est basiquement une lecture camouflée. Elle lit les cellules mémoires, mais n'envoie pas le contenu lu sur le bus de données. Rappelons que la lecture sur une DRAM est destructive, à savoir qu'elle vide la cellule mémoire, mais que le système d'amplification de lecture régénère le contenu de la cellule automatiquement. La cellule est donc rafraichie automatiquement lors d'une lecture. La quasi-totalité des DRAM supporte des commandes de rafraichissement, séparées des lectures et écritures classiques. Une commande de rafraichissement ordonne de rafraichir une adresse, voire une ligne complète. Les commandes de rafraichissement sont générées par le contrôleur de DRAM, dans la grosse majorité des cas. Il est aussi possible que ce soit le processeur qui les génère, mais c'est beaucoup plus rare. Il est aussi possible d'envoyer des commandes de rafraichissement vides, qui ne précisent ni adresse ni numéro de ligne. Pour les gérer, la mémoire contient un compteur, qui pointe sur la prochaine ligne à rafraichir, qui est incrémenté à chaque commande de rafraichissement. Une commande de rafraichissement indique à la mémoire d'utiliser l'adresse dans ce compteur pour savoir quelle adresse/ligne rafraichir. [[File:Rafraichissement mémoire automatique.png|centre|vignette|upright=2|Rafraichissement mémoire automatique.]] Il existe des mémoires qui sont des intermédiaires entre les mémoires SRAM et DRAM. Il s'agit des '''mémoires pseudo-statiques''', qui sont techniquement des mémoires DRAM, utilisant des transistors et des condensateurs, mais qui gèrent leur rafraichissement mémoire toutes seules. Le rafraichissement mémoire est alors totalement automatique, ni le processeur, ni le contrôleur de DRAM ne devant s'en charger. Le rafraichissement est purement le fait des circuits de la mémoire RAM et devient une simple opération de maintenance interne, gérée par la RAM elle-même. L'envoi des commandes de rafraichissement peuvent se faire de deux manières : soit on les envoie toutes en même temps, soit on les disperse le plus possible. Le premier cas est un '''rafraichissement en rafale''', le second un '''rafraichissement étalé'''. Le rafraichissement en rafale n'est pas utilisé dans les PC, car il bloque la mémoire pendant un temps assez long. Mais les anciennes consoles de jeu gagnaient parfois à utiliser eu rafraichissement en rafale. En effet, la mémoire était souvent effacée entre l'affichage de deux images, pour éviter certains problèmes dont on ne parlera pas ici. Le rafraichissement de la mémoire était effectué à ce moment là : l'effacement rafraichissait la mémoire. Le temps mis pour rafraichir la mémoire est le temps mis pour parcourir toute la mémoire. Il s'agit du temps de balayage vu dans le chapitre sur les performances d'un ordinateur. Pour les mémoires FPM et EDO, il est défini en divisant la capacité de la mémoire par son débit binaire. C'est le temps nécessaire pour lire ou réécrire tout le contenu de la mémoire. Sur les SDRAM, les choses sont un peu différentes, pour une raison qu'on expliquera plus bas. ==Les rangées : l'arrangement horizontal et vertical== Il est rare d'utiliser un chip mémoire seul, car ceux-ci n'ont pas une capacité suffisante. Pour donner quelques chiffres, à l'heure où j'écris ces lignes, la norme pour un ordinateur est d'avoir entre 8 et 64 gibioctets de RAM. Mais les chips mémoire font entre 1 et 4 gibioctets, rarement plus. La raison est que les ordinateurs combinent ensemble plusieurs chips mémoire pour additionner leurs capacités. La concaténation de plusieurs chips mémoire peut se faire de deux manières différentes, appelées l'arrangement horizontal et l'arrangement vertical. Les deux additionnent la capacité des chips mémoire, mais se distinguent sur un point : ce qui arrive respectivement au bus de données, et au nombre d'adresses. Intuitivement, on se dit que doubler la capacité mémoire implique de doubler le nombre d'adresses mémoire. C'est effectivement ce qui se passe avec l'arrangement vertical. Mais avec l'arrangement horizontal, le nombre d'adresse ne varie pas. Voyons cela en détail, et commençons par le cas le plus simple, celui de l'arrangement vertical seul. ===L'arrangement vertical : cumuler des adresses mémoire=== Introduisons l'arrangement vertical par un exemple. Imaginez que je souhaite obtenir de 4 mébioctets de RAM, en combinant 4 chips mémoires de 1 mébioctet chacun. L'idée est que le premier mébioctet est placé dans le premier chip mémoire, le second mébioctet dans le second chip, etc. Des adresses consécutives se trouvent ainsi dans le même chip mémoire, sauf pour quelques adresses où on passe d'un chip à l'autre. Avec cette organisation, le bus de donnée fait un octet, et les chips mémoire ont aussi un bus de données d'un octet. Je peux alors combiner les capacités de plusieurs chips mémoire, sans toucher au bus de données. [[File:Répartition des adresses sans entrelacement.png|centre|vignette|upright=1.5|Répartition des adresses avec arrangement vertical.]] Pour sélectionner le chip mémoire adéquat, il faut que chaque chip mémoire dispose d'une entrée ''Chip Select'', qui permet de l'activer ou de le désactiver. L'idée est que selon l'adresse demandée, on active le chip mémoire associé à cette adresse. Les signaux ''Chip Select'' sont générés par le contrôleur de DRAM, à partir de l'adresse. On dit qu'il y a un '''décodage d'adresse'''. Avec cet arrangement, les bits de poids fort de l'adresse sont utilisées pour sélectionner la banque adéquate, et le reste de l'adresse est envoyé sur le bus d'adresse. Par exemple, avec 4 chips mémoire, les deux bits de poids fort de l'adresse sont utilisés pour sélectionner le chip mémoire adéquat. Les adresses mémoire sont alors découpées comme suit : {|class="wikitable" |+ Adresse mémoire |- ! Adresse de banque !! Adresse dans la banque |- | Quelques bits de poids fort || Reste de l'adresse |} ===L'arrangement horizontal : élargir le bus de données=== L'arrangement horizontal permet lui aussi d'additionner les capacités mémoire de plusieurs chips mémoire. Cependant, il les combine d'une autre manière. Le nombre d'adresses mémoire n'est pas changé en utilisant plusieurs chips, mais le bus de données est élargi. Le mieux pour comprendre l'idée est de partir d'un exemple, et nous allons prendre celui d'une mémoire SDRAM. Les ordinateurs actuels ont un bus de données de 64 bits (on met de côté le cas du double ou triple canal). Cependant, il n'existe pas de chip mémoire avec un bus aussi large. Les puces de SDRAM/DDR ont un bus de 4, 8 ou 16 bits, ce sont les tailles les plus courantes. L'arrangement horizontal résout ce problème en combinant plusieurs chips mémoire de manière à ce que leurs bus de données s'"additionnent", se concatènent. Par exemple, on peut regrouper 8 chips mémoires de 8 bits, obtenir un bus mémoire de 64 bits. Il est aussi possible d'obtenir ces 64 bits avec des puces de 16 chips mémoire de 4 bits, ou 4 chips mémoire de 16 bits. [[File:Arrangement horizontal SDRAM - un Rank.png|centre|vignette|upright=2|Arrangement horizontal SDRAM.]] Avec cette organisation, on accède à tous les bancs en parallèle à chaque accès, avec la même adresse. Vu que les chips mémoires contiennent tous une partie de la donnée demandée, ils doivent tous être activés en même temps. Pour cela, l'adresse à lire est envoyée à tous les chips mémoire d'un même ''rank'', idem pour les signaux de commande. Un ensemble de N chips reliés de cette manière forme une '''rangée''' (le terme anglais est ''rank''). [[File:Arrangement horizontal.jpg|centre|vignette|upright=2|Arrangement horizontal.]] ===L'arrangement horizontal et vertical combinés=== Nous venons de voir l'arrangement vertical et horizontal, pour ce qui est des barrettes de mémoire. Précisons que ce qui vient d'être dit marche aussi bien pour les barrettes de RAM que pour la mémoire soudée sur la carte mère. Du moment qu'on combine plusieurs chips mémoire ensemble, ces concepts restent valides. Et il en est de même pour la suite, encore que ce soit nettement moins fréquent avec de la mémoire soudée. Il est possible de combiner à la fois l'arrangement vertical et l'arrangement horizontal. Rien de plus simple : il suffit d'utiliser un arrangement vertical entre plusieurs rangées, chacun composée de plusieurs chips mémoire. C'est surtout utilisé sur les barrettes de mémoire SDRAM, qui contiennent 1, 2, 4 ou 8 rangées, rarement plus. Par exemple, une SDRAM peut combiner 16 chips de DRAM de 8 bits chacun, dans deux rangées de 64 bits chacun, chaque rangée regroupant 8 chips. [[File:SDRAM avec 4 ranks.png|centre|vignette|upright=2|SDRAM avec 4 ranks]] Le choix entre la première ou la seconde rangée se fait en configurant les bits ''Chip Select'' de chaque rangée. Il faut noter que les bits de ''Chip Select'' sont générés par le contrôleur mémoire, et envoyés sur le bus de commande. [[File:Td6bfig3.png|centre|vignette|upright=2|Comparaison entre arrangement horizontal (à gauche) et arrangement vertical (à droite).]] Le contrôleur de DRAM peut adresser un certain nombre de rangées, dispersés sur plusieurs barrettes. La limite maximale dépend du contrôleur de DRAM, elle est souvent proche de 8 ou 16 rangées. Si on combine plusieurs barrettes de mémoire, il est possible de dépasser cette limite. Par exemple, prenez un contrôleur de DRAM supportant maximum 8 rangées. Avec 4 barrettes contenant 4 rangées chacune, la limite est dépassée. : Il faut noter que tout ce qui vient d'être dit vaut aussi pour les mémoires ROM et SRAM. Mais en pratique, les arrangements verticaux et horizontaux sont surtout utilisés sur les mémoires DRAM. Il faut dire que de tels arrangements servent à augmenter la capacité mémoire, ce qui colle plus avec des DRAM que des SRAM ou des ROM. ==Les barrettes de mémoire DRAM== [[File:Ram-module.svg|droite|vignette|upright=0.5|Barrette de mémoire RAM.]] Il est possible de souder plusieurs boitiers de DRAM sur une cartre mère, et c'est ce qui est fait sur nombre d'ordinateurs portables. Mais dans les PC fixes, les puces de DRAM sont regroupées sur des ''barrettes mémoires'''. Les barrettes de mémoire se fixent à la carte mère sur un connecteur standardisé, appelé '''slot mémoire'''. Le dessin ci-contre montre une barrette de mémoire, celui-ci ci-dessous est celui d'un ''slot'' mémoire. [[File:Dual channel slots.jpg|centre|vignette|Slots mémoires.]] Sur le schéma de droite, on remarque facilement les boitiers de DRAM, rectangulaires, de couleur sombre. Chaque barrette combine ces puces de manière à additionner leurs capacités : on peut ainsi créer une mémoire de 8 gibioctets à partir de 8 puces d'un gibioctet, par exemple. Ils sont soudés sur un PCB en plastique vert sur lequel sont gravés des connexions métalliques. Les trucs dorés situés en bas des barrettes de mémoire sont des broches qui connectent la barrette au bus mémoire. Les barrettes des mémoires FPM/EDO/SDRAM/DDR n'ont pas le même nombre de broches, pour des raisons de compatibilité. {|class="wikitable" |- !Type de barrette !Type de mémoire !Nombre de broches |- | rowspan="2" | SIMM | rowspan="2" | FPM/EDO |30 |- |72 |- | rowspan="4" | DIMM |SDRAM |168 |- |DDR |184 |- |DDR2 |214, 240 ou 244, suivant la barrette ou la carte mère. |- |DDR3 |204 ou 240, suivant la barrette ou la carte mère. |} ===Le format des barrettes de mémoire=== Certaines barrettes ont des puces mémoire d'un seul côté alors que d'autres en ont sur les deux faces. Cela permet de distinguer les barrettes SIMM et DIMM. * Les '''barrettes SIMM''' ont des puces sur une seule face de la barrette. Elles étaient utilisées pour les mémoires FPM et EDO-RAM. * Les '''barrettes DIMM''' ont des puces sur les deux côtés. Elles sont utilisées sur les SDRAM et les DDR. {| class="flexible" |+ '''Barrette SIMM''' |- |[[File:SIMM FPM 4 MB - C0448721-7229.jpg|vignette|SIMM recto.]] |[[File:SIMM FPM 4 MB - C0448721-7230.jpg|vignette|SIMM verso.]] |} : Les modules DIMM tendent à avoir plus de rangées que les modules SIMM, mais ce n'est pas systématique. Il est souvent dit que les barrettes DIMM ont deux rangées, contre seulement 1 pour les SIMM, mais les contre-exemples sont nombreux. Les barrettes '''SO-DIMM''', pour ordinateurs portables, sont différentes des barrettes DIMM normales des DDR/SDRAM. La raison est qu'il n'y a pas beaucoup de place à l'intérieur d'un PC portable, ce qui demande de diminuer la taille des barrettes. {| |- |[[File:Desktop DDR Memory Comparison.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC de bureau.]] |[[File:Laptop SODIMM DDR Memory Comparison V2.svg|centre|vignette|upright=1.5|Barrettes de DDR pour PC portables.]] |} Les barrettes de Rambus ont parfois été appelées des '''barrettes RB-DIMM''', mais ce sont en réalité des DIMM comme les autres. La différence principale est que la position des broches n'était pas la même que celle des formats DIMM normaux, sans compter que le connecteur Rambus n'était pas compatible avec les connecteurs SDR/DDR normaux. ===Les interconnexions à l'intérieur d'une barrette de mémoire=== Les boîtiers de DRAM noirs sont connectés au bus par le biais de connexions métalliques. Toutes les puces d'une même rangée sont connectées aux bus d'adresse et de commande. Et les chips d'une même rangée reçoivent exactement les mêmes signaux de commande/adresses, ce qui permet d'envoyer la même adresse/commande à toutes les puces en même temps. La manière dont ces puces sont reliées au bus de commande dépend selon la mémoire utilisée. Les DDR1 et 2 utilisent ce qu'on appelle une '''topologie en T''', illustrée ci-dessous. On voit que le bus de commande forme une sorte d'arbre, dont chaque extrémité est connectée à une puce. La topologie en T permet d'égaliser le délai de transmission des commandes à travers le bus : la commande transmise arrive en même temps sur toutes les puces. Mais elle a de nombreux défauts, à savoir : elle fonctionne mal à haute fréquence, elle est difficile à router en raisons des embranchements. [[File:Organisation des bus de commandes sur les DDR1-2.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR1-2, nommée topologie en T.]] En comparaison, les DDR3 utilisent une '''topologie ''fly-by''''', où les puces sont connectées en série sur le bus de commande/adresse. La topologie ''fly-by'' n'a pas les problèmes de la topologie en T : elle est simple à router et fonctionne très bien à haute fréquence. [[File:Organisation des bus de commandes sur les DDR3 - topologie fly-by.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les DDR3 - topologie ''fly-by'']] ===Les barrettes tamponnées (à registres)=== Certaines barrettes intègrent un registre tampon, qui fait l'interface entre le bus et la barrette de RAM. L'utilité est d'améliorer la transmission du signal sur le bus mémoire. Sans ce registre, les signaux électriques doivent traverser le bus, puis traverser les connexions à l'intérieur de la barrette, jusqu'aux puces de mémoire. Avec un registre tampon, les signaux traversent le bus, sont mémorisés dans le registre et c'est tout. Le registre envoie les commandes/données jusqu'aux puces mémoire, mais le signal a été régénéré par le registre. Le signal transmis est donc de meilleure qualité, ce qui augmente la fiabilité du système mémoire. Le défaut est que la présence de ce registre fait que les barrettes ont un temps de latence est plus important que celui des barrettes normales, du fait de la latence du registre. Les barrettes de ce genre sont appelées des '''barrettes RIMM'''. Il en existe deux types : * Avec les '''barrettes RDIMM''', le registre fait l'interface pour le bus d'adresse et le bus de commande, mais pas pour le bus de données. * Avec les '''barrettes LRDIMM''' (''Load Reduced DIMMs''), le registre fait tampon pour tous les bus, y compris le bus de données. [[File:Organisation des bus de commandes sur les RDIMM.png|centre|vignette|upright=3.0|Organisation des bus de commandes sur les RDIMM.]] ===Le ''Serial Presence Detect''=== [[File:SPD SDRAM.jpg|vignette|Localisation du SPD sur une barrette de SDRAM.]] Toute barrette de mémoire assez récente contient une petite mémoire ROM qui stocke les différentes informations sur la mémoire : délais mémoire, capacité, marque, etc. Cette mémoire s'appelle le '''''Serial Presence Detect''''', aussi communément appelé le SPD. Ce SPD contient non seulement les timings de la mémoire RAM, mais aussi diverses informations, comme le numéro de série de la barrette, sa marque, et diverses informations. Le SPD est lu au démarrage de l'ordinateur par le BIOS, afin de pourvoir configurer ce qu'il faut. Le contenu de ce fameux SPD est standardisé par un organisme nommé le JEDEC, qui s'est chargé de standardiser le contenu de cette mémoire, ainsi que les fréquences, timings, tensions et autres paramètres des mémoires SDRAM et DDR. Pour les curieux, vous pouvez lire la page wikipédia sur le SPD, qui donne son contenu pour les mémoires SDR et DDR : [https://en.wikipedia.org/wiki/Serial_presence_detect Serial Presence Detect]. ==Les mémoires asynchrones à RAS/CAS : FPM et EDO-RAM== Avant l'invention des mémoires SDRAM et DDR, il exista un grand nombre de mémoires différentes, les plus connues étant les mémoires fast page mode et EDO-RAM. Ces mémoires n'étaient pas synchronisées par un signal d'horloge, c'était des '''mémoires asynchrones'''. Quand ces mémoires ont été créées, cela ne posait aucun problème : les accès mémoire étaient très rapides et le processeur était certain que la mémoire aurait déjà fini sa lecture ou écriture au cycle suivant. Les mémoires asynchrones les plus connues étaient les '''mémoires FPM''' et '''mémoires EDO'''. Pour ce qui est de leur interface, il faut signaler qu'elles n'ont pas d'entrée ''Chip Select'' ou d'entrée ''Output Enable''. Les signaux RAS et CAS remplacent en quelque sorte ces deux signaux. Le bit RAS fait office de ''Chip Select'', le bit CAS fait office d'''Output Enable''. ===Les mémoires FPM=== Les '''mémoires FPM (''Fast Page Mode'')''' possédaient une petite amélioration, qui rendait l'adressage plus simple. Avec elles, il n'y a pas besoin de préciser deux fois la ligne si celle-ci ne changeait pas lors de deux accès consécutifs : on pouvait garder la ligne sélectionnée durant plusieurs accès. Par contre, il faut quand même préciser les adresses de colonnes à chaque changement d'adresse. Il existe une petite différence entre les mémoire ''Page Mode'' et les mémoires ''Fast-Page Mode'' proprement dit. Sur les premières, le signal CAS est censé passer à 0 avant qu'on fournisse l'adresse de colonne. Avec les ''Fast-Page Mode'', l'adresse de colonne pouvait être fournie avant que l'on configure le signal CAS. Cela faisait gagner un petit peu de temps, en réduisant quelque peu le temps d'accès total. [[File:Sélection d'une ligne sur une mémoire FPM ou EDO.png|centre|vignette|upright=2|Sélection d'une ligne sur une mémoire FPM ou EDO.]] Avec les '''mémoires en mode quartet''', il est possible de lire quatre octets consécutifs sans avoir à préciser la ligne ou la colonne à chaque accès. On envoie l'adresse de ligne et l'adresse de colonne pour le premier accès, mais les accès suivants sont fait automatiquement. La seule contrainte est que l'on doit générer un front descendant sur le signal CAS pour passer à l'adresse suivante. Vous aurez noté la ressemblance avec le mode rafale vu il y a quelques chapitres, mais il y a une différence notable : le mode rafale vrai n'aurait pas besoin qu'on précise quand passer à l'adresse suivante avec le signal CAS. [[File:Mode quartet.png|centre|vignette|upright=3|Mode quartet.]] Les '''mémoires FPM à colonne statique''' se passent même du signal CAS. Le changement de l'adresse de colonne est détecté automatiquement par la mémoire et suffit pour passer à la colonne suivante. Dans ces conditions, un délai supplémentaire a fait son apparition : le temps minimum entre deux sélections de deux colonnes différentes, appelé tCAS-to-CAS. [[File:Accès en colonne statique.jpg|centre|vignette|upright=2.5|Accès en colonne statique.]] ===Les mémoires EDO-RAM=== L''''EDO-RAM''' a été inventée quelques années après la mémoire FPM. Elle a été déclinée en deux versions : la EDO simple, et la EDO en rafale. L'EDO simple ajoutait une entrée ''Ouput Enable'' à une mémoire FPM. Pour rappel, l'entrée ''Ouput Enable'' permet de connecter/déconnecter la DRAM du bus de données. S'il est mis à 0, les lectures et écritures sont empêchées. Pour ajouter cette entrée, il a fallu rajouter un registre sur la sortie de donnée, celle qui sert pour les lectures. Et l'ajout de ce registre a introduit une capacité dite de ''pipelining'', sur le même modèle que pour les mémoires SRAM synchrones. La donnée pouvait être maintenue sur le bus de données durant un certain temps, même après la remontée du signal CAS. Le registre de sortie maintenait la donnée lu tant que le signal RAS restait à 0, et tant qu'un nouveau signal CAS n'a pas été envoyé. Faire remonter le signal CAS à 1 n'invalidait pas la donnée en sortie. La conséquence est qu'on pouvait démarrer une nouvelle lecture alors que la donnée de l'accès précédent était encore présent sur le bus de données. Le pipeline obtenu avait deux étages : un où on présentait l'adresse et sélectionnait la colonne, un autre où la donnée était lue depuis le registre de sortie. Les mémoires EDO étaient donc plus rapides. [[File:EDO RAM.png|centre|vignette|upright=3|EDO RAM]] Cependant, cela marchait surtout pour les lectures, pas pour les écritures. Une écriture ne démarre que quand la lecture ou écriture précédente est totalement terminée. De même, on ne peut pas démarrer un nouvel accès mémoire tant qu'une écriture est en cours. ===Les mémoires EDO-RAM avec mode rafale=== Les '''EDO en rafale''' effectuent les accès à 4 octets consécutifs automatiquement : il suffit d'adresser le premier octet à lire. Les 4 octets étaient envoyés sur le bus les uns après les autres, au rythme d'un par cycle d’horloge : ce genre d'accès mémoire s'appelle un accès en rafale. [[File:Accès en rafale.png|centre|vignette|upright=2|Accès en rafale sur une DRAM EDO.]] Implémenter cette technique nécessite d'ajouter un compteur, capable de faire passer d'une colonne à une autre quand on lui demande, et quelques circuits annexes pour commander le tout. [[File:Modifications du contrôleur mémoire liées aux accès en rafale.png|centre|vignette|upright=2|Modifications du contrôleur de DRAM liées aux accès en rafale.]] ===Le rafraichissement mémoire=== Les mémoires FPM et EDO doivent être rafraichies régulièrement. Au début, le rafraichissement se faisait ligne par ligne. Le rafraichissement avait lieu quand le RAS passait à l'état haut, alors que le CAS restait à l'état bas. Le processeur, ou le contrôleur mémoire, sélectionnait la ligne à rafraichir en fournissant son adresse mémoire. D'où le nom de '''rafraichissement par adresse''' qui est donné à cette méthode de commande du rafraichissement mémoire. Divers processeurs implémentaient de quoi faciliter le rafraichissement par adresse. Par exemple, le Zilog Z80 contenait un compteur de ligne, un registre qui contenait le numéro de la prochaine ligne à rafraichir. Il était incrémenté à chaque rafraichissement mémoire, automatiquement, par le processeur lui-même. Un ''timer'' interne permettait de savoir quand rafraichir la mémoire : quand ce ''timer'' atteignait 0, une commande de rafraichissement était envoyée à la mémoire, et le ''timer'' était ''reset''. [[File:Rafraichissement mémoire manuel.png|centre|vignette|upright=2|Rafraichissement mémoire manuel.]] Par la suite, certaines mémoires ont implémenté un compteur interne d'adresse, pour déterminer la prochaine adresse à rafraichir sans la préciser sur le bus d'adresse. Le déclenchement du rafraichissement se faisait toujours par une commande externe, provenant du contrôleur de DRAM ou du processeur. Cette commande faisait passer le CAS à 0 avant le RAS. Cette méthode de rafraichissement se nomme '''rafraichissement interne'''. [[File:Rafraichissement sur CAS précoce.png|centre|vignette|upright=2|Rafraichissement sur CAS précoce.]] On peut noter qu'il est possible de déclencher plusieurs rafraichissements à la suite en laissant le signal CAS dans le même état. Ce genre de choses pouvait avoir lieu après une lecture : on pouvait profiter du fait que le CAS soit mis à zéro par la lecture ou l'écriture pour ensuite effectuer des rafraichissements en touchant au signal RAS. Dans cette situation, la donnée lue était maintenue sur la sortie durant les différents rafraichissements. [[File:Rafraichissements multiples sur CAS précoce.png|centre|vignette|upright=2|Rafraichissements multiples sur CAS précoce.]] ==Les mémoires SDRAM== Dans les années 90, les mémoires asynchrones ont laissé la place aux '''mémoires SDRAM''', qui sont synchronisées avec le bus par une horloge. L'utilisation d'une horloge a comme avantage des temps d'accès fixes : le processeur sait qu'un accès mémoire prendra un nombre déterminé de cycles d'horloge. Avec les mémoires asynchrones, le processeur ne pouvait pas prévoir quand la donnée serait disponible et ne faisait rien tant que la mémoire n'avait pas répondu : il exécutait ce qu'on appelle des ''wait states'' en attendant que la mémoire ait fini. Les mémoires SDRAM sont standardisées par un organisme international, le JEDEC. Le standard SDRAM impose des spécifications électriques bien précise pour les barrettes de mémoire et le bus mémoire, décrit le protocole utilisé pour communiquer avec les barrettes de mémoire, et bien d'autres choses encore. Les SDRAM ont été déclinées en versions de performances différentes, décrites dans le tableau ci-dessous : {| class="wikitable" ! Nom standard ! Fréquence ! Bande passante |- | PC66 | 66 mhz | 528 Mio/s |- | PC66 | 100 mhz | 800 Mio/s |- | PC66 | 133 mhz | 1064 Mio/s |- | PC66 | 150 mhz | 1200 Mio/s |} ===Les banques internes aux chips mémoires SDRAM=== L'intérieur d'une mémoire SDRAM contient plusieurs '''banques''', aussi appelées des banc mémoire. Concrètement, une banque est... une mémoire. Ou plutôt, une sorte de mini-mémoire miniature. Chaque banque a son propre tampon de ligne, ses propres multiplexeurs de colonne et ses propres décodeurs. C'est comme si une SDRAM regroupait plusieurs mémoires séparées dans un même circuit intégré. [[File:Arrangement vertical.jpg|centre|vignette|upright=2.5|Mémoire multi-banques.]] Un point important est que chaque banque a son propre tampon de ligne. Il est donc possible d'ouvrir plusieurs lignes en même temps, chacune dans une banque différente. Par exemple, on peut ouvrir une ligne dans la banque numéro 1, et une autre ligne dans la banque numéro 2. Et c'est une source d'optimisations très intéressantes. La première optimisation est liée au rafraichissement mémoire. Au lieu de rafraichir chaque adresse une par une, il est possible de rafraichir des banques indépendantes en même temps, ce qui divise le temps de rafraichissement par le nombre de banques. C'est ce que je sous-entendais plus haut quand je disais que le temps de rafraichissement n'est pas égal au temps de balayage sur les SDRAM, alors que c'est le cas sur les DRAM FPM et EDO. De plus, et sans rentrer dans les détails, cela permet de faire plusieurs accès mémoire en même temps, dans des banques différentes. La possibilité est limitée, mais elle existe et elle améliore grandement la performance de la SDRAM. Mais nous en reparlerons dans un chapitre ultérieur, car cette histoire d'accès simultanés a plus sa place dans le chapitre sur le parallélisme mémoire. Pour le moment, nous ne pouvons pas expliquer pourquoi ni comment un processeur pourrait émettre plusieurs accès mémoire simultanés. Un processeur est censé travailler une instruction à la fois, à ce stade du cours, il ne peut pas en faire plusieurs en même temps. Mais nous allons cependant mentionner un cas où cette possibilité est intéressante : une mémoire SDRAM partagée entre un processeur et une carte graphique. Les deux accèdent à des données séparées, qui sont dans des banques différentes. On suppose que la carte graphique accède plus fréquemment à la mémoire que le processeur. Le contrôleur mémoire reçoit les accès mémoire du CPU et du GPU et il tente d'intercaler des accès CPU entre deux accès de la carte graphique. Vu qu'ils tombent dans des banques différentes, un accès CPU et un accès carte graphique peuvent se faire presque en même temps. La seule contrainte est que si on lance plusieurs accès mémoire simultanés, ceux-ci ne peuvent pas utiliser le bus de données en même temps. {|class="wikitable" |+ Pipelining basique sur les SDRAM |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 |- ! Banque Numéro 1 | || || || || || || || || || || |- ! Banque Numéro 2 | || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || || colspan="3" bgcolor="#A0FFFF" | Accès CPU || || |- ! Banque Numéro 3 | || || || || || || || || || || |- ! Banque Numéro 4 | || || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || || colspan="3" bgcolor="#FFA0FF" | Accès carte graphique || |} ===Le mode rafale des SDRAM=== Un point important est que les SDRAM reprennent les optimisations des mémoires FPM et EDO. Elles utilisent aussi un tampon de ligne, avec la possibilité de lire plusieurs colonnes à la suite sans avoir à préciser l'adresse de ligne à chaque fois. Mais surtout, elles gèrent nativement le mode rafale. les paramètres qui ont trait au mode rafale sont configurables. Il est possible de configurer la SDRAM pour activer les accès sans rafale, ou les désactiver. Il y a aussi la possibilité de configurer le nombre d'octets consécutifs à lire ou écrire en mode rafale. On peut ainsi accéder à 1, 2, 4, ou 8 octets en une seule fois, alors que les EDO ne permettaient que des accès à 4 octets consécutifs. Enfin, on peut décider s'il faut faire un accès en mode linéaire ou entrelacé. La configuration de la SDRAM est mémorisée dans un registre de 10 bits, le '''registre de mode'''. Il faisait 10 bits sur les mémoires SDRAM, mais a été étendu à 13 bits sur la DDR2. Voici les 10 bits originels de ce registre : {|class="wikitable" |+ Signification des bits du registre de mode des SDRAM |- ! Bit n°9 | Type d'accès : en rafale ou normal |- ! Bit n°8 et 7 | Doivent valoir 00, sont réservés pour une utilisation ultérieur dans de futurs standards. |- ! Bit n°6, 5, et 4 | Latence CAS (voir plus bas) |- ! Bit n°3 | Type de rafale : linéaire ou entrelacée |- ! Bit n°2, 3, et 0 | Longueur de la rafale : indique le nombre d'octets à lire/écrire lors d'une rafale. |} ===L'interface d'une mémoire SDRAM=== Le bus de commandes d'une SDRAM contient au moins 18 fils, dont celui pour le signal d'horloge. L'interface d'une SDRAM contient tous les bits présents sur une mémoire DRAM classique : une entrée RAS, une entrée CAS, une entrée R/W, et un bus d'adresse. A cela, il faut cependant ajouter une entrée ''Chip Select'' (CS), qui permet d'activer/désactiver la mémoire SDRAM. Je rappelle que le bit CS a été introduit sur les mémoires SDRAM, il n'était pas présent sur les mémoires FPM/EDO. Deux autres bits de commande sont vraiment spécifiques des mémoires SDRAM. Il s'agit des bits CKE et DQM. Le '''bit CKE''' est l'abréviation de ''Clock Enable'', qui qui trahit sa fonction. Lorsque ce signal est à 0, le chip de SDRAM voit son signal d'horloge gelè. S'il est à 0, le contrôleur de DRAM peut envoyer ce qu'il veut sur le bus de commande ou d'adresse, la SDRAM ne réagira pas du tout, il ne se passera rien. Le '''bit DQM''' est une sorte de bit ''Output Enable'', avec une nuance importante. Le terme DQM est l'abréviation de ''Data Mask'', ce qui trahit encore une fois sa fonction. Il y a un bit DQM pour chaque octet du bus de données. Une SDRAM ayant un bus de 64 bits, cela fait 8 bits DQM par mémoire SDRAM. Lorsque le bit DQM est à 1, l'octet en question n'est simplement pas lu ou écrit, le bus de donnée est déconnecté pour cet octet. Le bus d'adresse est particulier, car il tient compte de la présence de ''banques mémoires''. Le bus d'adresse est découpé en deux portions : une portion pour sélectionner la banque, une autre pour sélectionner l'adresse à l'intérieur d'une banque. L'interface de la SDRAM fait ainsi la différence entre une '''adresse de banque''' et une '''adresse intra-banque'''. L'adresse de banque est codée sur quelques bits, généralement deux ou trois suivant la SDRAM. Le reste de l'adresse est codé sur 11 bits sur les SDRAM, mais cela a augmenté avec les DDR 1, 2, 3, 4, 5. Le bus de données d'une SDRAM fait 4, 8, ou 16 bits. Je précise bien qu'il s'agit là des puces de SDRAM, les barrettes de SDRAM combinent plusieurs puces SDRAM avec un arrangement horizontal, qui peut combiner plusieurs puces de 8 bits pour alimenter un bus de données de 64 bits. La taille des puces utilisées souvent indiquée sur la barrette de RAM, avec une mention x4, x8 ou x16. Les puces de SDRAM les plus courantes ont une interface de 8 bits pour les données. Les SDRAM de 4 bits sont surtout utilisées pour les serveurs, c'est lié au support de l'ECC. les puces x16 sont moins utilisées car elles ont généralement moins de banques que les autres. ===Les commandes SDRAM=== Le bus de commande permet d'envoyer des commandes à la mémoire, chaque commande étant précisée par une combinaison précise des bits CS, RAS, CAS, R/W, et autres. Les commandes en question sont des demandes de lecture, d'écriture, de préchargement et autres. Elles sont codées par une valeur bien précise qui est envoyée sur les 18 fils du bus de commande. Ces commandes sont nommées READ, READA, WRITE, WRITEA, PRECHARGE, ACT, ... Les plus importantes sont les commandes PRECHARGE, ACT et READ/WRITE. La commande ACT sélectionne une ligne : elle met le bit RAS à zéro et présente une adresse de ligne. Les commandes READ et WRITE sélectionnent une colonne, et déclenchent respectivement une lecture ou une écriture. Elles précisent une adresse de colonne, mettent le bit CAS à 0 et le bit RAS à 1, et précise la valeur du bit R/W. Les commandes READ et WRITE ne peuvent se faire qu'une fois que la banque a été activée par une commande ACT. Il est possible d'envoyer plusieurs commandes READ ou WRITE successives à des colonnes différentes, ce qui permet d'implémenter les optimisations des mémoires FPM. La commande PRECHARGE ferme la ligne courante et prépare l'ouverture de la suivante. Elle précharge les lignes de bit de la RAM, d'où son nom. Il est nécessaire d'en envoyer une avant d'envoyer une commande ACT. Notons que la commande PRECHARGE agit sur une banque, dont l'adresse est indiquée dans la commande PRECHARGE. Il existe une commande PRECHARGE ALL, qui agit sur toutes les banques de la SDRAM à la fois. Elle est souvent utilisée de concert avec la commande de rafraichissement, car le rafraichissement mémoire rafraichit une ligne dans toutes les banques à la fois. Il faut donc fermer toutes les lignes ouvertes, dans chaque banque, ce que fait la commande PRECHARGE ALL. Les commandes READA et WRITEA fusionnent une commande READ/WRITE avec une commande PRECHARGE. Elles permettent d'éviter d'avoir à envoyer une commande PRECHARGE pour fermer la ligne courante. Au lieu d'envoyer une commande READ ou WRITE, puis une commande PRECHARGE pour fermer la ligne, on envoie une seule commande READA/WRITEA. Il s'agit d'une petite optimisation, qui permet de réduire le nombre de commandes envoyées sur le bus. Les commandes sont encodées comme indiquées dans ce tableau. Une commande est tout simplement encodée en précisant une adresse si nécessaire, et une combinaison des bits CS, RAS, CAS et R/W. La seule subtilité est que le bit numéro 10 du bus d'adresse sert à commander les opérations de PRECHARGE, y compris celles implicites dans les opérations READA et WRITEA. {| class="wikitable" style="text-align:center" ! Bit CS || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (2 bits) || Bit du bus d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Stoppe un accès en rafale (en cours). |- | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lit une donnée depuis la ligne active. |- | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lit une donnée depuis la ligne active, puis ferme la ligne. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrit une donnée dans la ligne active. |- | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrit une donnée dans la ligne active, puis ferme la ligne. |- | 0 || 0 || 1 || 1 || Adresse de la banque || colspan="2" | Adresse de la ligne || ACT : charge une ligne dans le tampon de ligne. |- | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne dans toutes les banques. |- | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || 0 || 0 || 0 || 00 || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} Les commandes ACT se font à partir de l'état de repos, l'état où toutes les banques sont préchargées. Par contre, les commandes MODE REGISTER SET et AUTO REFRESH ne peuvent se faire que si toutes les banques sont désactivées. Le fonctionnement simplifié d'une SDRAM peut se résumer dans ce diagramme : [[File:Fonctionnement simplifié d'une SDRAM.jpg|centre|vignette|upright=2|Fonctionnement simplifié d'une SDRAM.]] ===Les délais mémoires=== Les mémoires SDRAM n'étant pas infiniment rapides, il y a toujours un certain délais à respecter entre deux commandes. Par exemple, quand on envoie une commande ACT pour activer une ligne, on ne peut pas envoyer une commande READ/WRITE au cycle suivant. La plupart des SDRAM ne sont pas assez rapides pour ça. Il faut respecter un délai de quelques cycles, qui dépend de la mémoire. Et il n'y a pas que ce délai entre une commande ACT et la commande suivante. Une SDRAM doit gérer d'autres temps d'attente, appelés des '''délais mémoires''', ou encore des ''timings'' mémoire. Les délais mémoire le plus importants sont résumés ci-dessous : {|class="wikitable" |- !Timing!!Description |- | colspan="2" | |- ! colspan="2" | Délais primaires |- ||tRP|| Temps entre une commande PRECHARGE et une commande ACT |- ||tRCD|| Temps entre une commande ACT et une commande READ/WRITE. |- ||tCL|| Temps entre une commande READ et l'envoi de la donnée lue sur le bus de données. |- ||tDQSS|| Temps entre une commande WRITE et l'écriture de la donnée. |- ||tCAS-to-CAS|| Temps minimum entre deux commandes READ. |- ! colspan="2" | Délais secondaires |- ||tWTR|| Temps entre une lecture et une écriture consécutives. |- ||tRAS || Temps entre une commande ACT et une commande PRECHARGE. |} Les délais/timings mémoire ne sont pas les mêmes suivant la barrette de mémoire que vous achetez. Certaines mémoires sont ainsi conçues pour avoir des timings assez bas et sont donc plus rapides, et surtout : beaucoup plus chères que les autres. Le gain en performances dépend beaucoup du processeur utilisé et est assez minime comparé au prix de ces barrettes. Les délais mémoires d'une barrette sont mémorisés dans le ''Serial Presence Detect'' de la barrette et sont lus par le BIOS au démarrage de l'ordinateur, et sont ensuite utilisés pour configurer le contrôleur de DRAM. Il y a cependant quelques régularités qui reviennent souvent, d'une SDRAM à l'autre. La plus importante est que les délais ne sont pas les mêmes quand on alterne des lectures et écritures. Les délais les plus courts sont observés quand on a des lectures successives, ou des écritures successives. Par contre, les délais s'allongent quand on doit passer d'une lecture à une écriture ou inversement. Les SDRAM préférent qu'on regroupe les lectures avec d'autres lectures, les écritures avec d'autres écritures. ===Les commandes anticipées=== Les SDRAM sont parfois capables de démarrer une commande avant que la précédente soit terminée. Concrètement, pendant que la commande précédente envoie sa dernière donnée sur le bus de données, on peut envoyer la commande suivante avec quelques cycles d'avance. L'exemple ci-dessous devrait être assez clair : on envoie une seconde commande au neuvième cycle, alors qu'une rafale est en cours. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Bus de commande/adresse | || bgcolor="#A0FFFF" | ACT || || bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Bus de données | || || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Il s'agit d'une forme très limitée de pipeline, tellement limitée qu'on peut légitimement douter que c'est un vrai pipeline. Dans ce qui suit, j'ai décidé d'appeler cette possibilité sous le terme de '''commandes SDRAM anticipées'''. La possibilité est très limitée, car il faut tenir compte des délais mémoire. Elle améliore un peu les performances dans certaines circonstances où la RAM doit traiter plusieurs accès mémoire consécutifs, très rapprochés. L'exemple typique est celui du transfert d'un bloc de données entre mémoire cache et mémoire RAM, qui dépasse la taille d'une rafale. Le cache envoie alors plusieurs accès mémoire d'un seul coup au contrôleur mémoire. Mais d'autres exemples sont possibles, on ne peut juste pas les expliquer à ce stade du cours. Les commandes SDRAM anticipées sont possibles car les SDRAM sont formées en entourant une RAM asynchrone de registres, exactement comme les SRAM synchrones. Il est possible d'écrire dans les registres de données/commandes, pendant qu'un autre accès mémoire accède au cœur asynchrone. Les délais mémoire sont conçus pour éviter qu'une commande accède au cœur asynchrone en même temps que la suivante ou la précédente, idem pour l'usage des registres. C'est pour cela que les délais mémoire sont assez différents entre écritures et lectures, d'ailleurs. {|class="wikitable" |- ! !! Cycle 1 !! Cycle 2 !! Cycle 3 !! Cycle 4 !! Cycle 5 !! Cycle 6 !! Cycle 7 !! Cycle 8 !! Cycle 9 !! Cycle 10 !! Cycle 11 !! Cycle 12 !! Cycle 13 |- ! Enregistrement de la commande dans le registre d'adresse/commande | bgcolor="#A0FFFF" | READ (1) || || || || bgcolor="#FFA0FF" | READ (2) || || || || || |- ! Accès au cœur asynchrone | || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || bgcolor="#A0FFFF" | READ (1) || || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || bgcolor="#FFA0FF" | READ (2) || || || |- ! Lecture/écriture du registre de données | || || || || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 || bgcolor="#A0FFFF" | READ 1 | bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 || bgcolor="#FFA0FF" | READ 2 | |} Les DDR2 et 3 vont encore plus loin avec l'optimisation des '''CAS postés'''. L'idée est que le contrôleur mémoire peut envoyer une commande READ/WRITE sans se soucier des ''timings''. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur mémoire peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur mémoire. ==Les mémoires DDR== Les mémoires SDRAM récentes sont des mémoires de type ''dual data rate'', ce qui fait qu'elles portent le nom de mémoires DDR. Pour rappel, les mémoires ''dual data rate'' ont un plan mémoire deux fois plus large que le bus mémoire, avec un bus mémoire allant à une fréquence double. Par double, on veut dire que les transferts sur le bus mémoire ont lieu sur les fronts montants et descendants de l'horloge. Il y a donc deux transferts de données sur le bus pour chaque cycle d'horloge, ce qui permet de doubler le débit sans toucher à la fréquence du plan mémoire lui-même. Les mémoires DDR sont standardisées par un organisme international, le JEDEC, et ont été déclinées en plusieurs générations : DDR1, DDR2, DDR3, et DDR4. La différence entre ces modèles sont très nombreuses, mais les plus évidentes sont la fréquence de la mémoire et du bus mémoire. D'autres différences mineures existent entre les SDRAM et les mémoires DDR. Par exemple, la tension d'alimentation des mémoires DDR est plus faible que pour les SDRAM. ET elle a diminué dans le temps, d'une génération de DDR à l'autre. Avec les mémoires DDR2,la tension d'alimentation est passée de 2,5/2,6 Volts à 1,8 Volts. Avec les mémoires DDR3, la tension d'alimentation est notamment passée à 1,5 Volts. ===Les performances des mémoires DDR=== Les mémoires SDRAM ont évolué dans le temps, mais leur temps d'accès/fréquence n'a pas beaucoup changé. Il valait environ 10 nanosecondes pour les SDRAM, approximativement 5 ns pour la DDR-400, il a peu évolué pendant la génération DDR et DDR3, avant d'augmenter pendant les générations DDR4 et de stagner à nouveau pour la génération DDR5. L'usage du DDR, puis du QDR, visait à augmenter les performances malgré la stagnation des temps d'accès. En conséquence, la fréquence du bus a augmenté plus vite que celle des puces mémoire pour compenser. {|class="wikitable" |- ! Année ! Type de mémoire ! Fréquence de la mémoire (haut de gamme) ! Fréquence du bus ! Coefficient multiplicateur entre les deux fréquences |- | 1998 | DDR 1 | 100 - 200 MHz | 200 - 400 MHz | 2 |- | 2003 | DDR 2 | 100 - 266 MHz | 400 - 1066 MHz | 4 |- | 2007 | DDR 3 | 100 - 266 MHz | 800 - 2133 MHz | 8 |- | 2014 | DDR 4 | 200 - 400 MHz | 1600 - 3200 MHz | 8 |- | 2020 | DDR 5 | 200 - 450 MHz | 3200 - 7200 MHz | 8 à 16 |} Une conséquence est que la latence CAS, exprimée en nombre de cycles, a augmenté avec le temps. Si vous comparez des mémoires DDR2 avec une DDR4, par exemple, vous allez voir que la latence CAS est plus élevée pour la DDR4. Mais c'est parce que la latence est exprimée en nombre de cycles d'horloge, et que la fréquence a augmentée. En comparant les temps d'accès exprimés en secondes, on voit une amélioration. ===Les commandes des mémoires DDR=== Les commandes des mémoires DDR sont globalement les mêmes que celles des mémoires SDRAM, vues plus haut. Les modifications entre SDRAM, DDR1, DDR2, DDR3, DDR4, et DDR5 sont assez mineures. Les seules différences sont l'addition de bits pour la transmission des adresses, des bits en plus pour la sélection des banques, etc. En clair, une simple augmentation quantitative. Le registre de mode a été un peu modifié. Il est passé de 10 bits pour les SDRAM et DDR1, à 13 bits sur la DDR 2 et les suivantes. Les DDR ont aussi ajouté le support de plusieurs registres de mode, qui sont sélectionnés en réutilisant l'adresse de banque. Dans une commande LOAD MODE REGISTER, l'adresse de banque indique quel registre de mode il faut altérer. Avant la DDR4, les modifications des commandes sont mineures. La DDR2 supprime la commande ''Burst Terminate'', la DDR3 et la DDR4 utilisent le bit A12 pour préciser s'il faut faire une rafale complète, ou une rafale de moitié moins de données. Une optimisation des DDR2 et 3 est celle des '''CAS postés'''. L'idée est que le contrôleur de DRAM peut envoyer une commande ACT et une commande READ/WRITE sans se soucier des ''timings'' nécessaires entre les deux. En théorie, les deux commandes doivent être séparées par quelques cycles, sur une SDRAM ou une DDR1. Mais avec la DDR2, le contrôleur de DRAM peut envoyer les deux l'une après l'autre, au cycle suivant. C'est la mémoire qui mettra en attente la commande READ/WRITE pour respecter les ''timings'' mémoire. Cela complexifie le fonctionnement interne de la DDR, mais simplifie grandement le travail du contrôleur de DRAM. Mais avec la DDR4, les choses changent, notamment au niveau de la commande ACT. Avec l'augmentation de la capacité des barrettes mémoires, la taille des adresses est devenue trop importante. Pour éviter de rajouter des bits d'adresses, les concepteurs du standard DDR4 ont décidé de ruser. Lors d'une commande ACT, les bits RAS, CAS et WE sont utilisés comme bits d'adresse, alors qu'ils ont leur signification normale pour les autres commandes. Pour éviter toute confusion, un nouveau bit ACT est ajouté pour indiquer la présence d'une commande ACT : il est à 1 pour une commande ACT, 0 pour les autres commandes. {| class="wikitable" style="text-align:center" |+ Commandes d'une mémoire DDR4, seule la commande colorée change par rapport aux SDRAM ! Bit CS || style="background: #CCFFCC" | Bit ACT || Bit RAS || Bit CAS || Bit WE || Bits de sélection de banque (4 bits) || Bit du bas d'adresse A10 || Reste du bus d'adresse || Nom de la commande : Description |- | 1 | colspan="6" | X | Absence de commandes. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 1 || colspan="3" | X || No Operation : Pas d'opération |- | 0 || style="background: #CCFFCC" | 0 || 1 || 1 || 0 || colspan="3" | X || Burst Terminante : Arrêt d'un accès en rafale en cours. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 0 || Adresse de la colonne || READ : lire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 1 || Adresse de la banque || 1 || Adresse de la colonne || READA : lire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 0 || Adresse de la colonne || WRITE : écrire une donnée depuis la ligne active. |- | 0 || style="background: #CCFFCC" | 0 || 1 || 0 || 0 || Adresse de la banque || 1 || Adresse de la colonne || WRITEA : écrire une donnée depuis la ligne active, avec rafraichissement automatique de la ligne. |- style="background: #CCFFCC" | 0 || style="background: #CCFFCC" | 1 || colspan="3" | Adresse de la ligne (bits de poids forts) || Adresse de la banque || colspan="2" | Adresse de la ligne (bits de poids faible) || ACT : charge une ligne dans le tampon de ligne. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la banque || 0 || X || PRECHARGE : précharge le tampon de ligne dans la banque voulue. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 1 || 0 || Adresse de la X || 1 || X || PRECHARGE ALL : précharge le tampon de ligne' dans toutes les banques. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 1 || colspan="3" | X || Auto refresh : Demande de rafraichissement, gérée par la SDRAM. |- | 0 || style="background: #CCFFCC" | 0 || 0 || 0 || 0 || Numéro de registre de mode || colspan="2" | Nouveau contenu du registre de mode || LOAD MODE REGISTER : configure le registre de mode. |} ==Les VRAM des cartes vidéo== Les cartes graphiques ont des besoins légèrement différents des DRAM des processeurs, ce qui fait qu'il existe des mémoires DRAM qui leur sont dédiées. Elles sont appelés des '''''Graphics RAM''''' (GRAM). La plupart incorporent des fonctionnalités utiles uniquement pour les mémoires vidéos, comme des fonctionnalités de masquage (appliquer un masque aux données lue ou à écrire), ou le remplissage d'un bloc de mémoire avec une donnée unique. Les anciennes cartes graphiques et les anciennes consoles utilisaient de la DRAM normale, faute de mieux. La première GRAM utilisée était la NEC μPD481850, qui a été utilisée sur la console de jeu PlayStation, à partir de son modèle SCPH-5000. D'autres modèles de GRAM ont rapidement suivi. Les anciennes consoles de jeu, mais aussi des cartes graphiquesn utilisaient des GRAM spécifiques. ===Les mémoires vidéo double port=== Sur les premières consoles de jeu et les premières cartes graphiques, le ''framebuffer'' était mémorisé dans une mémoire vidéo spécialisée appelée une '''mémoire vidéo double port'''. Le premier port était connecté au processeur ou à la carte graphique, alors que le second port était connecté à un écran CRT. Aussi, nous appellerons ces deux port le ''port CPU/GPU'' et l'autre sera appelé le ''port CRT''. Le premier port était utilisé pour enregistrer l'image à calculer et faire les calculs, alors que le second port était utilisé pour envoyer à l'écran l'image à afficher. Le port CPU/GPU est tout ce qu'il y a de plus normal : on peut lire ou écrire des données, en précisant l'adresse mémoire de la donnée, rien de compliqué. Le port CRT est assez original : il permet d'envoyer un paquet de données bit par bit. De telles mémoires étaient des mémoires à tampon de ligne, dont le support de mémorisation était organisé en ligne et colonnes. Une ligne à l'intérieur de la mémoire correspond à une ligne de pixel à l'écran, ce qui se marie bien avec le fait que les anciens écrans CRT affichaient les images ligne par ligne. L'envoi d'une ligne à l'écran se fait bit par bit, sur un câble assez simple comme un câble VGA ou autre. Le second port permettait de faire cela automatiquement, en permettant de lire une ligne bit par bit, les bits étant envoyés l'un après l'autre automatiquement. Pour cela, les mémoires vidéo double port incorporaient un tampon de ligne spécialisé pour le port lié à l'écran. Ce tampon de ligne n'était autre qu'un registre à décalage, contrairement au tampon de ligne normal. Lors de l'accès au second port, la carte graphique fournissait un numéro de ligne et la ligne était chargée dans le tampon de ligne associé à l'écran. La carte graphique envoyait un signal d'horloge de même fréquence que l'écran, qui commandait le tampon de ligne à décalage : un bit sortait à chaque cycle d'écran et les bits étaient envoyé dans le bon ordre. ===Les mémoires SGRAM et GDDR=== De nos jours, les cartes graphiques n'utilisent plus de mémoires double port, mais des mémoires simple port. Les mémoires graphiques actuelles sont des SDRAM modifiées pour fonctionner en tant que ''Graphic RAM''. Les plus connues sont les '''mémoires GDDR''', pour ''graphics double data rate'', utilisées presque exclusivement sur les cartes graphiques. Il en existe plusieurs types pendant que j'écris ce tutoriel : GDDR, GDDR2, GDDR3, GDDR4, et GDDR5. Mais attention, il y a des différences avec les DDR normales. Par exemple, les GDDR ont une fréquence plus élevée que les DDR normales, avec des temps d'accès plus élevés (sauf pour le tCAS). De plus, elles sont capables de laisser ouvertes deux lignes en même temps. Par contre, ce sont des mémoires simple port. ==Les mémoires SLDRAM, RDRAM et associées== Les mémoires précédentes sont généralement associées à des bus larges. Les mémoires SDRAM et DDR modernes ont des bus de données de 64 bits de large, avec des d'adresse et de commande de largeur similaire. Le nombre de fils du bus mémoire dépasse facilement la centaine de fils, avec autant de broches sur les barrettes de mémoire. Largeur de ces bus pose de problèmes problèmes électriques, dont la résolution n'est pas triviale. En conséquence, la fréquence du bus mémoire est généralement moins performantes comparé à ce qu'on aurait avec un bus moins large. Mais d'autres mémoires DRAM ont exploré une solution alternative : avoir un bus peu large mais de haute fréquence, sur lequel on envoie les commandes/données en plusieurs fois. Elles sont regroupées sous le nom de '''DRAM à commutation par paquets'''. Elles utilisent des bus spéciaux, où les commandes/adresses/données sont transmises par paquets, par trames, en plusieurs fois. En théorie, ce qu'on a dit sur le codage des trames dans le chapitre sur le bus devrait s'appliquer à de telles mémoires. En pratique, les protocoles de transmission sur le bus mémoire sont simplifiés, pour gérer le fonctionnement à haute fréquence. Le processeur envoie des paquets de commandes, les mémoires répondent avec des paquets de données ou des accusés de réception. Les mémoires à commutation par paquets sont peu nombreuses. Les plus connues sont les mémoires conçues par la société Rambus, à savoir la ''RDRAM'' (''Rambus DRAM'') et ses deux successeurs ''XDR RAM'' et ''XDR RAM 2''. La ''Synchronous-link DRAM'' (''SLDRAM'') est un format concurrent conçu par un consortium de plusieurs concepteurs de mémoire. ===La SLDRAM (''Synchronous-link DRAM'')=== Les '''mémoires SLDRAM''' avaient un bus de données de 64 bits allant à 200-400 Hz, avec technologie DDR, ce qui était dans la norme de l'époque pour la fréquence (début des années 2000). Elle utilisait un bus de commande de 11 bits, qui était utilisé pour transmettre des commandes de 40 bits, transmises en quatre cycles d'horloge consécutifs (en réalité, quatre fronts d'horloge donc deux cycles en DDR). Le bus de données était de 18 bits, mais les transferts de donnée se faisaient par paquets de 4 à 8 octets (32-65 bits). Pour résumer, données et commandes sont chacunes transmises en plusieurs cycles consécutifs, sur un bus de commande/données plus court que les données/commandes elle-mêmes. Là où les SDRAM sélectionnent la bonne barrette grâce à des signaux de commande dédiés, ce n'est pas le cas avec la SLDRAM. A la place, chaque barrette de mémoire reçoit un identifiant, un numéro codé sur 7-8 bits. Les commandes de lecture/écriture précisent l'identifiant dans la commande. Toutes les barrettes reçoivent la commande, elles vérifient si l'identifiant de la commande est le leur, et elles la prennent en compte seulement si c'est le cas. Voici le format d'une commande SLDRAM. Elle contient l'adresse, qui regroupe le numéro de banque, le numéro de ligne et le numéro de colonne. On trouve aussi un code commande qui indique s'il faut faire une lecture ou une écriture, et qui configure l'accès mémoire. Il configure notamment le mode rafale, en indiquant s'il faut lire/écrire 4 ou 8 octets. Enfin, il indique s'il faut fermer la ligne accédée une fois l'accès terminé, ou s'il faut la laisser ouverte. Le code commande peut aussi préciser que la commande est un rafraichissement ou non, effectuer des opérations de configuration, etc. L'identifiant de barrette mémoire est envoyé en premier, histoire que les barrettes sachent précocement si l'accès les concerne ou non. {|class="wikitable" style="text-align:center" |+SLDRAM Read, write or row op request packet ! FLAG || CA9 || CA8 || CA7 || CA6 || CA5 || CA4 || CA3 || CA2 || CA1 || CA0 |- ! 1 | colspan=9 bgcolor=#ffcccc| Identifiant de barrette mémoire|| bgcolor=#ccffcc| Code de commande |- ! 0 | colspan=5 bgcolor=#ccffcc| Code de commande ||colspan=3 bgcolor=#ff88ff| Banque||colspan=2 bgcolor=#ffffcc| Ligne |- ! 0 | colspan=9 bgcolor=#ffffcc| Ligne || 0 |- ! 0 | 0 || 0 || 0 ||colspan=7 bgcolor=#ccffff| Colonne |} ===Les mémoires Rambus=== Les mémoires conçues par la société Rambus regroupent la '''RDRAM''' (''Rambus DRAM'') et ses deux successeurs '''XDR RAM''' et '''XDR RAM 2'''. Les toutes premières étaient les '''mémoires RDRAM''', où le bus permettait de transmettre soit des commandes (adresse inclue), soit des données, avec un multiplexage total. Le processeur envoie un paquet contenant commandes et adresse à la mémoire, qui répond avec un paquet d'acquittement. Lors d'une lecture, le paquet d'acquittement contient la donnée lue. Lors d'une écriture, le paquet d'acquittement est réduit au strict minimum. Le bus de commandes est réduit au strict minimum, à savoir l'horloge et quelques bits absolument essentiels, les bits RW est transmis dans un paquet et n'ont pas de ligne dédiée, pareil pour le bit OE. Toutes les barrettes de mémoire doivent vérifier toutes les transmissions et déterminer si elles sont concernées en analysant l'adresse transmise dans la trame. Elles ont été utilisées dans des PC ou d'anciennes consoles de jeu. Par exemple, la Nintendo 64 incorporait 4 mébioctets de mémoire RDRAM en tant que mémoire principale. La RDRAM de la Nintendo 64 était cadencée à 500 MHz, utilisait un bus de 9 bits, et avait un débit binaire maximal théorique de 500 MB/s. La Playstation 2 contenait quant à elle 32 mébioctets de RDRAM en ''dual-channel'', pour un débit binaire de 3.2 Gibioctets par seconde. Les processeurs Pentium 3 pouvaient être associés à de la RDRAM sur certaines mères. Les Pentium 4 étaient eux aussi associés à la de RDRAM, mais les cartes mères ne géraient que ce genre de mémoire. La Playstation 3 contenait quant à elle de la XDR RAM. ==Les eDRAM : des DRAM adaptées aux ''chiplets''== Les '''mémoires eDRAM''', pour ''embedded DRAM'', sont des mémoires RAM qui sont destinées à être intégrée au processeur. Pour comparer, les DRAM normales sont placées sur des barrettes de RAM ou soudées à la carte mère. Dans la quasi-totalité des cas, l'eDRAM est utilisée pour implémenter une mémoire cache, elle ne sert pas de mémoire principale (cache L4, le plus proche de la mémoire sur ces puces). De ce fait, elles sont conçues pour être très rapides, avoir une grande bande passante, au détriment de leur capacité mémoire. Pour être plus précis, l'eDRAM est une puce de DRAM conçue pour être intégrée dans un ''chiplet'', , à savoir des circuits imprimés qui regroupent plusieurs puces électroniques distinctes, regroupées sur le même PCB. Typiquement, un processeur de type ''chiplet'' avec de l'eDRAM comprend deux puces séparées : une pour le processeur, une autre pour une puce de communication avec la RAM. Avec la mémoire eDRAM, les deux puces sont complétées par une troisième puce spécialisée qui incorpore l'eDRAM. Elle a été utilisée sur quelques processeurs, mais aussi dans des consoles de jeu vidéo, pour la carte graphique des consoles suivantes : la PlayStation 2, la PlayStation Portable, la GameCube, la Wii, la Wii U, et la XBOX 360. Sur ces consoles, la RAM de la carte graphique était intégrée avec le processeur graphique dans le même circuit. La fameuse mémoire vidéo et le GPU n'étaient qu'une seule et même puce électronique, un seul circuit intégré. Ce n'est pas le cas sur une carte graphique moderne : regardez votre carte graphique avec attention et vous verrez que le GPU est une puce carrée située sous les ventilateurs, alors que les puces mémoires sont situées juste autour et soudées sur le PCB de la carte. Les processeurs Intel Core de microarchitecture Broadwell disposaient d'un cache L4 de 128 mébioctets, intégralement implémenté avec de la mémoire eDRAM. Quelques processeurs de la microarchitecture précédente (Haswell), disposaient aussi de ce cache. Le cache L4 eDRAM était implémenté sur un chiplet à part, à savoir que le processeur était composé de trois puces séparées : une pour le processeur, une autre pour la gestion des entrées-sorties, et une autre pour le cache L4. La puce pour le cache L4, appelée ''Crystal Well'', était gravée en 22nm, ce qui était une finesse de gravure plus élevée que celle des processeurs associés. ''Crystal Well'' était très optimisé pour l'époque. Par exemple, elle disposait de bus séparées pour la lecture et l'écriture, chose qu'on retrouve fréquemment sur les SRAM mais qui est absent sur les mémoires DRAM actuelles. Pour le reste, elle ressemblait beaucoup aux mémoires DDR de l'époque (système de ''double data rate'', entres autres), mais elle allait à une fréquence plus élevée que les DRAM de l'époque et avait un débit bien plus élevé, pour une consommation moindre. ''Crystal Well'' consommait entre 1 à 5 watts (1 watt en veille, 5 à pleine utilisation), pour un débit binaire de 102 GB/s et fonctionnait à 3.2 GHz. <noinclude> {{NavChapitre | book=Fonctionnement d'un ordinateur | prev=Les mémoires SRAM synchrones | prevText=Les mémoires SRAM synchrones | next=Contrôleur mémoire externe | nextText=Le contrôleur mémoire externe }}{{autocat}} </noinclude> k7eru9pp9pfk0orpquudiv6g0gvos9x Wikilivres:EXERCICES PHILOSOPHIQUES Apprendre avec les humanités numériques 4 72109 765007 760344 2026-04-25T08:31:03Z PandaMystique 119061 765007 wikitext text/x-wiki {{delete}} {{Couverture d'un wikilivre |titre=EXERCICES PHILOSOPHIQUES |sous-titre=Apprendre avec les humanités numériques |image de couverture=[[File:Bartholomeus Spranger - Hermes and Athena - WGA21691.jpg|Bartholomeus Spranger - Hermes and Athena - WGA21691]] |couleur de couverture=violet |couleur du texte=  }} {{Wikilivres}} {{Navbar |3=[https://fr.wikibooks.org/w/index.php?title=Bonheur,_morale,_et_philosophie_%C3%A9pistolaire&oldid=602588/ Bonheur, morale et philosophie]}} Bonjour, et [[Wikilivres:Bienvenue|bienvenue]] sur Wikilivres. En cas de besoin, voici quelques pages qui devraient vous être utiles si vous n'êtes pas familiers des [[w:Wiki|wikis]] : *[[Aide:Comment modifier une page|Comment modifier une page]] *[[Aide:Accueil|Sommaire des pages d'aide]] *[[Wikilivres:Conventions typographiques|Conventions typographiques]] *[[Wikilivres:Règles et recommandations|Règles et recommandations]] *[[Wikilivres:Bac à sable|Le bac à sable pour essayer la syntaxe wiki]] Pour signer vos messages en page de discussion (on ne [[Wikilivres:Règles#Rédaction collective|signe pas]] les livres) utilisez quatre tildes (<nowiki>~~~~</nowiki>); cela produira automatiquement votre nom et la date de publication. Si vous avez besoin d'aide, demandez à la communauté au [[Wikilivres:Le Bistro|Bistro]] ou sur ma propre page de discussion, ou bien consultez la [[Wikilivres:Foire aux questions|FAQ]] . Bonne continuation. == SOMMAIRE == == Détails bibliographiques pour Bonheur, morale, et philosophie épistolaire ↑ [URL] <nowiki>[[lien]]</nowiki> == * Nom de la page : Bonheur, morale, et philosophie épistolaire * Auteur : contributeurs de Wikilivres * Éditeur : ''Wikilivres,'' . * Dernière modification : 9 septembre 2018 09:47 TUC * Récupéré : 9 septembre 2018 18:29 TUC * URL permanente : <nowiki>https://fr.wikibooks.org/w/index.php?title=Bonheur,_morale,_et_philosophie_%C3%A9pistolaire&oldid=602490</nowiki> * Identifiant de cette version : 602490 ---- == Détails bibliographiques pour Dossier sur l'amitié (cliquer) ↑ [URL] [[Dossier sur l'amitié (cliquer)|Dossier sur l'amitié (cliquer)]] == * Nom de la page : Dossier sur l'amitié (cliquer) * Auteur : contributeurs de Wikilivres * Éditeur : ''Wikilivres,'' . * Dernière modification : 9 septembre 2018 09:40 TUC * Récupéré : 9 septembre 2018 18:31 TUC * URL permanente : <nowiki>https://fr.wikibooks.org/w/index.php?title=Dossier_sur_l%27amiti%C3%A9_(cliquer)&oldid=602484</nowiki> * Identifiant de cette version : 602484 ---- == Détails bibliographiques pour Interpréter des films dans le cadre de questions philosophiques ↑ [URL] <nowiki>[[lien]]</nowiki> == * Nom de la page : Interpréter des films dans le cadre de questions philosophiques * Auteur : contributeurs de Wikilivres * Éditeur : ''Wikilivres,'' . * Dernière modification : 9 septembre 2018 02:38 TUC * Récupéré : 9 septembre 2018 18:34 TUC * URL permanente : <nowiki>https://fr.wikibooks.org/w/index.php?title=Interpr%C3%A9ter_des_films_dans_le_cadre_de_questions_philosophiques&oldid=602468</nowiki> * Identifiant de cette version : 602468 ---- == Détails bibliographiques pour Commentaire philosophique/L'état de nature selon Hobbes et Rousseau. ↑ [URL] <nowiki>[[lien]]</nowiki> == * Nom de la page : Commentaire philosophique/L'état de nature selon Hobbes et Rousseau. * Auteur : contributeurs de Wikilivres * Éditeur : ''Wikilivres,'' . * Dernière modification : 19 septembre 2016 19:05 TUC * Récupéré : 10 septembre 2018 08:31 TUC * URL permanente : <nowiki>https://fr.wikibooks.org/w/index.php?title=Commentaire_philosophique/L%27%C3%A9tat_de_nature_selon_Hobbes_et_Rousseau.&oldid=527079</nowiki> * Identifiant de cette version : 527079 ---- == Détails bibliographiques pour Les Stoïciens : Épictète Le poignard à la main ↑ [URL] <nowiki>[[lien]]</nowiki> == * Nom de la page : Les Stoïciens : Épictète Le poignard à la main * Auteur : contributeurs de Wikilivres * Éditeur : ''Wikilivres,'' . * Dernière modification : 2 janvier 2018 17:12 TUC * Récupéré : 10 septembre 2018 08:41 TUC * URL permanente : <nowiki>https://fr.wikibooks.org/w/index.php?title=Les_Sto%C3%AFciens_:_%C3%89pict%C3%A8te_Le_poignard_%C3%A0_la_main&oldid=580404</nowiki> * Identifiant de cette version : 580404 ---- cayku9419v54fxx6j5pzopbfmnlrmdg Mécanique classique 0 72398 765031 706952 2026-04-25T10:06:06Z Xhungab 23827 765031 wikitext text/x-wiki {{Suppression Immédiate|Livre créé le 6 novembre 2018 à 15:51 DavidMaxwell sans contenu}} {{nouveau livre}} David Maxwell(s'ils souhaitent s'identifier) La mécanique classique permet la description du mouvement des corps en se fondant sur les lois de Newton (XVII° siècle). '''Table des matières''' # [[/Cinématique du point/]] # [[/Dynamique du point/]] # [[/Énergétique du point/]] # [[/Moment cinétique du point matériel/]] # [[/Systèmes du premier et du second ordre, oscillateurs/]] # [[/Mouvement d'un point matériel dans un champ de force centrale/]] # [[/Mouvement dans un référentiel non-galiléen/]] # [[/Cinématique du solide/]] # [[/Dynamique du solide/]] '''À qui s'adresse ce livre ?''' ... '''Objectifs pédagogiques''' : ... '''Table des matières détaillée''' # [[/Titre du premier chapitre/]] ## Titre de la première section ... jtlecqrjjz8z4f56dg02m4f5549u397 Les cartes graphiques/Les caches d'un processeur de shader 0 74269 764873 763325 2026-04-24T17:50:49Z Mewtow 31375 /* La mémoire partagée : un local store */ 764873 wikitext text/x-wiki Dans ce chapitre, nous allons voir comment est organisée la mémoire d'un GPU, ou plutôt devrait-on dire les mémoires d'un GPU. Eh oui : un GPU contient beaucoup de mémoires différentes. Un GPU contient évidemment une mémoire vidéo de grande taille, séparée des processeurs de shader, mais pas que. Les processeurs de shaders intègrent aussi des mémoires plus petites, appelées des mémoires caches. Les processeurs intégrent tous des caches et les processeurs de shaders ne font pas exception. Cependant, les caches d'un GPU sont quelque peu particuliers et sont organisés différemment. La hiérarchie mémoire des GPUs est assez particulière, et nous allons voir en quoi dans ce qui suit. ==Les caches spécialisés d'un GPU== Un point important est que les GPU sont dédiés au rendu 3D, et cette spécialisation se voit dans leurs mémoires caches. Les premières cartes graphiques avaient des caches spécialisés, avec des caches pour les textures, des caches de sommets, des caches pour le tampon de profondeur, etc. Ils n'avaient pas de caches généralistes, qui servent à stocker n'importe quel type de données. Les caches spécialisés étaient intégrés aux circuits fixes. Par exemple, le cache pour les textures est placé dans l'unité de texture, le cache de sommet dans l'''input assembler'', le cache du ''z-buffer'' dans les ROPs. ===Les caches de sommets=== Avant Direct X 10, les cartes graphiques avaient des caches dédiés à la géométrie, deux précisémment. Ils étaient appelés des caches de sommets, le terme étant utilisé pour les deux caches. Le premier cache mémorise des sommets qui ont été transformés/éclairés, alors que le second mémorise des sommets pas encore éclairés. Le premier cache est appelé le ''Post-transform cache'' et se situe en sortie des unités de ''vertex shader'' ou de l'unité de T&L. Le second cache s'appelle le ''Pre-transform cache'' fait partie de l'''input assembler''. [[File:Vertex cache.png|centre|vignette|upright=2.5|''Pre-transform'' et ''Post-transform cache''.]] Nous détaillerons le fonctionnement de ces caches dans le chapitre sur le pipeline géométrique, nous ne pouvons pas en dire plus pour le moment. De plus, les deux caches ont disparus sur certains GPU modernes. Le ''Pre Transform Cache'' a été remplacé par des mémoires caches généralistes, qui ne sont pas spécialisées dans les sommets. Le ''Post-transform cache'' a lieu été remplacé, en raison de la manière dont les processeurs de shaders fonctionnent. Je recommande la lecture de l'article "Revisiting The Vertex Cache : Understanding and Optimizing Vertex Processing on the modern GPU" à ce sujet. ===Le cache de textures=== Le '''cache de textures''', comme son nom l'indique, est un cache spécialisé dans les textures. Toutes les cartes graphiques modernes disposent de plusieurs unités de texture, qui disposent chacune de son ou ses propres caches de textures. Pas de cache partagé, ce serait peu utile et trop compliqué à implémenter. De plus, les cartes graphiques modernes ont plusieurs caches de texture par unité de texture. Généralement, elles ont deux caches de textures : un petit cache rapide, et un gros cache lent. Les deux caches sont fortement différents. L'un est un gros cache, qui fait dans les 4 kibioctets, et l'autre est un petit cache, faisant souvent moins d'1 kibioctet. Mais le premier est plus lent que le second. Sur d'autres cartes graphiques récentes, on trouve plus de 2 caches de textures, organisés en une hiérarchie de caches de textures similaire à la hiérarchie de cache L1, L2, L3 des processeurs modernes. Notons que ce cache interagit avec les techniques de compression de texture. Les textures sont en effet des images, qui sont donc compressées. Et elles restent compressées en mémoire vidéo, car les textures décompressées prennent beaucoup plus de place, entre 5 à 8 fois plus. Les textures sont décompressées lors des lectures : le processeur de shaders charge quelques octets, les décompresse, et utilise les données décompressées ensuite. Le cache s'introduit quelque part avant ou après la décompression. On peut décompresser les textures avant de les placer dans le cache, ou laisser les textures compressées dans le cache. Tout est une question de compromis. Décompresser les textures dans le cache fait que la lecture dans le cache est plus rapide, car elle n'implique pas de décompression, mais le cache contient moins de données. À l'inverse, compresser les textures permet de charger plus de données dans le cache, mais rend les lectures légèrement plus lentes. C'est souvent la seconde solution qui est utilisée et ce pour deux raisons. Premièrement, la compression de texture est terriblement efficace, souvent capable de diviser par 6 la taille d'une texture, ce qui augmente drastiquement la taille effective du cache. Deuxièmement, les circuits de décompression sont généralement très rapides, très simples, et n'ajoutent que 1 à 3 cycles d'horloge lors d'une lecture. Les anciens jeux vidéo ne faisaient que lire les textures, sans les modifier. Aussi, le cache de texture des cartes graphiques anciennes est seulement accessible en lecture, pas en écriture. Cela simplifiait fortement les circuits du cache, réduisant le nombre de transistors utilisés par le cache, réduisant sa consommation énergétique, augmentait sa rapidité, etc. Mais les jeux vidéos 3D récents utilisent des techniques dites de ''render-to-texture'', qui permettent de calculer certaines données et à les écrire en mémoire vidéo pour une utilisation ultérieure. Les textures peuvent donc être modifiées et cela se marie mal avec un cache en lecture seule. Rendre le cache de texture accessible en écriture est une solution, mais qui demande d'ajouter beaucoup de circuits pour une utilisation somme toute peu fréquente. Une autre solution, plus adaptée, réinitialise le cache de textures quand on modifie une texture, que ce soit totalement ou partiellement. Une fois le cache vidé, les accès mémoire ultérieurs n'ont pas d'autre choix que d'aller lire la texture en mémoire et de remplir le cache avec les données chargées depuis la RAM. Les données de texture en RAM étant les bonnes, cela garantit l’absence d'erreur. : Ces deux techniques peuvent être adaptées dans le cas où plusieurs caches de textures séparées existent sur une même carte graphique. Les écritures doivent invalider toutes les copies dans tous les caches de texture. Cela nécessite d'ajouter des circuits qui propagent l'invalidation dans tous les autres caches. ===Les caches de constante=== Un shader a besoin de certaines "constantes" pour faire son travail. Les constantes en question sont d'accès peu fréquent, qui se limite souvent à un accès au début de chaque instance de shader, guère plus. Au premier abord, dédier un cache à de telles constantes ne parait pas très utile, vu qu'elles ne semblent pas réutilisées. Mais c'est oublier un point important : toutes les instances du shader manipulent ces constantes, et il y en a souvent plusieurs qui s'exéceutn à tour de rôle, si ce n'est en même temps ! Pour profiter du partage des constantes entre instances d'un shader, les GPU incorporent des '''caches de constantes'''. Ainsi, quand un shader lit une donnée, elle est chargée dans le cache de constante, ce qui fait que les autres instances liront ces constantes depuis le cache et non depuis la VRAM. Les caches de constante sont séparés des autres caches de données, car ce sont des données peu fréquemment utilisées, qui sont censées être évincées en priorité du cache de données, qui privilégie les données fréquemment lues/écrites. Avec un cache séparé, les constantes restent dans le cache. Au passage, ce cache de constante a des chances d'être partagé entre plusieurs cœurs, des cœurs différents ayant de fortes chances d’exécuter des instances différentes d'un même shader. ==Les caches généralistes== Les GPUs récents contiennent des caches généralistes, qui ne sont spécialisés dans le rendu graphique. Leur existence se justifie par le fait que les GPU sont de plus en plus utilisés pour du calcul généraliste (scientifique, notamment), à savoir qu'ils exécutent des ''compute shaders'' qui manipulent des données arbitraires. Et de tels ''compute shaders'' sont parfois utilisés pour du rendu 3D, pour exécuter des algorithmes d'élimination des pixels cachés, ou des algorithmes de rendu assez complexes. Les caches généralistes des GPU modernes ressemblent à ceux des CPU, avec une hiérarchie de caches. Pour rappel, les processeurs multicœurs modernes ont souvent trois à quatre niveaux de caches, appelés les caches L1, L2, L3 et éventuellement L4. Les GPU ont une organisation similaire, sauf que le nombre de cœurs est beaucoup plus grand que sur un processeur moderne. * Pour le premier niveau, on a deux caches L1 par cœur/processeur : un cache pour les instructions et un cache pour les données. * Pour le second niveau, on a un cache L2 qui peut stocker indifféremment données et instruction et qui est partagé entre plusieurs cœurs/processeurs. * Le cache L3 est un cache partagé entre tous les cœurs/processeurs. [[File:Partage des caches sur un processeur multicoeurs.png|centre|vignette|upright=2|Partage des caches sur un processeur multicoeurs]] ===Les caches d'instruction=== Les caches d'instruction des GPU sont adaptés aux contraintes du rendu 3D. Le principe du rendu 3D est d'appliquer un shader assez simple sur un grand nombre de données. Les shaders sont donc des programmes assez légers, qui ont peu d'instructions. Les caches d'instructions des GPU sont généralement assez petits, quelques dizaines ou centaines de kilooctets. Et malgré cela, il n'est pas rare qu'un ''shader'' tienne tout entier dans le cache d'instruction. La seconde caractéristique est qu'un même programme s’exécute sur beaucoup de données. Il n'est pas rare que plusieurs processeurs de shaders exécutent le même ''shader''. Aussi, certains GPU partagent un même cache d’instruction entre plusieurs processeurs de ''shader'', comme c'est le cas sur les GPU AMD d'architecture GCN où un cache d'instruction de 32 kB est partagé entre 4 cœurs. ===Les caches de données=== Pour les caches de données, il faut savoir qu'un shader a peu de chances de réutiliser une donnée qu'il a chargé précédemment. Les processeurs de shaders ont beaucoup de registres, ce qui fait que si accès ultérieur à une donnée il doit y avoir, elle passe généralement par les registres. Cette faible réutilisation fait que les caches de données ne sont pas censé être très utiles. Il y a cependant des exceptions, qui expliquent que les cartes graphiques incorporent un cache de texture et un cache de sommet (pour le tampon de sommet). Il faut noter que sur la plupart des cartes graphiques modernes, les caches de données et le cache de texture sont un seul et même cache. Même chose pour le cache de sommets, utilisé par les unités géométrique, qui est fusionné avec les caches de données. La raison est que une économie de circuits qui ne coute pas grand chose en termes de performance. Rappelons que les processeurs de shaders sont unifiés à l'heure actuelle, c'est à dire qu'elles peuvent exécuter pixel shader et vertex shader. Au lieu d'incorporer un cache de sommets et un cache de textures, autant utiliser un seul cache qui sert alternativement de cache de vertex et de cache de texture, afin d'économiser des circuits. ==La mémoire partagée : un ''local store''== En plus d'utiliser des caches, les GPU modernes utilisent des ''local stores'', aussi appelés ''scratchpad memories''. Ce sont des mémoires RAM intermédiaires entre la RAM principale et les registres. Ces local stores peuvent être vus comme des caches, mais que le programmeur doit gérer manuellement. Dans la réalité, ce sont des mémoires RAM très rapides mais de petite taille, qui sont adressées comme n'importe quelle mémoire RAM, en utilisant des adresses directement. [[File:Scratch-Pad-Memory.jpg|centre|vignette|upright=2.0|Scratch-Pad-Memory (SPM).]] Sur les GPU modernes, chaque processeur de ''shader'' possède un unique ''local store'', appelée la '''mémoire partagée'''. Il n'y a pas de hiérarchie des ''local store'', similaire à la hiérarchie des caches. <noinclude>[[File:Cuda5.png|centre|vignette|upright=2.0|Local stores d'un GPU.]]</noinclude> La faible capacité de ces mémoires, tout du moins comparé à la grande taille de la mémoire vidéo, les rend utile pour stocker temporairement des résultats de calcul "peu imposants". L'utilité principale est donc de réduire le trafic avec la mémoire centrale, les écritures de résultats temporaires étant redirigés vers les local stores. Ils sont surtout utilisés hors du rendu 3D, pour les applications de type GPGPU, où le GPU est utilisé comme architecture multicœurs pour du calcul scientifique. ===L'implémentation des ''local store''=== Vous vous attendez certainement à ce que je dise que les ''local store'' sont des mémoires séparées des mémoires caches et qu'il y a réellement des puces de mémoire RAM distinctes dans les processeurs de ''shaders''. Mais en réalité, ce n'est pas le cas pour tous les ''local store''. Le dernier niveau de ''local store'', la mémoire partagée, est bel et bien une mémoire SRAM à part des autres, avec ses propres circuits. Mais les cartes graphiques très récentes fusionnent la mémoire locale avec le cache L1. L'avantage est une économie de transistors assez importante. De plus, cette technologie permet de partitionner le cache/''local store'' suivant les besoins. Par exemple, si la moitié du ''local store'' est utilisé, l'autre moitié peut servir de cache L1. Si le ''local store'' n'est pas utilisé, comme c'est le cas pour la majorité des rendu 3D, le cache/''local store'' est utilisé intégralement comme cache L1. Et si vous vous demandez comment c'est possible de fusionner un cache et une mémoire RAM, voici comment le tout est implémenté. L'implémentation consiste à couper le cache en deux circuits, dont l'un est un ''local store'', et l'autre transforme le ''local store'' en cache. Ce genre de cache séparé en deux mémoires est appelé un ''phased cache'', pour ceux qui veulent en savoir plus, et ce genre de cache est parfois utilisés sur les processeurs modernes, dans des processeurs dédiés à l'embarqué ou pour certaines applications spécifiques. Le premier circuit vérifie la présence des données à lire/écrire dans le cache. Lors d'un accès mémoire, il reçoit l'adresse mémoire à lire, et détermine si une copie de la donnée associée est dans le cache ou non. Pour cela, il utilise un système de tags qu'on ne détaillera pas ici, mais qui donne son nom à l'unité de vérification : l''''unité de tag'''. Son implémentation est très variable suivant le cache considéré, mais une simple mémoire RAM suffit généralement. En plus de l'unité de tags, il y a une mémoire qui stocke les données, la mémoire cache proprement dite. Par simplicité, cette mémoire est une simple mémoire RAM adressable avec des adresses mémoires des plus normales, chaque ligne de cache correspondant à une adresse. La mémoire RAM de données en question n'est autre que le ''local store''. En clair, le cache s'obtient en combinant un ''local store'' avec un circuit qui s'occupe de vérifier de vérifier les succès ou défaut de cache, et qui éventuellement identifie la position de la donnée dans le cache. [[File:Phased cache.png|centre|vignette|upright=1.5|Phased cache]] Pour que le tout puisse servir alternativement de ''local store'' ou de cache, on doit contourner ou non l'unité de tags. Lors d'un accès au cache, on envoie l'adresse à lire/écrire à l'unité de tags. Lors d'un accès au ''local store'', on envoie l'adresse directement sur la mémoire RAM de données, sans intervention de l'unité de tags. Le contournement est d'autant plus simple que les adresses pour le ''local store'' sont distinctes des adresses de la mémoire vidéo, les espaces d'adressage ne sont pas les mêmes, les instructions utilisées pour lire/écrire dans ces deux mémoires sont aussi potentiellement différentes. [[File:Hydride cache - local store.png|centre|vignette|upright=2.0|Hydride cache - local store]] Il faut préciser que cette organisation en ''phased cache'' est assez naturelle. Les caches de texture utilisent cette organisation pour diverses raisons. Vu que cache L1 et cache de texture sont le même cache, il est naturel que les caches L1 et autres aient suivi le mouvement en conservant la même organisation. La transformation du cache L1 en hydride cache/''local store'' était donc assez simple à implémenter et s'est donc faite facilement. ==La cohérence des caches sur un GPU== Pour terminer ce chapitre, nous allons parler de la '''cohérence des caches'''. La cohérence des caches est un problème qui se manifeste à plusieurs niveaux, quand on parle d'un GPU : entre CPU et GPU, ou entre processeurs de shaders. Nous allons voir les deux cas l'un après l'autre. ===La cohérence des caches pour les transferts DMA=== Supposons que le CPU ait transféré les données dans la mémoire vidéo, avec un transfert DMA. Une situation bien précise pose problème : quand un transfert DMA écrase des données devenues inutiles, pour les remplacer par des données utiles. C'est très fréquent, les pilotes graphiques libèrent souvent de la mémoire vidéo pour la réallouer immédiatement après, afin de ne pas gaspiller de VRAM. Sans intervention du GPU, le remplacement des données aura été fait en mémoire vidéo, pas dans les caches du GPU. Et tout accès ultérieur au cache renverra la donnée écrasée. [[File:Cache incoherence write.svg|centre|vignette|upright=2|Cohérence des caches avec DMA.]] Pour éviter cela, le GPU invalide ses caches en cas de transfert DMA. Par invalider, on veut dire que le cache est réinitialisé, mis à zéro, il est rendu vierge de toute donnée. Ainsi, tout accès mémoire ultérieur se fera en mémoire RAM sans passer par le cache. Les données lues depuis la RAM seront ensuite copiées dans le cache, mais ce seront les données valides écrites après le transfert DMA. Le contenu du cache est alors reconstitué au fur et à mesure des accès mémoire. L'invalidation est automatique sur les anciens GPU, elle est réalisée par le processeur de commande. Sur les GPU modernes, elle est réalisée par le programmeur, comme on va le voir dans la section immédiatement suivante. ===La cohérence des caches entre CPU et GPU=== Dans ce qui suit, on suppose qu'il n'y a qu'une seule mémoire RAM, qui est partagée entre CPU et GPU, et sert à la fois de RAM et de mémoire vidéo. Il s'agit de ce que l'on appelle la mémoire unifiée. Elle est utilisée dans de nombreuses consoles de jeu, mais aussi avec les GPU intégrés, qui sont dans le processeur. La mémoire unifiée n'implique pas de transfert DMA entre CPU et GPU, vu qu'il n'y a qu'une seule RAM. Par contre, un problème différent du précédent peut survenir. Le processeur n'écrit pas directement en mémoire RAM, mais dans son cache. Les écritures sont propagées en RAM avec un certain retard, quand les données sont évincées du cache pour faire de la place à de nouvelles données. Et même quand elles sont propagées en RAM, les écritures ne sont pas propagées dans les caches du GPU. Pour corriger cela, lorsque le processeur envoie des données au GPU, il force le GPU à invalider ses caches. Il envoie une commande dédiée pour, qui précède les commandes liées au rendu 2D/3D/autres. [[File:Cohérence des caches entre CPU et GPU avec mémoire unifiée.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU avec mémoire unifiée]] Au niveau du processeur, le processeur doit écrire les données dans la mémoire RAM, avant de faire le transfert DMA. Mais la présence de caches pose problème : les écritures peuvent être interceptées par le cache et ne pas être propagées en RAM. Pour éviter cela, les processeurs modernes marquent des blocs de mémoire comme "non-cacheables", à savoir que toute lecture/écriture dedans se fait sans passer par le cache. C'est une fonctionnalité très importante pour communiquer avec les périphériques. Pour les GPU dédiés/soudés, cela a un lien avec la mémoire vidéo mappée en mémoire. Plus haut, nous avions dit que la mémoire vidéo est visible dans l'espace d'adressage du processeur, à savoir qu'un bloc de mémoire est détourné pour adresser non pas la RAM, mais la mémoire vidéo. Et bien ce bloc de mémoire entier est marqué comme étant non-cacheable. [[File:Cohérence des caches entre CPU et GPU avec mémoire unifiée, mécanismes.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU avec mémoire unifiée, mécanismes]] La situation peut être optimisée sur les GPU intégrés. Si le GPU est conçu pour, il n'y a pas besoin de marquer les données comme non-cacheables. Le cas le plus simple est celui où le CPU et le GPU partagent leur cache L3/L4. Dans ce cas, il n'y a qu'un seul cache L3/L4 qui ne contient qu'une seule copie valide, écrite par le CPU et lue par le GPU. Il faut juste garantir que la donnée soit lue par le GPU depuis le L3, mais c'est là une question d'inclusivité du cache, qui ne nous concerne pas ici. Si le CPU et le GPU ne partagent pas de cache, il suffit que le GPU puisse lire les caches du CPU. C'est la méthode utilisée sur l'APU Trinity d'AMD. [[File:Cohérence des caches entre CPU et GPU intégré.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU intégré]] ===La cohérence des caches entre processeurs de shaders=== Pour terminer, il faut voir la cohérence des caches entre processeurs de shaders. Une carte graphique moderne est, pour simplifier, un gros processeur multicœurs auquel on aurait rajouté des ROPs, les circuits de la rastérisation et les unités de textures. Il n'est donc pas étonnant que les problèmes rencontrés sur les processeurs multicœurs soient aussi présents sur les GPU, la cohérence des caches ne fait pas exception. Pour simplifier les explications, nous allons partir du principe que chaque processeur de shaders a son propre cache de données. Prenons deux processeur de shaders qui ont chacun une copie d'une donnée dans leur cache. Si un processeur de shaders modifie sa copie de la donnée, l'autre ne sera pas mise à jour. L'autre processeur manipule donc une donnée périmée : il n'y a pas cohérence des caches. [[File:Cohérence des caches.png|centre|vignette|upright=2|Cohérence des caches]] La réalité est cependant plus complexe, dans le sens où il n'y a souvent pas un cache par processeur de shaders, mais une hiérarchie de cache assez complexe, avec un cache L1 par processeur de shaders, un cache L2 partagé entre plusieurs processeur de shaders, des caches partagés entre tous les processeur de shaders, etc. Certains GPU partagent leur cache L1 d’instructions entre plusieurs processeur de shaders, d'autres non. Mais le principe reste valide, tant qu'un cache n'est pas partagé entre tous les processeurs de shaders : un cache peut contenir une donnée invalide, à savoir qu'elle a été modifiée dans le cache d'un autre processeur de shaders. Pour corriger ce problème, les ingénieurs ont inventé des '''protocoles de cohérence des caches''' pour détecter les données périmées et les mettre à jour. Mais autant ces techniques sont faisables sur des CPU avec un nombre limité de cœurs, autant elles sont impraticables avec un GPU contenant une centaine de cœurs. Heureusement, la cohérence des caches est un problème bien moins important sur les GPU que sur les CPU. En effet, le rendu 3D implique un parallélisme de données : des processeurs/cœurs différents sont censés travailler sur des données différentes. Il est donc rare qu'une donnée soit traitée en parallèle par plusieurs cœurs, et donc qu'elle soit copiée dans plusieurs caches. En conséquence, les GPU se contentent d'une cohérence des caches assez light, gérée par le programmeur. Si jamais une opération peut mener à un problème de cohérence des caches, le programmeur doit gérer cette situation de lui-même. Pour cela, les GPU supportent des instructions machines spécialisées, qui vident les caches. Par vider les caches, on veut dire que leur contenu est rapatrié en mémoire RAM, et qu'ils sont réinitialisés. Les accès mémoire qui suivront l'invalidation trouveront un cache vide, et devront recharger leurs données depuis la RAM. Ainsi, si une lecture/écriture peut mener à un défaut de cohérence problématique, le programmeur insère une instruction qui invalide le cache, avant l'accès mémoire potentiellement problématique. Ainsi, on garantit que la donnée chargée/écrite est lue depuis la mémoire vidéo et donc qu'il s'agit d'une donnée correcte. Elle est utilisée pour supporter les techniques de ''render-to-texture'', pour dessiner l'image finale dans une texture (pour y appliquer un filtre de post-traitement, par exemple). Les opérations de ''render-to-texture'' étant assez rares, il vaut mieux ne pas rendre les caches de texture accessibles en écriture. L'invalidation du cache au besoin est alors parfaitement adapté. Les autres caches du GPU sont gérés avec le même principe. Pour les caches généralistes, certains GPU modernes commencent à implémenter des méthodes plus élaborées de cohérence des caches. {{NavChapitre | book=Les cartes graphiques | prev=Les processeurs de shader VLIW et DirectX 9 | prevText=Les processeurs de shader VLIW et DirectX 9 | next=La mémoire unifiée et la mémoire vidéo dédiée | netxText=La mémoire unifiée et la mémoire vidéo dédiée }}{{autocat}} t3hph2dsoca30jh06pslboyp7okd60g 764884 764873 2026-04-24T17:56:27Z Mewtow 31375 /* La cohérence des caches entre processeurs de shaders */ 764884 wikitext text/x-wiki Dans ce chapitre, nous allons voir comment est organisée la mémoire d'un GPU, ou plutôt devrait-on dire les mémoires d'un GPU. Eh oui : un GPU contient beaucoup de mémoires différentes. Un GPU contient évidemment une mémoire vidéo de grande taille, séparée des processeurs de shader, mais pas que. Les processeurs de shaders intègrent aussi des mémoires plus petites, appelées des mémoires caches. Les processeurs intégrent tous des caches et les processeurs de shaders ne font pas exception. Cependant, les caches d'un GPU sont quelque peu particuliers et sont organisés différemment. La hiérarchie mémoire des GPUs est assez particulière, et nous allons voir en quoi dans ce qui suit. ==Les caches spécialisés d'un GPU== Un point important est que les GPU sont dédiés au rendu 3D, et cette spécialisation se voit dans leurs mémoires caches. Les premières cartes graphiques avaient des caches spécialisés, avec des caches pour les textures, des caches de sommets, des caches pour le tampon de profondeur, etc. Ils n'avaient pas de caches généralistes, qui servent à stocker n'importe quel type de données. Les caches spécialisés étaient intégrés aux circuits fixes. Par exemple, le cache pour les textures est placé dans l'unité de texture, le cache de sommet dans l'''input assembler'', le cache du ''z-buffer'' dans les ROPs. ===Les caches de sommets=== Avant Direct X 10, les cartes graphiques avaient des caches dédiés à la géométrie, deux précisémment. Ils étaient appelés des caches de sommets, le terme étant utilisé pour les deux caches. Le premier cache mémorise des sommets qui ont été transformés/éclairés, alors que le second mémorise des sommets pas encore éclairés. Le premier cache est appelé le ''Post-transform cache'' et se situe en sortie des unités de ''vertex shader'' ou de l'unité de T&L. Le second cache s'appelle le ''Pre-transform cache'' fait partie de l'''input assembler''. [[File:Vertex cache.png|centre|vignette|upright=2.5|''Pre-transform'' et ''Post-transform cache''.]] Nous détaillerons le fonctionnement de ces caches dans le chapitre sur le pipeline géométrique, nous ne pouvons pas en dire plus pour le moment. De plus, les deux caches ont disparus sur certains GPU modernes. Le ''Pre Transform Cache'' a été remplacé par des mémoires caches généralistes, qui ne sont pas spécialisées dans les sommets. Le ''Post-transform cache'' a lieu été remplacé, en raison de la manière dont les processeurs de shaders fonctionnent. Je recommande la lecture de l'article "Revisiting The Vertex Cache : Understanding and Optimizing Vertex Processing on the modern GPU" à ce sujet. ===Le cache de textures=== Le '''cache de textures''', comme son nom l'indique, est un cache spécialisé dans les textures. Toutes les cartes graphiques modernes disposent de plusieurs unités de texture, qui disposent chacune de son ou ses propres caches de textures. Pas de cache partagé, ce serait peu utile et trop compliqué à implémenter. De plus, les cartes graphiques modernes ont plusieurs caches de texture par unité de texture. Généralement, elles ont deux caches de textures : un petit cache rapide, et un gros cache lent. Les deux caches sont fortement différents. L'un est un gros cache, qui fait dans les 4 kibioctets, et l'autre est un petit cache, faisant souvent moins d'1 kibioctet. Mais le premier est plus lent que le second. Sur d'autres cartes graphiques récentes, on trouve plus de 2 caches de textures, organisés en une hiérarchie de caches de textures similaire à la hiérarchie de cache L1, L2, L3 des processeurs modernes. Notons que ce cache interagit avec les techniques de compression de texture. Les textures sont en effet des images, qui sont donc compressées. Et elles restent compressées en mémoire vidéo, car les textures décompressées prennent beaucoup plus de place, entre 5 à 8 fois plus. Les textures sont décompressées lors des lectures : le processeur de shaders charge quelques octets, les décompresse, et utilise les données décompressées ensuite. Le cache s'introduit quelque part avant ou après la décompression. On peut décompresser les textures avant de les placer dans le cache, ou laisser les textures compressées dans le cache. Tout est une question de compromis. Décompresser les textures dans le cache fait que la lecture dans le cache est plus rapide, car elle n'implique pas de décompression, mais le cache contient moins de données. À l'inverse, compresser les textures permet de charger plus de données dans le cache, mais rend les lectures légèrement plus lentes. C'est souvent la seconde solution qui est utilisée et ce pour deux raisons. Premièrement, la compression de texture est terriblement efficace, souvent capable de diviser par 6 la taille d'une texture, ce qui augmente drastiquement la taille effective du cache. Deuxièmement, les circuits de décompression sont généralement très rapides, très simples, et n'ajoutent que 1 à 3 cycles d'horloge lors d'une lecture. Les anciens jeux vidéo ne faisaient que lire les textures, sans les modifier. Aussi, le cache de texture des cartes graphiques anciennes est seulement accessible en lecture, pas en écriture. Cela simplifiait fortement les circuits du cache, réduisant le nombre de transistors utilisés par le cache, réduisant sa consommation énergétique, augmentait sa rapidité, etc. Mais les jeux vidéos 3D récents utilisent des techniques dites de ''render-to-texture'', qui permettent de calculer certaines données et à les écrire en mémoire vidéo pour une utilisation ultérieure. Les textures peuvent donc être modifiées et cela se marie mal avec un cache en lecture seule. Rendre le cache de texture accessible en écriture est une solution, mais qui demande d'ajouter beaucoup de circuits pour une utilisation somme toute peu fréquente. Une autre solution, plus adaptée, réinitialise le cache de textures quand on modifie une texture, que ce soit totalement ou partiellement. Une fois le cache vidé, les accès mémoire ultérieurs n'ont pas d'autre choix que d'aller lire la texture en mémoire et de remplir le cache avec les données chargées depuis la RAM. Les données de texture en RAM étant les bonnes, cela garantit l’absence d'erreur. : Ces deux techniques peuvent être adaptées dans le cas où plusieurs caches de textures séparées existent sur une même carte graphique. Les écritures doivent invalider toutes les copies dans tous les caches de texture. Cela nécessite d'ajouter des circuits qui propagent l'invalidation dans tous les autres caches. ===Les caches de constante=== Un shader a besoin de certaines "constantes" pour faire son travail. Les constantes en question sont d'accès peu fréquent, qui se limite souvent à un accès au début de chaque instance de shader, guère plus. Au premier abord, dédier un cache à de telles constantes ne parait pas très utile, vu qu'elles ne semblent pas réutilisées. Mais c'est oublier un point important : toutes les instances du shader manipulent ces constantes, et il y en a souvent plusieurs qui s'exéceutn à tour de rôle, si ce n'est en même temps ! Pour profiter du partage des constantes entre instances d'un shader, les GPU incorporent des '''caches de constantes'''. Ainsi, quand un shader lit une donnée, elle est chargée dans le cache de constante, ce qui fait que les autres instances liront ces constantes depuis le cache et non depuis la VRAM. Les caches de constante sont séparés des autres caches de données, car ce sont des données peu fréquemment utilisées, qui sont censées être évincées en priorité du cache de données, qui privilégie les données fréquemment lues/écrites. Avec un cache séparé, les constantes restent dans le cache. Au passage, ce cache de constante a des chances d'être partagé entre plusieurs cœurs, des cœurs différents ayant de fortes chances d’exécuter des instances différentes d'un même shader. ==Les caches généralistes== Les GPUs récents contiennent des caches généralistes, qui ne sont spécialisés dans le rendu graphique. Leur existence se justifie par le fait que les GPU sont de plus en plus utilisés pour du calcul généraliste (scientifique, notamment), à savoir qu'ils exécutent des ''compute shaders'' qui manipulent des données arbitraires. Et de tels ''compute shaders'' sont parfois utilisés pour du rendu 3D, pour exécuter des algorithmes d'élimination des pixels cachés, ou des algorithmes de rendu assez complexes. Les caches généralistes des GPU modernes ressemblent à ceux des CPU, avec une hiérarchie de caches. Pour rappel, les processeurs multicœurs modernes ont souvent trois à quatre niveaux de caches, appelés les caches L1, L2, L3 et éventuellement L4. Les GPU ont une organisation similaire, sauf que le nombre de cœurs est beaucoup plus grand que sur un processeur moderne. * Pour le premier niveau, on a deux caches L1 par cœur/processeur : un cache pour les instructions et un cache pour les données. * Pour le second niveau, on a un cache L2 qui peut stocker indifféremment données et instruction et qui est partagé entre plusieurs cœurs/processeurs. * Le cache L3 est un cache partagé entre tous les cœurs/processeurs. [[File:Partage des caches sur un processeur multicoeurs.png|centre|vignette|upright=2|Partage des caches sur un processeur multicoeurs]] ===Les caches d'instruction=== Les caches d'instruction des GPU sont adaptés aux contraintes du rendu 3D. Le principe du rendu 3D est d'appliquer un shader assez simple sur un grand nombre de données. Les shaders sont donc des programmes assez légers, qui ont peu d'instructions. Les caches d'instructions des GPU sont généralement assez petits, quelques dizaines ou centaines de kilooctets. Et malgré cela, il n'est pas rare qu'un ''shader'' tienne tout entier dans le cache d'instruction. La seconde caractéristique est qu'un même programme s’exécute sur beaucoup de données. Il n'est pas rare que plusieurs processeurs de shaders exécutent le même ''shader''. Aussi, certains GPU partagent un même cache d’instruction entre plusieurs processeurs de ''shader'', comme c'est le cas sur les GPU AMD d'architecture GCN où un cache d'instruction de 32 kB est partagé entre 4 cœurs. ===Les caches de données=== Pour les caches de données, il faut savoir qu'un shader a peu de chances de réutiliser une donnée qu'il a chargé précédemment. Les processeurs de shaders ont beaucoup de registres, ce qui fait que si accès ultérieur à une donnée il doit y avoir, elle passe généralement par les registres. Cette faible réutilisation fait que les caches de données ne sont pas censé être très utiles. Il y a cependant des exceptions, qui expliquent que les cartes graphiques incorporent un cache de texture et un cache de sommet (pour le tampon de sommet). Il faut noter que sur la plupart des cartes graphiques modernes, les caches de données et le cache de texture sont un seul et même cache. Même chose pour le cache de sommets, utilisé par les unités géométrique, qui est fusionné avec les caches de données. La raison est que une économie de circuits qui ne coute pas grand chose en termes de performance. Rappelons que les processeurs de shaders sont unifiés à l'heure actuelle, c'est à dire qu'elles peuvent exécuter pixel shader et vertex shader. Au lieu d'incorporer un cache de sommets et un cache de textures, autant utiliser un seul cache qui sert alternativement de cache de vertex et de cache de texture, afin d'économiser des circuits. ==La mémoire partagée : un ''local store''== En plus d'utiliser des caches, les GPU modernes utilisent des ''local stores'', aussi appelés ''scratchpad memories''. Ce sont des mémoires RAM intermédiaires entre la RAM principale et les registres. Ces local stores peuvent être vus comme des caches, mais que le programmeur doit gérer manuellement. Dans la réalité, ce sont des mémoires RAM très rapides mais de petite taille, qui sont adressées comme n'importe quelle mémoire RAM, en utilisant des adresses directement. [[File:Scratch-Pad-Memory.jpg|centre|vignette|upright=2.0|Scratch-Pad-Memory (SPM).]] Sur les GPU modernes, chaque processeur de ''shader'' possède un unique ''local store'', appelée la '''mémoire partagée'''. Il n'y a pas de hiérarchie des ''local store'', similaire à la hiérarchie des caches. <noinclude>[[File:Cuda5.png|centre|vignette|upright=2.0|Local stores d'un GPU.]]</noinclude> La faible capacité de ces mémoires, tout du moins comparé à la grande taille de la mémoire vidéo, les rend utile pour stocker temporairement des résultats de calcul "peu imposants". L'utilité principale est donc de réduire le trafic avec la mémoire centrale, les écritures de résultats temporaires étant redirigés vers les local stores. Ils sont surtout utilisés hors du rendu 3D, pour les applications de type GPGPU, où le GPU est utilisé comme architecture multicœurs pour du calcul scientifique. ===L'implémentation des ''local store''=== Vous vous attendez certainement à ce que je dise que les ''local store'' sont des mémoires séparées des mémoires caches et qu'il y a réellement des puces de mémoire RAM distinctes dans les processeurs de ''shaders''. Mais en réalité, ce n'est pas le cas pour tous les ''local store''. Le dernier niveau de ''local store'', la mémoire partagée, est bel et bien une mémoire SRAM à part des autres, avec ses propres circuits. Mais les cartes graphiques très récentes fusionnent la mémoire locale avec le cache L1. L'avantage est une économie de transistors assez importante. De plus, cette technologie permet de partitionner le cache/''local store'' suivant les besoins. Par exemple, si la moitié du ''local store'' est utilisé, l'autre moitié peut servir de cache L1. Si le ''local store'' n'est pas utilisé, comme c'est le cas pour la majorité des rendu 3D, le cache/''local store'' est utilisé intégralement comme cache L1. Et si vous vous demandez comment c'est possible de fusionner un cache et une mémoire RAM, voici comment le tout est implémenté. L'implémentation consiste à couper le cache en deux circuits, dont l'un est un ''local store'', et l'autre transforme le ''local store'' en cache. Ce genre de cache séparé en deux mémoires est appelé un ''phased cache'', pour ceux qui veulent en savoir plus, et ce genre de cache est parfois utilisés sur les processeurs modernes, dans des processeurs dédiés à l'embarqué ou pour certaines applications spécifiques. Le premier circuit vérifie la présence des données à lire/écrire dans le cache. Lors d'un accès mémoire, il reçoit l'adresse mémoire à lire, et détermine si une copie de la donnée associée est dans le cache ou non. Pour cela, il utilise un système de tags qu'on ne détaillera pas ici, mais qui donne son nom à l'unité de vérification : l''''unité de tag'''. Son implémentation est très variable suivant le cache considéré, mais une simple mémoire RAM suffit généralement. En plus de l'unité de tags, il y a une mémoire qui stocke les données, la mémoire cache proprement dite. Par simplicité, cette mémoire est une simple mémoire RAM adressable avec des adresses mémoires des plus normales, chaque ligne de cache correspondant à une adresse. La mémoire RAM de données en question n'est autre que le ''local store''. En clair, le cache s'obtient en combinant un ''local store'' avec un circuit qui s'occupe de vérifier de vérifier les succès ou défaut de cache, et qui éventuellement identifie la position de la donnée dans le cache. [[File:Phased cache.png|centre|vignette|upright=1.5|Phased cache]] Pour que le tout puisse servir alternativement de ''local store'' ou de cache, on doit contourner ou non l'unité de tags. Lors d'un accès au cache, on envoie l'adresse à lire/écrire à l'unité de tags. Lors d'un accès au ''local store'', on envoie l'adresse directement sur la mémoire RAM de données, sans intervention de l'unité de tags. Le contournement est d'autant plus simple que les adresses pour le ''local store'' sont distinctes des adresses de la mémoire vidéo, les espaces d'adressage ne sont pas les mêmes, les instructions utilisées pour lire/écrire dans ces deux mémoires sont aussi potentiellement différentes. [[File:Hydride cache - local store.png|centre|vignette|upright=2.0|Hydride cache - local store]] Il faut préciser que cette organisation en ''phased cache'' est assez naturelle. Les caches de texture utilisent cette organisation pour diverses raisons. Vu que cache L1 et cache de texture sont le même cache, il est naturel que les caches L1 et autres aient suivi le mouvement en conservant la même organisation. La transformation du cache L1 en hydride cache/''local store'' était donc assez simple à implémenter et s'est donc faite facilement. ==La cohérence des caches sur un GPU== Pour terminer ce chapitre, nous allons parler de la '''cohérence des caches'''. La cohérence des caches est un problème qui se manifeste à plusieurs niveaux, quand on parle d'un GPU : entre CPU et GPU, ou entre processeurs de shaders. Nous allons voir les deux cas l'un après l'autre. ===La cohérence des caches pour les transferts DMA=== Supposons que le CPU ait transféré les données dans la mémoire vidéo, avec un transfert DMA. Une situation bien précise pose problème : quand un transfert DMA écrase des données devenues inutiles, pour les remplacer par des données utiles. C'est très fréquent, les pilotes graphiques libèrent souvent de la mémoire vidéo pour la réallouer immédiatement après, afin de ne pas gaspiller de VRAM. Sans intervention du GPU, le remplacement des données aura été fait en mémoire vidéo, pas dans les caches du GPU. Et tout accès ultérieur au cache renverra la donnée écrasée. [[File:Cache incoherence write.svg|centre|vignette|upright=2|Cohérence des caches avec DMA.]] Pour éviter cela, le GPU invalide ses caches en cas de transfert DMA. Par invalider, on veut dire que le cache est réinitialisé, mis à zéro, il est rendu vierge de toute donnée. Ainsi, tout accès mémoire ultérieur se fera en mémoire RAM sans passer par le cache. Les données lues depuis la RAM seront ensuite copiées dans le cache, mais ce seront les données valides écrites après le transfert DMA. Le contenu du cache est alors reconstitué au fur et à mesure des accès mémoire. L'invalidation est automatique sur les anciens GPU, elle est réalisée par le processeur de commande. Sur les GPU modernes, elle est réalisée par le programmeur, comme on va le voir dans la section immédiatement suivante. ===La cohérence des caches entre CPU et GPU=== Dans ce qui suit, on suppose qu'il n'y a qu'une seule mémoire RAM, qui est partagée entre CPU et GPU, et sert à la fois de RAM et de mémoire vidéo. Il s'agit de ce que l'on appelle la mémoire unifiée. Elle est utilisée dans de nombreuses consoles de jeu, mais aussi avec les GPU intégrés, qui sont dans le processeur. La mémoire unifiée n'implique pas de transfert DMA entre CPU et GPU, vu qu'il n'y a qu'une seule RAM. Par contre, un problème différent du précédent peut survenir. Le processeur n'écrit pas directement en mémoire RAM, mais dans son cache. Les écritures sont propagées en RAM avec un certain retard, quand les données sont évincées du cache pour faire de la place à de nouvelles données. Et même quand elles sont propagées en RAM, les écritures ne sont pas propagées dans les caches du GPU. Pour corriger cela, lorsque le processeur envoie des données au GPU, il force le GPU à invalider ses caches. Il envoie une commande dédiée pour, qui précède les commandes liées au rendu 2D/3D/autres. [[File:Cohérence des caches entre CPU et GPU avec mémoire unifiée.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU avec mémoire unifiée]] Au niveau du processeur, le processeur doit écrire les données dans la mémoire RAM, avant de faire le transfert DMA. Mais la présence de caches pose problème : les écritures peuvent être interceptées par le cache et ne pas être propagées en RAM. Pour éviter cela, les processeurs modernes marquent des blocs de mémoire comme "non-cacheables", à savoir que toute lecture/écriture dedans se fait sans passer par le cache. C'est une fonctionnalité très importante pour communiquer avec les périphériques. Pour les GPU dédiés/soudés, cela a un lien avec la mémoire vidéo mappée en mémoire. Plus haut, nous avions dit que la mémoire vidéo est visible dans l'espace d'adressage du processeur, à savoir qu'un bloc de mémoire est détourné pour adresser non pas la RAM, mais la mémoire vidéo. Et bien ce bloc de mémoire entier est marqué comme étant non-cacheable. [[File:Cohérence des caches entre CPU et GPU avec mémoire unifiée, mécanismes.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU avec mémoire unifiée, mécanismes]] La situation peut être optimisée sur les GPU intégrés. Si le GPU est conçu pour, il n'y a pas besoin de marquer les données comme non-cacheables. Le cas le plus simple est celui où le CPU et le GPU partagent leur cache L3/L4. Dans ce cas, il n'y a qu'un seul cache L3/L4 qui ne contient qu'une seule copie valide, écrite par le CPU et lue par le GPU. Il faut juste garantir que la donnée soit lue par le GPU depuis le L3, mais c'est là une question d'inclusivité du cache, qui ne nous concerne pas ici. Si le CPU et le GPU ne partagent pas de cache, il suffit que le GPU puisse lire les caches du CPU. C'est la méthode utilisée sur l'APU Trinity d'AMD. [[File:Cohérence des caches entre CPU et GPU intégré.png|centre|vignette|upright=2|Cohérence des caches entre CPU et GPU intégré]] ===La cohérence des caches entre processeurs de shaders=== Pour terminer, il faut voir la cohérence des caches entre processeurs de shaders. Une carte graphique moderne est, pour simplifier, un gros processeur multicœurs auquel on aurait rajouté des ROPs, les circuits de la rastérisation et les unités de textures. Il n'est donc pas étonnant que les problèmes rencontrés sur les processeurs multicœurs soient aussi présents sur les GPU, la cohérence des caches ne fait pas exception. Pour simplifier les explications, nous allons partir du principe que chaque processeur de shaders a son propre cache de données. Prenons deux processeur de shaders qui ont chacun une copie d'une donnée dans leur cache. Si un processeur de shaders modifie sa copie de la donnée, l'autre ne sera pas mise à jour. L'autre processeur manipule donc une donnée périmée : il n'y a pas cohérence des caches. [[File:Cohérence des caches.png|centre|vignette|upright=2|Cohérence des caches]] La réalité est cependant plus complexe, dans le sens où il n'y a souvent pas un cache par processeur de shaders, mais une hiérarchie de cache assez complexe, avec un cache L1 par processeur de shaders, un cache L2 partagé entre plusieurs processeur de shaders, des caches partagés entre tous les processeur de shaders, etc. Certains GPU partagent leur cache L1 d’instructions entre plusieurs processeur de shaders, d'autres non. Mais le principe reste valide, tant qu'un cache n'est pas partagé entre tous les processeurs de shaders : un cache peut contenir une donnée invalide, à savoir qu'elle a été modifiée dans le cache d'un autre processeur de shaders. Pour corriger ce problème, les ingénieurs ont inventé des '''protocoles de cohérence des caches''' pour détecter les données périmées et les mettre à jour. Mais autant ces techniques sont faisables sur des CPU avec un nombre limité de cœurs, autant elles sont impraticables avec un GPU contenant une centaine de cœurs. Heureusement, la cohérence des caches est un problème bien moins important sur les GPU que sur les CPU. En effet, le rendu 3D implique un parallélisme de données : des processeurs/cœurs différents sont censés travailler sur des données différentes. Il est donc rare qu'une donnée soit traitée en parallèle par plusieurs cœurs, et donc qu'elle soit copiée dans plusieurs caches. En conséquence, les GPU se contentent d'une cohérence des caches assez light, gérée par le programmeur. Si jamais une opération peut mener à un problème de cohérence des caches, le programmeur doit gérer cette situation de lui-même. Pour cela, les GPU supportent des instructions machines spécialisées, qui vident les caches. Par vider les caches, on veut dire que leur contenu est rapatrié en mémoire RAM, et qu'ils sont réinitialisés. Les accès mémoire qui suivront l'invalidation trouveront un cache vide, et devront recharger leurs données depuis la RAM. Ainsi, si une lecture/écriture peut mener à un défaut de cohérence problématique, le programmeur insère une instruction qui invalide le cache, avant l'accès mémoire potentiellement problématique. Ainsi, on garantit que la donnée chargée/écrite est lue depuis la mémoire vidéo et donc qu'il s'agit d'une donnée correcte. Elle est utilisée pour supporter les techniques de ''render-to-texture'', pour dessiner l'image finale dans une texture (pour y appliquer un filtre de post-traitement, par exemple). Les opérations de ''render-to-texture'' étant assez rares, il vaut mieux ne pas rendre les caches de texture accessibles en écriture. L'invalidation du cache au besoin est alors parfaitement adapté. Les autres caches du GPU sont gérés avec le même principe. Pour les caches généralistes, certains GPU modernes commencent à implémenter des méthodes plus élaborées de cohérence des caches. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les processeurs de shader VLIW et DirectX 9 | prevText=Les processeurs de shader VLIW et DirectX 9 | next=La mémoire unifiée et la mémoire vidéo dédiée | netxText=La mémoire unifiée et la mémoire vidéo dédiée }}{{autocat}} </noinclude> 5el0nxxh2yi1hmmbzljltnkcps9mpay Les cartes graphiques/L'antialiasing 0 78165 764894 763488 2026-04-24T17:58:53Z Mewtow 31375 /* Les différentes méthodes d'antialiasing par post-processing */ 764894 wikitext text/x-wiki [[File:Anti-aliasing demo.svg|vignette|upright=0.5|Effet d'escalier sur les lignes.]] L'antialiasing est une technologie qui permet d'adoucir les bords des objets. Le fait est que dans les jeux vidéos, les bords des objets sont souvent pixelisés, ce qui leur donne un effet d'escalier illustré ci-contre. Le filtre d'antialiasing rajoute une sorte de dégradé pour adoucir les bords des lignes. Il existe un grand nombre de techniques d'antialiasing différentes. Toutes ont des avantages et des inconvénients en termes de performances ou de qualité d'image. ==Le ''Super-Sampling Anti-Aliasing''== La plus simple de ces techniques, le SSAA - '''Super Sampling Anti Aliasing''' - calcule l'image à une résolution supérieure, avant de la réduire. Par exemple, pour rendre une image en 1280 × 1024 en antialiasing 4x, la carte graphique calcule une image en 2560 × 2048, avant de la réduire. Cette technique filtre toute l'image, y compris l'intérieur des textures, mais augmente la consommation de mémoire vidéo et de processeur (on calcule 2, 4, 8, 16 fois plus de pixels). Si vous regardez les options de vos pilotes de carte graphique, vous verrez qu'il existe plusieurs réglages pour l'antialiasing : 2X, 4X, 8X, etc. Cette option signifie que l'image calculé par la carte graphique contient respectivement 2, 4, ou 8 fois plus de pixels que l'image originale. ===L'étape de ''downscaling''=== Le rendu de l'image se fait à une résolution 2, 4, 8, 16 fois plus grande. La résolution n'apparait qu'après le rastériseur, et impacte tout le reste du pipeline à sa suite : pixel shaders, unités de textures et ROP. Le rastériseur produit 2, 4, 8, 16 fois plus de pixels, les unités de textures vont 2, 4, 8, 16 fois plus de travail, idem pour les pixels shaders. Par contre, la réduction de l'image s'effectue avec une seconde passe. Pour effectuer la réduction de l'image, le ROP découpe l'image en rectangles de 2, 4, 8, 16 pixels, et « mélange » les pixels pour obtenir une couleur uniforme. Ce « mélange » est généralement une simple moyenne pondérée, mais on peut aussi utiliser des calculs plus compliqués comme une série d'interpolations linéaires similaire à ce qu'on fait pour filtrer des textures. Pour simplifier les explications, nous allons appeler "sous-pixels" les pixels de l'image rendue dans le pipeline, et pixels les pixels de l'image finale écrite dans le ''framebuffer''. On parle aussi de '''''samples''''' au lieu de sous-pixels. {| |[[File:Supersampling.svg|vignette|Supersampling]] |[[File:Supersampling.png|vignette|Supersampling]] |} ===La position des sous-pixels=== Un point important concernant la qualité de l'antialiasing concerne la position des sous-pixels sur l'écran. Comme vous l'avez vu dans le chapitre sur la rastérisation, notre écran peut être vu comme une sorte de carré, dans lequel on peut repérer des points. Reste que l'on peut placer ces pixels n'importe où sur l'écran, et pas forcément à des positions que les pixels occupent réellement sur l'écran. Pour des pixels, il n'y a aucun intérêt à faire cela, sinon à dégrader l'image. Mais pour des sous-pixels, cela change tout. Toute la problématique peut se résumer en une phrase : où placer nos sous-pixels pour obtenir une meilleure qualité d'image possible. * La solution la plus simple consiste à placer nos sous-pixels à l'endroit qu'ils occuperaient si l'image était réellement rendue avec la résolution simulée par l'antialiasing. Cette solution gère mal les lignes pentues, le pire cas étant les lignes penchées de 45 degrés par rapport à l'horizontale ou la verticale. * Pour mieux gérer les bords penchés, on peut positionner nos sous-pixels comme suit. Les sous-pixels sont placés sur un carré penché (ou sur une ligne si l'on dispose seulement de deux sous-pixels). Des mesures expérimentales montrent que la qualité optimale semble être obtenue avec un angle de rotation d'arctan(1/2) (26,6 degrés), et d'un facteur de rétrécissement de √5/2. * D'autres dispositions sont possibles, notamment une disposition de type Quincunx. <gallery widths="150px" heights="150px"> Supersampling - Uniform.svg|Antialiasing uniforme. Supersampling - RGSS.svg|Antialiasing à grille tournée. Supersampling - Quincunx.svg|Antialiasing Quincunx. </gallery> ==Le multisampling (MSAA)== Le '''Multi-Sampling Anti-Aliasing, abrévié en MSAA''' est une amélioration du SSAA qui économise certains calculs. Pour simplifier, c'est la même chose que le SSAA, sauf que les pixels shaders ne calculent pas l'image à une résolution supérieure, alors que tout le reste (rastérisation, ROP) le fait. Avec le MSAA, l'image à afficher est rendue dans une résolution supérieure, mais les fragments sont regroupés en carrés qui correspondent à un pixel. L'application des textures se fait par pixel et non pour chaque sous-pixel, de même que le pixel shader manipule des pixels, mais ne traite pas les sous-pixels. Avec le SSAA, chaque sous-pixel se verrait appliquer un morceau de texture et un pixel shader, alors qu'on applique la texture sur un pixel complet avec le MSAA. Le calcul de la couleur finale du pixel se fait dans le ROP. Pour cela, le ROP a besoin d'une information quant à la position des sous-pixels. Le pixel final est associé à un triangle précis par la rastérisation. Cependant, cela ne signifie pas que tous les sous-pixels sont associés à ce triangle. En effet, les sous-pixels ne sont pas à la même place que le pixel dans la résolution inférieure. La position des sous-pixels est une chose dont nous parlerons plus en détail ci-dessous. Toujours est-il que l'étape de rastérisation précise si chaque sous-pixel est associé au triangle du pixel. Il se peut que tous les sous-pixels soient sur le triangle, ce qui est signe qu'on est pile sur l'objet, que les sous-pixels sont tous l'intérieur du triangle. Par contre, si certains sous-pixels sont en dehors, c'est signe que l'on est au bord d'un objet. Par exemple, le sous-pixel le plus à gauche sort du triangle, alors que les autres sont dessus. L'unité de rastérisation calcule un '''masque de couverture''', qui précise, pour chaque pixel, quels sont les sous-pixels qui sont ou non dans le triangle. Si un pixel est composé de N sous-pixels, alors ces N sous-pixels sont numérotés de 0 à N-1 en passant dans l'ordre des aiguilles d'une montre. Le masque est un nombre dont chaque bit est associé à un sous-pixel. Le bit associé est à 1 si le sous-pixel est dans le triangle, 0 sinon. Une fois calculé par l'unité de rastérisation, le masque de couverture est transmis aux pixels shaders. Les pixels shaders peuvent utiliser le masque de couverture pour certaines techniques de rendu, mais ce n'est pas une nécessité. Dans la plupart des cas, les pixels shaders ne font rien avec le masque de couverture et le passent tel quel aux ROP. Le ROP prend la couleur calculée par le pixel shader et le masque de couverture. Si un sous-pixel est complétement dans le triangle, sa couleur est celle de la texture. Si le sous-pixel est en dehors du triangle, sa couleur est mise à zéro. Le ROP fait la moyenne des couleurs des sous-pixels du bloc comme avec le SSAA. La seule différence avec le SSAA, c'est que la couleur du pixel calculée par le pixel shader est juste pondérée par le nombre de sous-pixels dans le triangle. Le résultat est que le MSAA ne filtre pas toute l'image, mais seulement les bords des objets, seuls endroit où l'effet d'escalier se fait sentir. ===Les avantages et inconvénients comparé au SSAA=== Niveau avantages, le MSAA n'utilise qu'un seul filtrage de texture par pixel, et non par sous-pixel comme avec le SSAA, ce qui est un gain en performance notable. Le gain en calculs niveau pixel shader est aussi très important, tant que les techniques de rendu utilisant le masque de couverture ne sont pas utilisées. Le gain est d'autant plus important que la majorité des pixels sont situés en plein dans un triangle, les bords d'un objet ne concernant qu'une minorité de pixels/sous-pixels. Mais ce gain en performance a un revers : la qualité de l'antialiasing est moindre. Par définition, le MSAA ne filtre pas l'intérieur des textures, mais seulement les bords des objets. Un défaut de cette technique est que la texture est plaquée au centre du pixel testé. Or, il se peut que le centre du pixel ne soit pas dans la primitive, ce qui arrive si la primitive ne recouvre qu'une petite partie du pixel. Dans un cas pareil, le pixel n'aurait pas été associé à la primitive sans antialiasing, mais il l'est quand l'antialiasing est activé. Un défaut est donc que la texture est appliquée là où elle ne devrait pas l'être. Le résultat est l'apparition d'artefacts graphiques assez légers, mais visibles sur certaines images. Une solution est d'altérer la position des sous-pixels sur le bord des objets pour qu'ils soient dans la primitive. Les sous-pixels sont alors disposés suivant un motif dit centroïde, où tous les sous-pixels sont déplacés de manière à être dans la primitive. Mais un défaut est que les dérivées, le niveau de détail et d'autres données nécessaires au plaquage de texture sont elles aussi altérées, ce qui peut gêner le filtrage de texture. Un autre problème de l'antialiasing tient dans la gestion des textures transparentes, que nous allons détailler dans la section suivante. ===L'antialiasing sur les textures transparentes=== Pour les textures partiellement transparentes, l’antialiasing de type MSAA ne donne pas de bons résultats. Les textures partiellement transparentes servent à rendre des feuillages, des grillages, ou d'autres objets du genre. Prenons l'exemple d'un grillage. La texture de grillage est posée sur une surface carrée, les portions transparentes de la texture correspondant aux trous du grillage entre les grilles, et les portions opaques au grillage lui-même. Dans ce cas, les portions transparentes sont situées dans l'objet et ne sont pas antialiasées. Pourtant, un grillage ou un feuillage sont l'exemple type d'objets où l'effet d’escalier se manifeste. Le problème est surtout visible sur les textures rendues avec la technique de l'''alpha-testing'', où un pixel shader abandonne le rendu d'un pixel si sa transparence dépasse un certain seuil. Les pixels sont coloriés avec une texture, et les pixels trop transparents ne sont pas rendus, alors que les autres pixels sont rendus normalement, avec ''alpha-blending'' dans les ROP et autres. Tout cela a poussé les fabricants de cartes graphiques à inventer diverses techniques pour appliquer l'antialiasing à l'intérieur des textures transparentes. L'idée la plus simple pour cela est d'appliquer le MSAA sur toute l'image, mais de passer en mode SSAA pour les portions de l'image où on a une texture transparente. Le SSAA n'a pas de problèmes pour filtrer l'intérieur des textures, là où le MSAA ne filtre pas l'intérieur des textures. Cela demande cependant de détecter les textures transparentes au niveau du pixel shader, et de les rendre à plus haute résolution façon SSAA. Cette technique a été utilisée sur les cartes NVIDIA sous le nom de ''transparency adaptive anti-aliasing'' (TAAA) et sur les cartes AMD sous le nom d'''adaptive anti-aliasing''. Une autre méthode est la technique dite d''''''alpha to coverage''''', abrévié ATC. Son principe s'explique assez bien en comparant ce qu'on a avec ou sans ATC. Imaginons qu'un pixel soit colorié avec une texture transparente, sans ATC : le pixel se voit attribuer une composante alpha provenant de la texture transparente et passe le test alpha pour savoir s'il doit être rendu avant ou non. Avec ATC, le pixel shader génère un masque de couverture à partir de la composante alpha de la texture lue. Le masque de couverture ainsi généré est alors utilisé par les ROP et le reste du pipeline pour faire l'antialiasing. Cela garantit que les textures transparentes soient antialiasées. ===Les optimisations du ''multisampling''=== Avec l'antialiasing, l'image est rendue à une résolution supérieure, avant de subir un redimensionnement pour rentrer dans la résolution voulue. Cela a des conséquences sur le ''framebuffer''. Le ''framebuffer'' a la taille nécessaire pour la résolution finale, cela ne change pas. Mais le z-buffer et les autres tampons utilisés par le ROP sont agrandis, afin de rendre l'image de résolution supérieure. De plus, le rendu de l'image intermédiaire à haute résolution se fait dans une sorte de pseudo-''framebuffer'' temporaire. L'antialiasing rend l'image de haute résolution dans ce ''framebuffer'' temporaire, puis la redimensionne pour donner l'image finale dans le ''framebuffer'' final. Si on prend un antialiasing 4x, soit avec 4 fois plus de pixels que la résolution initiale, le z-buffer prend 4 fois plus de place, le ''framebuffer'' temporaire aussi. Évidemment, cela prend beaucoup de mémoire vidéo, sans compter que rendre une image à une résolution supérieure prend beaucoup de bande passante, et diverses optimisations ont été inventées pour limiter la casse. Avec le multisampling, il n'est pas rare que plusieurs sous-pixels aient la même couleur. Autant les pixels situés sur les bords d'un objet/triangle ont tendance à avoir des sous-pixels de couleurs différentes, autant les pixels situés à l'intérieur d'un objet sont de couleur uniforme. Cela permet une certaine forme d'optimisation, qui vise à tenir compte de ce cas particulier. L'idée est de compresser le ''framebuffer'' de manière ne pas mémoriser la couleur de chaque sous-pixel pour un pixel uniforme. Au lieu d'écrire quatre couleurs identiques pour 4 sous-pixels, on écrit une seule fois la couleur pour le pixel entier. Notons cependant qu'il existe un type de GPU pour lesquels ce genre d'optimisation n'est pas nécessaire. Rappelez-vous qu'il existe deux types de GPU : ceux en mode immédiat, sujet de ce cours, et ceux en rendu à tile. Avec ces derniers, l'écran est découpé en tiles qui sont rendues séparément, soit l'une après l'autre, soit en parallèle. Le traitement d'une tile fait que l'on n'a pas besoin d'un z-buffer pour toute l'image, mais d'un z-buffer par tile. Même chose pour le ''framebuffer'' temporaire, qui doit mémoriser la tile, pas plus. Les deux sont tellement petits qu'ils peuvent être mémorisés dans une SRAM intégrée au GPU, et non en mémoire vidéo. L'antialiasing est donc réalisé intégralement dans la SRAM intégrée au GPU, sans passer par la mémoire vidéo. ==Le ''Coverage Sampled Anti-Aliasing'' (CSAA) et de ''Enhanced Quality Anti-Aliasing'' (EQAA)== Les techniques de ''multisampling'' précédentes rendaient l’image à une résolution supérieure, sauf dans les pixels shaders et l'étape de plaquage de textures. Mais la résolution supérieure était la même dans tous les pipeline de la carte graphique. Des techniques améliorées partent du même principe que le ''multisampling'', mais changent la résolution suivant les étapes du pipeline. Concrètement, la résolution utilisée par le rastériseur n'est pas la même que dans les pixels shaders/textures, qui elle-même n'est pas la même que dans le z-buffer, qui n'est pas la même que celle du ''framebuffer'' temporaire, etc. C'est le principe des techniques de '''''Coverage Sampled Anti-Aliasing''''' (CSAA) et de '''''Enhanced Quality Anti-Aliasing''''' (EQAA). ===Un nombre de sous-pixel par pixel qui varie suivant l'étape du pipeline=== Au lieu d'utiliser la résolution, nous allons utiliser le nombre de sous-pixels par pixel. Pour le dire autrement, on peut avoir 16 sous-pixels par pixel en sortie du rastériseur, mais 8 sous-pixels par pixel pour le masque de couverture, puis 4 sous-pixels pour le ''z-buffer'' et le ''framebuffer''. Nous allons donner 4 caractéristiques : * le nombre de sous-pixels par pixel en sortie de la rastérisation ; * le nombre de sous-pixels traités par le pixel shader et/ou le plaquage de textures ; * le nombre de sous-pixels par pixel dans le tampon de profondeur ; * le nombre de sous-pixels par pixel dans le ''color buffer'', le ''framebuffer'' temporaire. Ces 5 paramètres seront notés respectivement RSS, SSS, DSS, CSS et CCS. {|class="wikitable" |- ! Mode d'AA ! RSS ! SSS ! DSS ! CSS |- ! Supersampling 8x | 8 || 8 || 8 || 8 |- ! Multisampling 8x | 8 || 1 || 8 || 8 |- ! Coverage Sampled Antialiasing 8x | 8 || 1 || 4 || 4 |- ! Coverage Sampled Antialiasing 16x | 16 || 1 || 4 || 16 |- ! Coverage Sampled Antialiasing 16xQ | 16 || 1 || 8 || 16 |- ! Enhanced Quality Antialiasing 2f4x | 4 || 1 || 2 || 4 |- ! Enhanced Quality Antialiasing 4f8x | 8 || 1 || 4 || 8 |- ! Enhanced Quality Antialiasing 4f16x | 16 || 1 || 4 || 16 |- ! Enhanced Quality Antialiasing 8f16x | 16 || 1 || 8 || 16 |} En général, si on omet l'étape de pixel shading, la résolution diminue au fur et à mesure qu'on progresse dans le pipeline. La résolution est maximale en sortie du rastériseur et elle diminue ou reste constante à chaque étape suivante. Elle reste constante pour le ''multisampling'' pur, mais diminue dans les autres techniques. Ces dernières fusionnent plusieurs sous-pixels rastérisés en plus gros sous-pixels, qui eux sont stockés dans le ''framebuffer'' et le tampon de profondeur. ===La compression du ''framebuffer'' temporaire=== De plus, ces techniques utilisent des techniques de compression similaires à celles utilisées pour les textures sont aussi utilisées. L'idée est simple : il est rare que tous les sous-pixels aient chacun une couleur différente. Prenons par exemple le cas d'un antialiasing 4x, donc un groupe de 4 sous-pixels par pixel : deux sous-pixels vont avoir la même couleur, les deux auront une autre couleur. Dans ce cas, pas besoin de mémoriser 4 couleurs : on a juste à mémoriser deux couleurs et un tableau de 4 bits qui précise quelle pixel a telle couleur (0 pour la première couleur, 1 pour l'autre). On peut adapter la technique avec un nombre plus élevé de sous-pixels et de couleurs. Les techniques de compression les plus simples font que l'on mémorise 2 couleurs par tile de sous-pixels, de la même manière que le font les formats de compression de textures. D'autres techniques peuvent mémoriser 4 couleurs pour 8 sous-pixels, etc. {|class="wikitable" |- ! Mode d'AA ! Nombre de sous-pixels par pixel ! Nombre de couleurs par pixel |- ! Supersampling et Multisampling 8x | 8 || 8 |- ! Coverage Sampled Antialiasing 8x | 8 || 4 |- ! Coverage Sampled Antialiasing 16x | 16 || 4 |- ! Coverage Sampled Antialiasing 8xQ | 8 || 8 |- ! Coverage Sampled Antialiasing 16xQ | 16 || 4 |- ! Enhanced Quality Antialiasing 2f4x | 4 || 2 |- ! Enhanced Quality Antialiasing 4f8x | 8 || 4 |- ! Enhanced Quality Antialiasing 4f16x | 16 || 4 |- ! Enhanced Quality Antialiasing 8f16x | 16 || 8 |} ==L'antialiasing temporel== L''''antialiasing temporel''' (TAA pour ''temporal Anti-Aliasing'') est une technique répartit l'antialiasing sur plusieurs ''frames'', sur plusieurs images. L'idée de l'antialiasing temporel est que chaque image est mélangée avec les images rendues avant elle pour donner un effet d'antialiasing. Mais il ne s'agit pas d'un mélange bête et méchant où chaque image est la moyenne des précédentes. La carte graphique rend chaque image à la même résolution que l'écran, mais chaque image a une position légèrement différente de la précédente, ce qui fait que le mélange de plusieurs images consécutives permet d'affiner la qualité d'image. L'antialiasing temporel subdivise chaque pixel en sous-pixel, sauf qu'au lieu de traiter tous les sous-pixels à chaque image comme le font le ''super-sampling'' et le MSAA, elle ne traite qu'un sous-pixel par pixel à chaque image. Concrètement, si on prend un antialiasing 4x, où chaque pixel est subdivisé en 4 sous-pixels, le premier sous-pixel sera calculé par la première image, le second sous-pixel par la seconde image, etc. Il reste ensuite à appliquer l'opération de mélange sur les 4 images rendues auparavant. Naïvement, on pourrait croire que le filtre de mélange des sous-pixels est effectué toutes les 4 images, mais on peut le faire à chaque rendu d'image en prenant les 4 images précédemment calculées. [[File:TV ghosting interference.jpg|vignette|Exemple de la trainée de mouvement observée avec le TAA avec des objets en mouvement rapide.]] L'avantage du TAA est qu'il est relativement léger en calculs. Le cout est surtout lié au filtre de reconstruction de l'image finale, qui est assez léger en calculs. Cette forme d'antialiasing améliore la qualité de toute l'image, contrairement au MSSA, mais comme le SSAA. Niveau inconvénients, si le TAA marche très bien pour des scènes statiques, il se débrouille assez mal sur les scènes où la caméra bouge vite. Des mouvements trop rapides font que l'image a un flou de mouvement très important, sans compter que les objets en mouvement laissent une sorte de trainée de mouvement visible derrière eux. Notons cependant que le TAA marche d'autant mieux en qualité que le nombre d'images par secondes est élevé. ==L'antialiasing par ''post-processing''== L''''antialiasing par ''post-processing''''' regroupe plusieurs techniques d'antialiasing différentes du SSAA et du MSAA. Avec elles, l'image n'est pas rendue à plus haute résolution avant d'être redimensionnée. A la place, l'image est calculée normalement, à sa résolution finale. Une fois l'image finale mémorisée dans le ''framebuffer'', on lui applique un filtre d'antialiasing spécial. Le filtre en question varie selon la technique utilisée, mais l'idée générale est la même. C'est donc des techniques dites de ''post-processing'', où on calcule l'image, avant de lui faire subir des filtres pour l'embellir. Le filtre en question peut être effectué par les ROP ou par un pixel shader, mais c'est surtout la seconde solution qui est retenue de nos jours. L'algorithme des filtres est généralement assez complexe, ce qui rend sont implémentation en matériel peu pertinente. ===Les avantages et inconvénients=== Contrairement au MSAA, l'antialiasing par ''post-processing'' n'a aucune connaissance de la géométrie de la scène, n'a aucune connaissance des informations données par la rastérisation, n'utilise même pas de sous-pixels. C'est un avantage, car le FXAA filtre la totalité de la scène 3D, même à l'intérieur des textures, et même à l'intérieur des textures transparentes. Par contre, cela peut causer des artefacts graphiques sur certaines portions de l'image. Quand le FXAA est activé, le texte affiché sur une image devient légèrement moins lisible, par exemple. Les techniques de ''post-processing'' ont l'avantage de mieux marcher avec les moteurs de jeux qui utilisent des techniques de rendu différés, dans lesquels une bonne partie des traitements d'éclairage se font sur l'image finale rendue dans le ''framebuffer''. ===Les différentes méthodes d'antialiasing par ''post-processing''=== Le '''''Fast approximate anti-aliasing''''' (FXAA), et le '''''Subpixel Morphological Antialiasing''''' (SMAA) sont les premières techniques d'antialiasing par ''post-processing'' à avoir été intégrées dans les cartes graphiques modernes. Pour le FXAA, le filtre détermine les zones à filtrer en analysant le contraste. Les zones de l'image où le contraste évolue fortement d'un pixel à l'autre sont filtrées, alors que les zones où le contraste varie peu sont gardées intactes. La raison est que les zones où le contraste varie rapidement sont généralement les bords des objets, ou du moins des zones où l'effet d'escalier se fait sentir. l'algorithme exact est dans le domaine public et on peut le trouver facilement sur le net. Par contre, il est difficile d'en expliquer le fonctionnement, pourquoi il marche, aussi je passe cela sous silence. Les cartes graphiques récentes utilisent des techniques basées sur des réseaux de neurones pour effectuer de l'antialiasing. La première d'entre elle est le '''''Deep learning dynamic super resolution''''' (DLDSR), qui consiste à rendre l'image en plus haute résolution, puis à lui appliquer un filtre pour en réduire la résolution. C'est un peu la même chose que le ''supersampling'', sauf que le ''supersampling'' est réalisé dans les ROP, alors que le DLDSR est effectué avec une phase de rendu complète, suivie par l’exécution d'un shader qui redimensionne l'image. Une technique opposée est le '''''Deep learning super sampling''''' (DLSS), qui rend l'image à une résolution inférieure, mais applqiue un filtre qui redimensionne l'image à une plus haute résolution. La première version utilisait un filtre de ''post-processing'', mais les versions suivantes utilisent de l'antialising temporel. Quoique en soit, toutes les versions de DLSS appliquent une forme d'antialiasing, même si elles ''upscalent'' aussi l'image. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le support matériel du lancer de rayons | prevText=Le support matériel du lancer de rayons | next=Le multi-GPU | nextText=Le multi-GPU }}{{autocat}} </noinclude> cpkchhmeubhemtbclj4907ij0oueftx Wikilivres:GUS2Wiki 4 78643 764835 763868 2026-04-24T12:11:38Z Alexis Jazz 81580 Updating gadget usage statistics from [[Special:GadgetUsage]] ([[phab:T121049]]) 764835 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 2026-04-22T06:54:40Z. {{PLURAL:5000|1=Un seul résultat|5000 résultats}} au maximum {{PLURAL:5000|est disponible|sont disponibles}} 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 || 35 || 1 |- |BoutonsLiens || 41 || 0 |- |CategoryAboveAll || 19 || 0 |- |CategorySeparator || 22 || 0 |- |CoinsArrondis || 99 || 1 |- |CollapseSidebox || 35 || 1 |- |CouleurContributions || 33 || 0 |- |CouleursLiens || 25 || 0 |- |DeluxeAdmin || 5 || 1 |- |DeluxeEdit || 36 || 1 |- |DeluxeHistory || 46 || 1 |- |DeluxeImport || 19 || 1 |- |DeluxeRename || 16 || 1 |- |DeluxeSummary || 36 || 1 |- |DevTools || 17 || 1 |- |DirectPageLink || 25 || 1 |- |Emoticons || 43 || 0 |- |EmoticonsToolbar || 45 || 0 |- |FastRevert || 36 || 1 |- |FixArrayAltLines || 22 || 1 |- |FlecheHaut || 66 || 1 |- |GoogleTrans || 28 || 0 |- |HotCats || 81 || 3 |- |JournalDebug || 21 || 1 |- |JournalEnTable || 2 || 1 |- |LeftPaneSwitch || 5 || 1 |- |ListeABordure || 30 || 1 |- |LiveRC || 30 || 0 |- |LocalLiveClock || 27 || 1 |- |Logo || 42 || 0 |- |MobileView || 18 || 2 |- |NavigAdmin || 38 || 0 |- |OngletEditCount || 44 || 1 |- |OngletEditZeroth || 66 || 1 |- |OngletGoogle || 28 || 1 |- |OngletPurge || 54 || 1 |- |OptimizedSuivi || 18 || 0 |- |Popups || 61 || 0 |- |RenommageCategorie || 6 || 2 |- |RestaurationDeluxe || 12 || 1 |- |RevertDiff || 35 || 3 |- |ScriptAutoVersion || 16 || 1 |- |ScriptSidebox || 31 || 0 |- |ScriptToolbar || 42 || 0 |- |SisterProjects || 16 || 0 |- |SkinPreview || 4 || 1 |- |Smart patrol || 2 || 1 |- |SourceLanguage || 24 || 0 |- |SousPages || 57 || 2 |- |SpaceToolbar || 29 || 0 |- |TableUnicode || 55 || 0 |- |Tableau || 66 || 1 |- |TitreDeluxe || 56 || 1 |- |TitreHierarchique || 17 || 0 |- |UTCLiveClock || 26 || 0 |- |UnicodeEditRendering || 29 || 1 |- |WikEd || 29 || 0 |- |autonum || 2 || 0 |- |massblock || 3 || 1 |- |monBrouillon || 19 || 1 |- |perpagecustomization || 16 || 1 |- |recentchangesbox || 15 || 0 |- |searchFocus || 18 || 0 |- |searchbox || 30 || 2 |} * [[Spécial:GadgetUsage]] * [[m:Meta:GUS2Wiki/Script|GUS2Wiki]] <!-- data in CSV format: AncreTitres,33,0 ArchiveLinks,12,0 Barre de luxe,35,1 BoutonsLiens,41,0 CategoryAboveAll,19,0 CategorySeparator,22,0 CoinsArrondis,99,1 CollapseSidebox,35,1 CouleurContributions,33,0 CouleursLiens,25,0 DeluxeAdmin,5,1 DeluxeEdit,36,1 DeluxeHistory,46,1 DeluxeImport,19,1 DeluxeRename,16,1 DeluxeSummary,36,1 DevTools,17,1 DirectPageLink,25,1 Emoticons,43,0 EmoticonsToolbar,45,0 FastRevert,36,1 FixArrayAltLines,22,1 FlecheHaut,66,1 GoogleTrans,28,0 HotCats,81,3 JournalDebug,21,1 JournalEnTable,2,1 LeftPaneSwitch,5,1 ListeABordure,30,1 LiveRC,30,0 LocalLiveClock,27,1 Logo,42,0 MobileView,18,2 NavigAdmin,38,0 OngletEditCount,44,1 OngletEditZeroth,66,1 OngletGoogle,28,1 OngletPurge,54,1 OptimizedSuivi,18,0 Popups,61,0 RenommageCategorie,6,2 RestaurationDeluxe,12,1 RevertDiff,35,3 ScriptAutoVersion,16,1 ScriptSidebox,31,0 ScriptToolbar,42,0 SisterProjects,16,0 SkinPreview,4,1 Smart patrol,2,1 SourceLanguage,24,0 SousPages,57,2 SpaceToolbar,29,0 TableUnicode,55,0 Tableau,66,1 TitreDeluxe,56,1 TitreHierarchique,17,0 UTCLiveClock,26,0 UnicodeEditRendering,29,1 WikEd,29,0 autonum,2,0 massblock,3,1 monBrouillon,19,1 perpagecustomization,16,1 recentchangesbox,15,0 searchFocus,18,0 searchbox,30,2 --> naml60vxq5prhakjyf5v0wfu9hl6ffy Les cartes graphiques/Le rendu d'une scène 3D : concepts de base 0 79234 764867 763952 2026-04-24T17:47:06Z Mewtow 31375 /* Les objets 3D et leur géométrie */ 764867 wikitext text/x-wiki Le premier jeu à utiliser de la "vraie 3D" texturée fut le jeu Quake, premier du nom. Et depuis sa sortie, la grande majorité des jeux vidéo utilisent de la 3D, même s'il existe encore quelques jeux en 2D. Face à la prolifération des jeux vidéo en 3D, les fabricants de cartes graphiques ont inventé les cartes accélératrices 3D, des cartes vidéo capables d'accélérer le rendu en 3D. Dans ce chapitre, nous allons voir comment elles fonctionnent et comment elles ont évolué dans le temps. Pour comprendre comment celles-ci fonctionnent, il faut faire quelques rapides rappels sur les bases du rendu 3D. ==Les bases du rendu 3D== Une '''scène 3D''' est composée d'un espace en trois dimensions, dans laquelle le moteur d’un jeu vidéo place des objets et les fait bouger. Cette scène est, en première approche, un simple parallélogramme. Un des coins de ce parallélogramme sert d’origine à un système de coordonnées : il est à la position (0, 0, 0), et les axes partent de ce point en suivant les arêtes. Les objets seront placés à des coordonnées bien précises dans ce parallélogramme. ===Les objets 3D et leur géométrie=== <noinclude>[[File:Dolphin triangle mesh.png|vignette|Illustration d'un dauphin, représenté avec des triangles.]]</noinclude> Dans la quasi-totalité des jeux vidéo actuels, les objets et la scène 3D sont modélisés par un assemblage de triangles collés les uns aux autres, ce qui porte le nom de '''maillage''', (''mesh'' en anglais). Il a été tenté dans le passé d'utiliser des quadrilatères (rendu dit en ''quad'') ou d'autres polygones, mais les contraintes techniques ont fait que ces solutions n'ont pas été retenues. [[File:CG WIKI.jpg|centre|vignette|upright=2|Exemple de modèle 3D.]] Les modèles 3D sont définis par leurs sommets, aussi appelés '''vertices''' dans le domaine du rendu 3D. Chaque sommet possède trois coordonnées, qui indiquent sa position dans la scène 3D : abscisse, ordonnée, profondeur. Les sommets sont regroupés en triangles, qui sont formés en combinant trois sommets entre eux. Les anciennes cartes graphiques géraient aussi d'autres formes géométriques, comme des points, des lignes, ou des quadrilatères. Les quadrilatères étaient appelés des ''quads'', et ce terme reviendra occasionnellement dans ce cours. De telles formes basiques, gérées nativement, sont appelées des '''primitives'''. La représentation exacte d'un objet est donc une liste plus ou moins structurée de sommets. La liste doit préciser les coordonnées de chaque sommet, ainsi que comment les relier pour former des triangles. Pour cela, l'objet est représenté par une structure qui contient la liste des sommets, mais aussi de quoi savoir quels sont les sommets reliés entre eux par un segment. Nous en dirons plus dans le chapitre sur le rendu de la géométrie. ===La caméra : le point de vue depuis l'écran=== Outre les objets proprement dit, on trouve une '''caméra''', qui représente les yeux du joueur. Cette caméra est définie au minimum par : * une position ; * par la direction du regard (un vecteur). A la caméra, il faut ajouter tout ce qui permet de déterminer le '''champ de vision'''. Le champ de vision contient tout ce qui est visible à l'écran. Et sa forme dépend de la perspective utilisée. Dans le cas le plus courant dans les jeux vidéos en 3D, il correspond à une '''pyramide de vision''' dont la pointe est la caméra, et dont les faces sont délimitées par les bords de l'écran. A l'intérieur de la pyramide, il y a un rectangle qui représente l'écran du joueur, appelé le '''''viewport'''''. [[File:ViewFrustum.jpg|centre|vignette|upright=2|Caméra.]] [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] La majorité des jeux vidéos ajoutent deux plans : * un ''near plane'' en-deça duquel les objets ne sont pas affichés. Il élimine du champ de vision les objets trop proches. * Un ''far plane'', un '''plan limite''' au-delà duquel on ne voit plus les objets. Il élimine les objets trop lointains. Avec ces deux plans, le champ de vision de la caméra est donc un volume en forme de pyramide tronquée, appelé le '''''view frustum'''''. Le tout est parfois appelée, bien que par abus de langage, la pyramide de vision. Avec d'autres perspectives moins utilisées, le ''view frustum'' est un pavé, mais nous n'en parlerons pas plus dans le cadre de ce cours car elles ne sont presque pas utilisés dans les jeux vidéos actuels. ===Les textures=== Tout objet à rendre en 3D est donc composé d'un assemblage de triangles, et ceux-ci sont éclairés et coloriés par divers algorithmes. Pour rajouter de la couleur, les objets sont recouverts par des '''textures''', des images qui servent de papier peint à un objet. Un objet géométrique est donc recouvert par une ou plusieurs textures qui permettent de le colorier ou de lui appliquer du relief. [[File:Texture+Mapping.jpg|centre|vignette|upright=2|Texture Mapping]] Notons que les textures sont des images comme les autres, codées pixel par pixel. Pour faire la différence entre les pixels de l'écran et les pixels d'une texture, on appelle ces derniers des '''texels'''. Ce terme est assez important, aussi profitez-en pour le mémoriser, nous le réutiliserons dans quelques chapitres. Un autre point lié au fait que les textures sont des images est leur compression, leur format. N'allez pas croire que les textures sont stockées dans un fichier .jpg, .png ou tout autre format de ce genre. Les textures utilisent des formats spécialisés, comme le DXTC1, le S3TC ou d'autres, plus adaptés à leur rôle de texture. Mais qu'il s'agisse d'images normales (.jpg, .png ou autres) ou de textures, toutes sont compressées. Les textures sont compressées pour prendre moins de mémoire. Songez que la compression de texture est terriblement efficace, souvent capable de diviser par 6 la mémoire occupée par une texture. S'en est au point où les textures restent compressées sur le disque dur, mais aussi dans la mémoire vidéo ! Nous en reparlerons dans le chapitre sur la mémoire d'une carte graphique. Plaquer une texture sur un objet peut se faire de deux manières, qui portent les noms de placage de texture inverse et direct. Le placage de texture direct a été utilisé au tout début de la 3D, sur des bornes d'arcade et les consoles de jeu 3DO, PS1, Sega Saturn. De nos jours, on utilise uniquement la technique de placage de texture inverse. Les deux seront décrites dans le détail plus bas. ===La différence entre rastérisation et lancer de rayons=== [[File:Render Types.png|vignette|Même géométrie, plusieurs rendus différents.]] Les techniques de rendu 3D sont nombreuses, mais on peut les classer en deux grands types : le ''lancer de rayons'' et la ''rasterization''. Sans décrire les deux techniques, sachez cependant que le lancer de rayon n'est pas beaucoup utilisé pour les jeux vidéo. Il est surtout utilisé dans la production de films d'animation, d'effets spéciaux, ou d'autres rendu spéciaux. Dans les jeux vidéos, il est surtout utilisé pour quelques effets graphiques, la rasterization restant le mode de rendu principal. La raison principale est que le lancer de rayons demande beaucoup de puissance de calcul. Une autre raison est que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Il a existé des cartes accélératrices permettant d'accélérer le rendu en lancer de rayons, mais elles sont restées confidentielles. Les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, mais ils restent d'un usage marginal et servent de compléments au rendu par rastérization. Un chapitre entier sera dédié aux cartes accélératrices de lancer de rayons et nous verrons pourquoi le lancer de rayons est difficile à implémenter avec des performances convenables, ce qui explique que les jeux vidéo utilisent la ''rasterization''. La rastérisation est structurée autour de trois étapes principales : * Une étape purement logicielle, effectuée par le processeur, où le moteur physique calcule la géométrie de la scène 3D. * Une étape de '''traitement de la géométrie''', qui gère tout ce qui a trait aux sommets et triangles. * Une étape de '''rastérisation''' qui détermine sur quels pixels de l'écran est affiché le triangle. * Une étape de '''traitement des pixels''', qui colorie les pixels et gère les textures. [[File:Graphics pipeline 2 en.svg|centre|vignette|upright=2.5|Pipeline graphique basique.]] Il existe plusieurs rendus différents et la rastérisation ne se fait pas de la même manière selon le rendu utilisé. Il existe des rendus sans textures, d'autres avec, d'autres avec éclairage, d'autres sans, etc. Par contre, l'étape de calcul de la géométrie est la même quel que soit le rendu ! Mieux : le calcul de la géométrie se fait de la même manière entre rastérisation et lancer de rayons, il est le même quelle que soit la technique de rendu 3D utilisée. Les trois étapes précédentes sont réalisées dans des circuits ou processeurs séparés, comme on le verra plus tard. Et cela permet d'utiliser la technique dite du '''pipeline'''. Concrètement, supposons que la carte graphique traite les données par paquets de triangles (en réalité, c'est des paquets de sommets, mais passons). L'étape de traitement de la géométrie peut travailler sur un paquet de triangle, pendant que le paquet précédent est dans l'étape de rastérisation, et que le paquet encore précédent est en train de traiter ses pixels. Cela permet de traiter trois paquets de triangles en même temps, mais à des états d'avancements différents. Mieux que cela : le traitement de la géométrie est lui-même composé d'une succession de sous-étapes, la rasterisation est elle-même découpée en plusieurs sous-étapes, et ainsi de suite. Le nombre d'étapes pour une carte graphique moderne dépasse la dizaine. La rastérisation calcule un rendu 3D avec une suite d'étapes consécutives qui doivent s'enchainer dans un ordre bien précis. L'ensemble de ces étapes est appelé le '''pipeline graphique''', qui sera détaillé dans ce qui suit. ==Le calcul de la géométrie== Le calcul de la géométrie regroupe plusieurs manipulations différentes. La principale demande juste de placer les modèles 3D dans la scène, de placer les objets dans le monde. Puis, il faut centrer la scène 3D sur la caméra. Les deux changements ont pour point commun de demander des changements de repères. Par changement de repères, on veut dire que l'on passe d'un système de coordonnées à un autre. En tout, il existe trois changements de repères distincts qui sont regroupés dans l''''étape de transformation''' : un premier qui place chaque objet 3D dans la scène 3D, un autre qui centre la scène du point de vue de la caméra, et un autre qui corrige la perspective. ===Les trois étapes de transformation=== La première étape place les objets 3D dans la scène 3D. Un modèle 3D est représentée par un ensemble de sommets, qui sont reliés pour former sa surface. Les données du modèle 3D indiquent, pour chaque sommet, sa position par rapport au centre de l'objet qui a les coordonnées (0, 0, 0). La première étape place l'objet 3D à une position dans la scène 3D, déterminée par le moteur physique, qui a des coordonnées (X, Y, Z). Une fois placé dans la scène 3D, le centre de l'objet passe donc des coordonnées (0, 0, 0) aux coordonnées (X, Y, Z) et tous les sommets de l'objet doivent être mis à jour. De plus, l'objet a une certaine orientation : il faut aussi le faire tourner. Enfin, l'objet peut aussi subir une mise à l'échelle : on peut le gonfler ou le faire rapetisser, du moment que cela ne modifie pas sa forme, mais simplement sa taille. En clair, le modèle 3D subit une translation, une rotation et une mise à l'échelle, les trois impliquant une modification des coordonnées des sommets.. [[File:Similarity and congruence transformations.svg|centre|vignette|upright=1.5|Transformations géométriques possibles pour chaque triangle.]] Une fois le placement des différents objets effectué, la carte graphique effectue un changement de coordonnées pour centrer le monde sur la caméra. Au lieu de considérer un des bords de la scène 3D comme étant le point de coordonnées (0, 0, 0), il va passer dans le référentiel de la caméra. Après cette transformation, le point de coordonnées (0, 0, 0) sera la caméra. La direction de la vue du joueur sera alignée avec l'axe de la profondeur (l'axe Z). [[File:View transform.svg|centre|vignette|upright=2|Étape de transformation dans un environnement en deux dimensions : avant et après. On voit que l'on centre le monde sur la position de la caméra et dans sa direction.]] Enfin, il faut aussi corriger la perspective, ce qui est le fait de l'étape de projection, qui modifie la forme du ''view frustum'' sans en modifier le contenu. Différents types de perspective existent et celles-ci ont un impact différent les unes des autres sur le ''view frustum''. Dans le cas qui nous intéresse, le ''view frustum'' passe d’une forme de trapèze tridimensionnel à une forme de pavé dont l'écran est une des faces. ===Les changements de coordonnées se font via des multiplications de matrices=== Les trois étapes précédentes demande de faire des changements de coordonnées, chaque sommet voyant ses coordonnées remplacées par de nouvelles. Or, un changement de coordonnée s'effectue assez simplement, avec des matrices, à savoir des tableaux organisés en lignes et en colonnes avec un nombre dans chaque case. Un changement de coordonnées se fait simplement en multipliant le vecteur (X, Y, Z) des coordonnées d'un sommet par une matrice adéquate. Il existe des matrices pour la translation, la mise à l'échelle, d'autres pour la rotation, une autre pour la transformation de la caméra, une autre pour l'étape de projection, etc. Un changement de coordonnée s'effectue assez simplement en multipliant le vecteur-coordonnées (X, Y, Z) d'un sommet par une matrice adéquate. Un petit problème est que les matrices qui le permettent sont des matrices avec 4 lignes et 4 colonnes. Or, la multiplication demande que le nombre de coordonnées du vecteur soit égal au nombre de colonnes. Pour résoudre ce petit problème, on ajoute une 4éme coordonnée aux sommets, la coordonnée homogène, qui ne sert à rien, et est souvent mise à 1, par défaut. Mais oublions ce détail. Il se trouve que multiplier des matrices amène certaines simplifications. Au lieu de faire plusieurs multiplications de matrices, il est possible de fusionner les matrices en une seule, ce qui permet de simplifier les calculs. Ce qui fait que le placement des objets, changement de repère pour centrer la caméra, et d'autres traitements forts différents sont regroupés ensemble. Le traitement de la géométrie implique, sans surprise, des calculs de géométrie dans l'espace. Et cela implique des opérations mathématiques aux noms barbares : produits scalaires, produits vectoriels, et autres calculs impliquant des vecteurs et/ou des matrices. Et les calculs vectoriels/matriciels impliquent beaucoup d'additions, de soustractions, de multiplications, de division, mais aussi des opérations plus complexes : calculs trigonométriques, racines carrées, inverse d'une racine carrée, etc. Au final, un simple processeur peut faire ce genre de calculs, si on lui fournit le programme adéquat, l'implémentation est assez aisée. Mais on peut aussi implémenter le tout avec un circuit spécialisé, non-programmable. Les deux solutions sont possibles, tant que le circuit dispose d'assez de puissance de calcul. Les cartes graphiques anciennes contenaient un ou plusieurs circuits de multiplication de matrices spécialisés dans l'étape de transformation. Chacun de ces circuits prend un sommet et renvoie le sommet transformé. Ils sont composés d'un gros paquet de multiplieurs et d'additionneurs flottants. Pour plus d'efficacité, les cartes graphiques comportent plusieurs de ces circuits, afin de pouvoir traiter plusieurs sommets en même temps. ==L'élimination des surfaces cachées== Un point important du rendu 3D est que ce que certaines portions de la scène 3D ne sont pas visibles depuis la caméra. Et idéalement, les portions de la scène 3D qui ne sont pas visibles à l'écran ne doivent pas être calculées. A quoi bon calculer des choses qui ne seront pas affichées ? Ce serait gâcher de la puissance de calcul. Et pour cela, de nombreuses optimisations visent à éliminer les calculs inutiles. Elles sont regroupées sous les termes de '''''clipping''''' ou de '''''culling'''''. La différence entre ''culling'' et ''clipping'' n'est pas fixée et la terminologie n'est pas claire. Dans ce qui va suivre, nous n'utiliserons que le terme ''culling''. Les cartes graphiques modernes embarquent diverses méthodes de ''culling'' pour abandonner les calculs quand elles s’aperçoivent que ceux-ci portent sur une partie non-affichée de l'image. Cela fait des économies de puissance de calcul assez appréciables et un gain en performance assez important. Précisons que le ''culling'' peut être plus ou moins précoce suivant le type de rendu 3D utilisé, mais nous verrons cela dans la suite du chapitre. ===Les différentes formes de ''culling''/''clipping''=== La première forme de ''culling'' est le '''''view frustum culling''''', dont le nom indique qu'il s'agit de l'élimination de tout ce qui est situé en-dehors du ''view frustum''. Ce qui est en-dehors du champ de vision de la caméra n'est pas affiché à l'écran n'est pas calculé ou rendu, dans une certaine mesure. Le ''view frustum culling'' est assez trivial : il suffit d'éliminer ce qui n'est pas dans le ''view frustum'' avec quelques calculs de coordonnées assez simples. Quelques subtilités surviennent quand un triangle est partiellement dans le ''view frustrum'', ce qui arrive parfois si le triangle est sur un bord de l'écran. Mais rien d'insurmontable. [[File:View frustum culling.svg|centre|vignette|upright=1|''View frustum culling'' : les parties potentiellement visibles sont en vert, celles invisibles en rouge et celles partiellement visibles en bleu.]] Les autres formes de ''culling'' visent à éliminer ce qui est dans le ''view frustum'', mais qui n'est pas visible depuis la caméra. Pensez à des objets cachés par un autre objet plus proche, par exemple. Ou encore, pensez aux faces à l'arrière d'un objet opaque qui sont cachées par l'avant. Ces deux cas correspondent à deux types de ''culling''. L'élimination des objets masqués par d'autres est appelé l'''occlusion culling''. L'élimination des parties arrières d'un objet est appelé le ''back-face culling''. Dans les deux cas, nous parlerons d''''élimination des surfaces cachées'''. [[File:Occlusion culling example PL.svg|centre|vignette|''Occlusion culling'' : les objets en bleu sont visibles, ceux en rouge sont masqués par les objets en bleu.]] Le lancer de rayons n'a pas besoin d'éliminer les surfaces cachées, il ne calcule que les surfaces visibles. Par contre, la rastérisation demande d'éliminer les surfaces cachées. Sans cela, le rendu est incorrect dans le pire des cas, ou alors le rendu calcule des surfaces invisibles pour rien. Il existe de nombreux algorithmes logiciels pour implémenter l'élimination des surfaces cachées, mais la carte graphique peut aussi s'en charger. L'''occlusion culling'' demande de connaitre la distance à la caméra de chaque triangle. La distance à la caméra est appelée la '''profondeur''' du triangle. Elle est déterminée à l'étape de rastérisation et est calculée à chaque sommet. Lors de la rastérisation, chaque sommet se voit attribuer trois coordonnées : deux coordonnées x et y qui indiquent sa position à l'écran, et une coordonnée de profondeur notée z. ===L'algorithme du peintre=== Pour éliminer les surfaces cachées, la solution la plus simple consiste simplement à rendre les triangles du plus lointain au plus proche. L'idée est que si deux triangles se recouvrent totalement ou partiellement, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Il ne s'agit ni plus ni moins que de l''''algorithme du peintre'''. [[File:Polygons cross.svg|vignette|Polygons cross]] [[File:Painters problem.svg|vignette|Painters problem]] Un problème est que la solution ne marche pas avec certaines configurations particulières, dans le cas où des polygones un peu complexes se chevauchent plusieurs fois. Il se présente rarement dans un rendu 3D normal, mais c'est quand même un cas qu'il faut gérer. Le problème est suffisant pour que cette solution ne soit plus utilisée dans le rendu 3D normal. Un autre problème est que l'algorithme demande de trier les triangles d'une scène 3D selon leur profondeur, du plus profond au moins profond. Et les cartes graphiques n'aiment pas ça, que ce soit les anciennes cartes graphiques comme les modernes. Il s'agit généralement d'une tâche qui est réalisée par le processeur, le CPU, qui est plus efficace que le GPU pour trier des trucs. Aussi, l'algorithme du peintre était utilisé sur d'anciennes cartes graphiques, qui ne géraient pas la géométrie mais seulement les textures et quelques effets de post-processing. Avec ces GPU, les jeux vidéo calculaient la géométrie et la triait sur le CPU, puis effectuaient le reste de la rastérisation sur le GPU. Les anciens jeux en 2.5D comme DOOM ou les DOOM-like, utilisaient une amélioration de l'algorithme du peintre. L'amélioration variait suivant le moteur de jeu utilisé, et donnait soit une technique dite de ''portal rendering'', soit un système de ''Binary Space Partionning'', assez complexes et difficiles à expliquer. Mais il ne s'agissait pas de jeux en 3D, les maps de ces jeux avaient des contraintes qui rendaient cette technique utilisable. Ils n'avaient pas de polygones qui se chevauchent, notamment. ===Le tampon de profondeur=== [[File:Z-buffer no text.jpg|vignette|Z-buffer correspondant à un rendu]] Une autre solution utilise ce qu'on appelle un '''tampon de profondeur''', aussi appelé un ''z-buffer''. Il s'agit d'un tableau, stocké en mémoire vidéo, qui mémorise la coordonnée z de l'objet le plus proche pour chaque pixel. Par défaut, ce tampon de profondeur est initialisé avec la valeur de profondeur maximale, celle du ''far plane'' du ''viewfrustum''. Au fur et à mesure que les objets seront calculés, le tampon de profondeur est mis à jour, conservant ainsi la trace de l'objet le plus proche de la caméra. Si jamais un triangle a une coordonnée z plus grande que celle du tampon de profondeur, cela veut dire qu'il est situé derrière un objet déjà rendu. Il est éliminé (sauf si transparence il y a) et le tampon de profondeur n'a pas à être mis à jour. Dans le cas contraire, l'objet est plus près de la caméra et sa coordonnée z remplace l'ancienne valeur z dans le tampon de profondeur. [[File:Z-buffer.svg|centre|vignette|upright=2.0|Illustration du processus de mise à jour du Z-buffer.]] Il existe des techniques alternatives pour coder la coordonnée de profondeur, qui se distinguent par le fait que la coordonnée z n'est pas proportionnelle à la distance entre le fragment et la caméra. Mais il s'agit là de détails assez mathématiques que je me permets de passer sous silence. Dans la suite de ce cours, nous allons juste parler de profondeur pour regrouper toutes ces techniques, conventionnelles ou alternatives. Toutes les cartes graphiques modernes utilisent un système de ''z-buffer''. C'est la seule solution pour avoir des performances dignes de ce nom. Il faut cependant noter qu'elles utilisent des tampons de profondeur légèrement modifiés, qui ne mémorisent pas la coordonnée de profondeur, mais une valeur dérivée. Pour simplifier, ils ne mémorisent pas la coordonnée de profondeur z, mais son inverse 1/z. Les raisons à cela ne peuvent pas encore être expliquées à ce moment du cours, aussi nous allons simplement dire que c'est une histoire de correction de perspective. Les coordonnées z et 1/z sont codées sur quelques bits, allant de 16 bits pour les anciennes cartes graphiques, à 24/32 bits pour les cartes plus récentes. De nos jours, les Z-buffer de 16 bits sont abandonnés et toutes les cartes graphiques utilisent des coordonnées z de 24 à 32 bits. La raison est que les Z-buffer de 16 bits ont une précision insuffisante, ce qui fait que des artefacts peuvent survenir. Si deux objets sont suffisamment proches, le tampon de profondeur n'a pas la précision suffisante pour discriminer les deux objets. Pour lui, les deux objets sont à la même place. Conséquence : il faut bien choisir un des deux objets et ce choix se fait pixel par pixel, ce qui fait des artefacts visuels apparaissent. On parle alors de '''''z-fighting'''''. Voici ce que cela donne : [[File:Z-fighting.png|centre|vignette|Z-fighting]] Un défaut du tampon de profondeur est qu'il ne gère pas correctement les objets transparents. Dès que de la transparence est présente dans une scène 3D, le tampon de profondeur ne peut pas être utilisé. Une solution pour cela est de rendre une scène 3D en deux phases : une pour les objets opaques, une avec les objets transparents. La où on rend les objets opaques utilise le tampon de profondeur, mais il est désactivé lors de la seconde. ==La rastérisation et les textures== Dans cette section, nous allons voir ensemble l'étape de rastérisation et l'étape de traitement des pixels. La rastérisation est difficile à expliquer, surtout que son rôle exact dépend de la technique de rendu utilisée. Pour simplifier, elle projette un rendu en 3D sur un écran en 2D. Une autre explication tout aussi vague est qu'elle s'occupe la traduction des triangles en un affichage pixelisé à l'écran. Elle détermine à quoi ressemble la scène visible sur l'écran. C'est par exemple lors de cette étape que sont appliquées certaines techniques de ''culling'', qui éliminent les portions non-visibles de l'image, ainsi qu'une correction de la perspective et diverses opérations d'interpolation dont nous parlerons dans plusieurs chapitres. La rastérisation et placage de textures sont deux opérations très liées entre elles. Il existe deux manières principales pour lier les textures à la géométrie : la méthode directe et la méthode inverse (''UV Mapping''). Et les deux font que la rastérisation se fait de manière très différente. Précisons cependant que les rendus les plus simples n'utilisent pas de textures du tout. Ils se contentent de colorier les triangles, voire d'un simple rendu en fil de fer basé sur du tracé de lignes. Dans la suite de cette section, nous allons voir les quatre types de rendu principaux : le rendu en fils de fer, le rendu colorié, et deux rendus utilisant des textures. ===Le rendu en fil de fer=== [[File:Obj lineremoval.png|vignette|Rendu en fil de fer d'un objet 3D.]] Le '''rendu 3D en fils de fer''' est illustré ci-contre. Il s'agit d'un rendu assez ancien, utilisé au tout début de la 3D, sur des machines qu'on aurait du mal à appeler ordinateurs. Il se contente de tracer des lignes à l'écran, lignes qui connectent deux sommets, qui ne sont autres que les arêtes de la géométrie de la scène rendue. Le tout était suffisant pour réaliser quelques jeux vidéos rudimentaires. Les tout premiers jeux vidéos utilisaient ce rendu, l'un d'entre eux étant Maze War, le tout premier FPS. {| |[[File:Maze war.jpg|vignette|Maze war]] |[[File:Maze representation using wireframes 2022-01-10.gif|centre|vignette|Maze representation using wireframes 2022-01-10]] |} Le monde est calculé en 3D, il y a toujours un calcul de la géométrie, la scène est rastérisée normalement, les portions invisbles de l'image sont retirées, mais il n'y a pas d'application de textures après rastérisation. A la place, un algorithme de tracé de ligne trace les lignes à l'écran. Quand un triangle passe l'étape de rastérisation, l'étape de rastérisation fournit la position des trois sommets sur l'écran. En clair, elle fournit les coordonnées de trois pixels, un par sommet. A la suite, un algorithme de tracé de ligne trace trois lignes, une par paire de sommet. L'implémentation demande juste d'avoir une unité de calcul géométrique, une unité de rastérisation, et un VDC qui supporte le tracé de lignes. Elle est donc assez simple et ne demande pas de circuits de gestion des textures ni de ROP. Le VDC écrit directement dans le ''framebuffer'' les lignes à tracer. Il a existé des proto-cartes graphiques spécialisées dans ce genre de rendu, comme le '''''Line Drawing System-1''''' de l'entreprise Eans & Sutherland. Nous détaillerons son fonctionnement dans quelques chapitres. ===Le rendu à primitives colorées=== [[File:MiniFighter.png|vignette|upright=1|Exemple de rendu pouvant être obtenu avec des sommets colorés.]] Une amélioration du rendu précédent utilise des triangles/''quads'' coloriés. Chaque triangle ou ''quad'' est associé à une couleur, et cette couleur est dessinée sur le triangle/''quad''après la rastérisation. Le rendu est une amélioration du rendu en fils de fer. L'idée est que chaque triangle/''quad'' est associé à une couleur, qui est dessinée sur le triangle/''quad'' après la rastérisation. La technique est nommée ''colored vertices'' en anglais, nous parlerons de '''rendu à maillage coloré'''. [[File:Malla irregular de triángulos modelizando una superficie convexa.png|centre|vignette|upright=2|Maillage coloré.]] La couleur est propagée lors des calculs géométriques et de la rastérisation, sans subir de modifications. Une fois un rendu en fils de fer effectué, la couleur du triangle est récupérée. Le triangle/''quad'' rendu correspond à un triangle/''quad'' à l'écran. Et l'intérieur de ce triangle/''quad'' est colorié avec la couleur transmise. Pour cela, on utilise encore une fois une fonction du VDC : celle du remplissage de figure géométrique. Nous l’avions vu en parlant des VDC à accélération 2D, mais elle est souvent prise en charge par les ''blitters''. Ils peuvent remplir une figure géométrique avec une couleur unique, on réutilise cette fonction pour colorier le triangle/''quad''. L'étape de rastérisation fournit les coordonnées des sommets de la figure géométrique, le ''blitter'' les utilise pour colorier la figure géométrique. Niveau matériel, quelques bornes d'arcade ont utilisé ce rendu. La toute première borne d'arcade utilisant le rendu à maillage coloré est celle du jeu I Robot, d'Atari, sorti en 1983. Par la suite, dès 1988, les cartes d'arcades Namco System 21 et les bornes d'arcades Sega Model 1 utilisaient ce genre de rendu. On peut s'en rendre compte en regardant les graphismes des jeux tournant sur ces bornes d'arcade. Des jeux comme Virtua Racing, Virtua Fighter ou Virtua Formula sont assez parlants à ce niveau. Leurs graphismes sont assez anguleux et on voit qu'ils sont basés sur des triangles uniformément colorés. Pour ceux qui veulent en savoir plus sur la toute première borne d'arcade en rendu à maillage colorée, la borne ''I Robot'' d'Atari, voici une vidéo youtube à ce sujet : * [https://www.youtube.com/watch?v=6miEkPENsT0 I Robot d'Atari, le pionnier de la 3D Flat.] ===Le placage de textures direct=== Les deux rendus précédents sont très simples, mais n'utilisent pas de textures. Et il est temps de voir les deux rendus qui utilisent des textures. Il y en a deux types, appelés rendu avec placage de texture direct et indirect, nous allons voir le '''rendu par placage de texture direct''' en premier. Et nous l'appellerons ''rendu direct'' dans ce qui suit, pour simplifier les explications. L'idée est assez simple et peut utiliser aussi bien des triangles que des ''quads'', mais nous allons partir du principe qu'elle utilise des '''''quads''''', à savoir que les objets 3D sont composés de quadrilatères. Lorsqu'un ''quad'' est rastérisé, sa forme à l'écran est un rectangle déformé par la perspective. On obtient un rectangle si le ''quad'' est vu de face, un trapèze si on le voit de biais. Et le ''sprite'' doit être déformé de la même manière que le ''quad''. L'idée est que tout quad est associé à une texture, à un sprite. La figure géométrique qui correspond à un ''quad'' à l'écran est remplie non pas par une couleur uniforme, mais par un ''sprite'' rectangulaire. Il suffit techniquement de recopier le ''sprite'' à l'écran, c'est à dire dans la figure géométrique, au bon endroit dans le ''framebuffer''. Le rendu direct est en effet un intermédiaire entre rendu 2D à base de ''sprite'' et rendu 3D moderne. La géométrie est rendue en 3D pour générer des ''quads'', mais ces ''quads'' ne servent à guider la copie des sprites/textures dans le ''framebuffer''. [[File:TextureMapping.png|centre|vignette|upright=2|Exemple caricatural de placage de texture sur un ''quad''.]] La subtilité est que le sprite est déformé de manière à rentrer dans un quadrilatère, qui n'est pas forcément un rectangle à l'écran, mais est déformé par la perspective et son orientation en 3D. Le sprite doit être déformé de deux manières : il doit être agrandi/réduit en fonction de la taille de la figure affichée à l'écran, tourné en fonction de l'orientation du ''quad'', déformé pour gérer la perspective. Pour cela, il faut connaitre les coordonnées de profondeur de chaque bord d'un ''quad'', et de faire quelques calculs. N'importe quel VDC incluant un ''blitter'' avec une gestion du zoom/rotation des sprites peut le faire. : Si on veut avoir de beaux graphismes, il vaut mieux appliquer un filtre pour lisser le sprite envoyé dans le trapèze, filtre qui se résume à une opération d'interpolation et n'est pas très différent du filtrage de texture qui lisse les textures à l'écran. Un autre point est que les ''quads'' doivent être rendus du plus lointain au plus proche. Sans cela, on obtient rapidement des erreurs de rendu. L'idée est que si deux quads se chevauchent, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. L'écriture du sprite du second quad écrasera les données du premier quad, pour les portions recouvertes, lors de l'écriture du sprite dans le ''framebuffer''. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Le rendu inverse utilise très souvent des triangles pour la géométrie, alors que le rendu direct a tendance à utiliser des ''quads'', mais il ne s'agit pas d'une différence stricte. L'usage de triangles/''quads'' peut se faire aussi bien avec un rendu direct comme avec un rendu inverse. Cependant, le rendu en ''quad'' se marie très bien au rendu direct, alors que le rendu en triangle colle mieux au rendu inverse. L'avantage de cette technique est qu'on parcourt les textures dans un ordre bien précis. Par exemple, on peut parcourir la texture ligne par ligne, l'exploiter par blocs de 4*4 pixels, etc. Et accéder à une texture de manière prédictible se marie bien avec l'usage de mémoires caches, ce qui est un avantage en matière de performances. Mais un même pixel du ''framebuffer'' est écrit plusieurs fois quand plusieurs quads se superposent, alors que le rendu inverse gère la situation avec une seule écriture (sauf si usage de la transparence). De plus, la gestion de la transparence était compliquée et les jeux devaient ruser en utilisation des solutions logicielles assez complexes. Niveau implémentation matérielle, une carte graphique en rendu direct demande juste trois circuits. Le premier est un circuit de calcul géométrique, qui rend la scène 3D. Le tri des quads est souvent réalisé par le processeur principal, et non pas par un circuit séparé. Toutes les étapes au-delà de l'étape de rastérisation étaient prises en charge par un VDC amélioré, qui écrivait des sprites/textures directement dans le ''framebuffer''. {|class="wikitable" |- ! Géométrie | Processeurs dédiés programmé pour émuler le pipeline graphique |- ! Tri des quads du plus lointain au plus proche | Processeur principal (implémentation logicielle) |- ! Application des textures | ''Blitter'' amélioré, capable de faire tourner et de zoomer sur des ''sprites''. |} L'implémentation était très simple et réutilisait des composants déjà existants : des VDC 2D pour l'application des textures, des processeurs dédiés pour la géométrie. Les unités de calcul de la géométrie étaient généralement implémentées avec un ou plusieurs processeurs dédiés. Vu qu'on savait déjà effectuer le rendu géométrique en logiciel, pas besoin de créer un circuit sur mesure. Il suffisait de dédier un processeur spécialisé rien que pour les calculs géométriques et on lui faisait exécuter un code déjà bien connu à la base. En clair, ils utilisaient un code spécifique pour émuler un circuit fixe. C'était clairement la solution la plus adaptée pour l'époque. Les unités géométriques étaient des processeurs RISC, normalement utilisés dans l'embarqué ou sur des serveurs. Elles utilisaient parfois des DSP. Pour rappel, les DSP des processeurs de traitement de signal assez communs, pas spécialement dédiés aux rendu 3D, mais spécialisé dans le traitement de signal audio, vidéo et autre. Ils avaient un jeu d'instruction assez proche de celui des cartes graphiques actuelles, et supportaient de nombreuses instructions utiles pour le rendu 3D. [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] Le rendu direct a été utilisé dans la période de transition entre rendu 2D et rendu 3D, car il était très adapté pour faire cette transition. Coupler un VDC à un processeur pour la géométrie était particulièrement simple à l'époque. Le rendu direct a été utilisé sur des bornes d'arcade dès les années 90. Outre les bornes d'arcade, quelques consoles de 5ème génération utilisaient le rendu direct, avec les mêmes solutions matérielles. La géométrie était calculée sur plusieurs processeurs dédiés. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. Deux consoles étaient dans ce cas : la 3DO, et la Sega Saturn. Le rendu direct est aujourd'hui abandonné. ===Le placage de textures inverse=== Le rendu précédent, le rendu direct, permet d'appliquer des textures directement dans le ''framebuffer''. Mais comme dit plus haut, il existe une seconde technique pour plaquer des textures, appelé le '''placage de texture inverse''', aussi appelé l'''UV Mapping''. Elle associe une texture complète pour un modèle 3D,contrairement au placage de tecture direct qui associe une texture par ''quad''/triangle. L'idée est que l'on attribue un texel à chaque sommet. Plus précisémment, chaque sommet est associé à des '''coordonnées de texture''', qui précisent quelle texture appliquer, mais aussi où se situe le texel à appliquer dans la texture. Par exemple, la coordonnée de texture peut dire : je veux le pixel qui est à ligne 5, colonne 27 dans cette texture. La correspondance entre texture et géométrie est réalisée lorsque les créateurs de jeu vidéo conçoivent le modèle de l'objet. [[File:Texture Mapping example.png|centre|vignette|upright=2|Exemple de placage de texture.]] Dans les faits, on n'utilise pas de coordonnées entières de ce type, mais deux nombres flottants compris entre 0 et 1. La coordonnée 0,0 correspond au texel en bas à gauche, celui de coordonnée 1,1 est tout en haut à droite. L'avantage est que ces coordonnées sont indépendantes de la résolution de la texture, ce qui aura des avantages pour certaines techniques de rendu, comme le ''mip-mapping''. Les deux coordonnées de texture sont notées u,v avec DirectX, ou encore s,t dans le cas général : u est la coordonnée horizontale, v la verticale. [[File:UVMapping.png|centre|vignette|upright=2|UV Mapping]] Avec le placage de texture inverse, la rastérisation se fait grosso-modo en trois étapes : la rastérisation proprement dite, le placage de textures, et les opérations finales qui écrivent un pixel dans le ''framebuffer''. Au niveau du matériel, ainsi que dans la plupart des API 3D, les trois étapes sont réalisées par des circuits séparés. [[File:01 3D-Rasterung-a.svg|vignette|Illustration du principe de la rasterization. La surface correspondant à l'écran est subdivisée en pixels carrés, de coordonnées x et y. La caméra est placée au point e. Pour chaque pixel, on trace une droite qui part de la caméra et qui passe par le pixel considéré. L'intersection entre une surface et cette droite se fait en un point, appartenant à un triangle.]] Lors de la rasterisation, chaque triangle se voit attribuer un ou plusieurs pixels à l'écran. Pour bien comprendre, imaginez une ligne droite qui part de caméra et qui passe par un pixel sur le plan de l'écran. Cette ligne intersecte 0, 1 ou plusieurs objets dans la scène 3D. Les triangles situés ces intersections entre cette ligne et les objets rencontrés seront associés au pixel correspondant. L'étape de rastérisation prend en entrée un triangle et renvoie la coordonnée x,y du pixel associé. Il s'agit là d'une simplification, car un triangle tend à occuper plusieurs pixels sur l'écran. L'étape de rastérisation fournit la liste de tous les pixels occupés par un triangle, et les traite un par un. Quand un triangle est rastérisé, le rasteriseur détermine la coordonnée x,y du premier pixel, applique une texture dessus, puis passe au suivant, et rebelote jusqu'à ce que tous les pixels occupés par le triangles aient été traités. L'implémentation matérielle du placage de texture inverse est beaucoup plus complexe que pour les autres techniques. Pour être franc, nous allons passer le reste du cours à parler de l'implémentation matérielle du placage de texture inverse, ce qui prendra plus d'une dizaine de chapitres. ==La transparence, les fragments et les ROPs== Dans ce qui suit, nous allons parler uniquement de la rastérisation avec placage de textures inverse. Les autres formes de rastérisation ne seront pas abordées. La raison est que tous les GPUs modernes utilisent cette forme de rastérisation, les exceptions étant rares. De même, ils utilisent un tampon de profondeur, pour l'élimination des surfaces cachées. La rastérisation effectue donc des calculs géométriques, suivis d'une étape de rastérisation, puis de placage des textures. Ces trois étapes sont réalisées par une unité géométrique, une unité de rastérisation, et un circuit de placage de textures. Du moins sur le principe, car les cartes graphiques modernes ont fortement optimisé l'implémentation et n'ont pas hésité à fusionner certains circuits. Mais nous verrons cela en temps voulu, nous n'allons pas résumer plusieurs décennies d'innovation technologique en quelques paragraphes. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures |} Mais où mettre le tampon de profondeur ? Intuitivement, on se dit qu'il vaut mieux faire l'élimination des surfaces cachées le plus tôt possible, dès que la coordonnée de profondeur est connue. Et elle est connu à l'étape de rastérisation, une fois les sommets transformés. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Tampon de profondeur | Placage de textures |} En réalité, la profondeur des fragments est gérée par un circuit appelé le '''''Raster Operations Pipeline''''' (ROP), situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo. Il est placé à la fin du pipeline pour gérer correctement la transparence. Et nous allons voir pourquoi la transparence est gérée à la fin du pipeline. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} ===Le mélange ''alpha''=== La transparence se manifeste quand plusieurs objets sont l'un derrière l'autre. Histoire de simplifier les explications, nous allons d'abord voir le cas où un objet semi-transparent est devant un objet opaque. La couleur perçue est alors un mélange de la couleur de l'objet opaque et celle de l'objet semi-transparent. Le mélange dépend d'à quel point l'objet semi-transparent est transparent. Avec un objet parfaitement transparent, seul l'objet opaque est visible. Avec un objet à moitié transparent, la couleur finale sera pour moitié celle de l'objet opaque, pour moitié celle de l'objet semi-transparent. Et c'est pareil pour les cas intermédiaires entre un objet totalement transparent et un objet totalement opaque. La transparence d'un objet/pixel est définie par un nombre, appelé la '''composante ''alpha'''''. Plus la composante alpha est élevée, plus le pixel est opaque. Elle vaut 0 pour un objet opaque et 1 pour un objet transparent. Elle est ajoutée aux composantes RGB, ce qui fait que tout fragment contient une "couleur de transparence" en plus des couleurs RGB. Elle agit comme un coefficient qui dit comment mélanger la couleur d'un objet transparent et d'un objet opaque. Le calcul de la transparence est une moyenne pondérée par la composante alpha. On parle alors d''''''alpha blending'''''. : <math>\text{Couleur finale} = \alpha \times \text{Couleur de l'objet transparent} + (1 - \alpha) \times \text{Couleur de l'objet opaque}</math> [[File:Texture splatting.png|centre|vignette|upright=2.0|Calcul de transparence. La première ligne montre le produit pour l'objet transparent, la seconde ligne est celle de l'objet opaque. La troisième ligne est celle de l'addition finale.]] Maintenant, qu'en est-il du cas où plusieurs objets sont superposés ? Si vous tracez une demi-droite dont l'origine est la caméra et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points, un point par objet sur la ligne du regarde. Sans transparence, l'objet le plus proche cache tous les autres et c'est donc lui qui décide de la couleur du pixel. Mais avec un objet transparent, la couleur finale est un mélange de la couleur de plusieurs points d'intersection. Il faut donc calculer un pseudo-pixel pour chaque point d'intersection, auquel on donne le nom de '''fragment'''. Un fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont combinés pour obtenir la couleur finale de ce pixel. Il est possible d'utiliser le mélange ''alpha'' pour cela. Il suffit de faire le mélange ''alpha'' entre le fragment qui vient d'être calculé, et le pixel dans le ''framebuffer''. Pour cela, le fragment a une composante ''alpha'', qui est ajouté aux trois couleurs RGB. Le pixel déjà dans le ''framebuffer'' est un résultat temporaire, né du mélange ''alpha'' de tous les fragments précédents. Un défaut de cette méthode est qu'elle fonctionne assez mal avec un tampon de profondeur. Si le tampon de profondeur est activé, le mélange ''alpha'' ne fonctionne que si les objets sont rendus du plus lointain au plus proche. Et procéder dans cet ordre a un défaut : on dessine des objets dans le ''framebuffer'', pour qu'ensuite les objets devant écrasent ce qui a déjà été dessiné. Un même pixel peut donc être dessiné plusieurs fois, dont une seule sera pertinente. Et ces écritures utilisent de la bande passante mémoire, qui est une ressource précieuse sur un GPU moderne. Il s'agit d'un phénomène appelé '''''overdraw''''', ou sur-dessinage en français. Quelques optimisations permettent d'éliminer l'''overdraw'' en rendant les objets du plus proche au plus lointain, d'autres permettent de dessiner des objets dans un ordre arbitraire, mais nous ne pouvons pas en parler ici. Beaucoup de moteurs 3D rendent séparément les objets opaques et transparents. Une première passe rend les objets opaques, puis les objets transparents sont rendus dans une seconde passe. Les objets opaques sont rendus dans le désordre, ce qui fait qu'on n'a pas à les trier, alors que les objets transparents doivent être triés selon leur distance. un autre avantage est que le mélange ''alpha'' est désactivé lors de la première passe, alors que c'est la mise à jour du tampon de profondeur qui est désactivé lors de la seconde passe, ce qui augmente un peu les performances dans les deux cas. ===Le test ''alpha''=== Le test ''alpha'' est une technique qui permet d'annuler le rendu d'un fragment en fonction de sa transparence. Si la composante alpha est en-dessous ou au-dessus d'un seuil, le fragment est simplement abandonné. Le seuil en question est configurable, de même que la comparaison utilisée : on peut éliminer le fragment si sa transparence est au-dessus d'un certain seuil, en-dessous, égal, différent, etc. Il s'agit d'une optimisation qui est utile dans certains scénarios spécifiques. Par exemple, si l'objet a une transparence très élevée, du genre 95%, autant le compter comme complétement transparent, afin d'éviter des opérations de mélange ''alpha''. En effet, les opérations de mélange ''alpha'' sont très lentes, car elles demandent de faire des opérations de lecture-écriture en mémoire vidéo : on lit un pixel dans le ''framebuffer'', on applique le mélange ''alpha'' et on écrit le résultat en mémoire vidéo. L'''alpha test'' permet donc de gagner en performance au prix d'une baisse de la qualité d'image. Il y a cependant des cas où l'usage du test ''alpha'' est primordial, au-delà d'une question de performances. Un exemple classique est celui du rendu du feuillage dans un jeu 3D. Un feuillage est composé en assemblant plusieurs images de feuilles. Chaque feuille est un carré sur lequel on place une texture de feuille, qui est opaque pour la partie verte des feuilles, transparente pour le reste. Les carrés ne sont cependant pas superposés, mais s'intersectent fortement, ce qui fait que le mélange ''alpha'' ne donne pas de bons résultats. L'usage du test ''alpha'' permet d'obtenir un rendu correct. Pour d'informations via ce lien : * [https://bgolus.medium.com/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f Anti-aliased Alpha Test: The Esoteric Alpha To Coverage]. ===Les effets de brouillard=== Les '''effets de brouillard''' sont nécessaires dans certains jeux vidéo pour l'ambiance (pensez à des jeux d'horreur comme Silent Hill), mais ils ont surtout été utilisés pour économiser des calculs. L'idée est de ne pas calculer les graphismes au-delà d'une certaine distance, sans que cela se voie. Le ''view frustum'' utilise alors un plan limite, au-delà duquel on ne voit pas les objets. Mais ce plan limite donne une cassure inesthétique dans le rendu. Pour masquer cette cassure, les programmeurs ajoutaient un effet de brouillard. Les objets au-delà du plan limite étaient totalement dans le brouillard, puis ce brouillard se réduisait progressivement en se rapprochant de la caméra, avant de s'annuler à partir d'une certaine distance. Pour calculer le brouillard, on effectue un mélange ''alpha'' entre la couleur du pixel et une ''couleur de brouillard''. La différence est que l'on n'utilise pas la transparence pour faire le mélange, mais un '''coefficient de brouillard''', noté <math>\text{fog}(z)</math>. : <math>\text{Couleur finale} = \text{fog}(z) \times \text{Couleur de brouillard} + [ 1 - \text{fog}(z) ] \times \text{Couleur du pixel}</math> Le coefficient de brouillard dépend de la coordonnée de profondeur, de la distance du pixel par rapport à la caméra. Le brouillard démarre à une distance <math>z_{fog-start}</math>, et masque totalement les objets à partir d'une distance <math>z_{fog-end}</math>. Entre les deux, le coefficient de brouillard dépend de la distance. OpenGL autorise trois formules de calcul suivantes : : <math>\text{fog}(z) = \frac{z_{fog-end} - z}{z_{fog-end} - z_{fog-start}}</math> : <math>\text{fog}(z) = e^{- k \times z}</math> : <math>\text{fog}(z) = e^{- (k \times z)^2}</math> ==L'éclairage d'une scène 3D== L'éclairage d'une scène 3D calcule les ombres, mais aussi la luminosité de chaque pixel, ainsi que bien d'autres effets graphiques. Les algorithmes d'éclairage ont longtemps été implémentés directement en matériel, les cartes graphiques géraient l'éclairage dans des circuits spécialisés. Aussi, il est important de voir ces algorithmes d'éclairage. Il est possible d'implémenter l'éclairage à deux endroits différents du pipeline : juste avant la rastérisation, et après la rastérisation. ===Les sources de lumière et les couleurs associées=== L'éclairage d'une scène 3D provient de sources de lumières, comme des lampes, des torches, le soleil, etc. Il existe de nombreux types de sources de lumière, et nous n'allons parler que des principales. Elles sont au nombre de quatre et elles sont illustrées ci-dessous. [[File:3udUJ.gif|centre|vignette|upright=2|Types de sources de lumière.]] [[File:Graphics lightmodel directional.png|vignette|upright=1.0|Source de lumière directionnelle.]] Les '''sources directionnelles''' servent à modéliser des sources de lumière très éloignées, comme le soleil ou la lune. Elles sont simplement définies par un vecteur qui indique la direction de la lumière, rien de plus. Les '''sources ponctuelles''' sont des points, qui émettent de la lumière dans toutes les directions. Elles sont définies par une position, et une intensité lumineuse, éventuellement la couleur de la lumière émise. Il existe deyux types de sources de lumière ponctuelles. * Le premières émettent de manière égale dans toutes les directions. Elles sont appelées des ''point light'' dans le schéma du dessus. * Les secondes émettent de la lumière dans une '''direction privilégiée'''. L'exemple le plus parlant est celui d'une lampe-torche : elle émet de la lumière "tout droit", dans la direction où la lampe est orientée. Elles sont appelées des ''sport light'' dans le schéma du dessus. La direction privilégiée est un vecteur, notée v dans le schéma du dessous. [[File:Graphics lightmodel ambient.png|vignette|upright=1.0|Lumière ambiante.]] En théorie, la lumière rebondit sur les surfaces et a tendance à se disperser un peu partout à force de rebondir. C'est ce qui explique qu'on arrive à voir à l'intérieur d'une pièce si une fenêtre est ouverte. Il en résulte un certain '''éclairage ambiant''', qui est assez difficile à représenter dans un moteur de rendu 3D. Auparavant, l'éclairage ambiant était simulé par une lumière égale en tout point de la scène 3D, appelée simplement la '''lumière ambiante'''. Précisément, on suppose que la lumière ambiante en un point vient de toutes les directions et a une intensité constante, identique dans toutes les directions. Le tout est illustré ci-contre. C'est assez irréaliste, mais ça donne une bonne approximation de la lumière ambiante. ===La lumière incidente : le terme géométrique=== Pour simplifier, nous allons supposer que l'éclairage est calculé pour chaque sommet, pas par triangle. C'est de loin le cas le plus courant, aussi ce n'est pas une simplification abusive. La lumière qui arrive sur un sommet est appelée la '''lumière incidente'''. La couleur d'un sommet dépend de deux choses : la lumière incidente directe, comment il réfléchit cette lumière. Mathématiquement, il est possible de résumer cela avec le produit de deux termes : l'intensité de la lumière incidente, une fonction qui indique comment la surface réfléchit la lumière incidente. La fonction en question est appelée la '''réflectivité bidirectionnelle'''. Le terme anglais est ''bidirectional reflectance distribution function'', abrévié en BRDF, et nous utiliserons cette abréviation dans ce qui suit. : <math>\text{Couleur finale} = \text{Lumière incidente} \times BRDF(...)</math> La lumière incidente vient soit directement des sources de lumière, soit de la lumière qui a rebondit sur d'autres objets proches. La première est appelée la lumière directe, celle qui vient des rebonds s'appelle la lumière indirecte. Pour simplifier, la lumière indirecte est gérée par la lumière ambiante, nous passons sous silence les techniques d'illumination globale. En clair : nous allons nous limiter au cas où la lumière incidente vient directement d'une source de lumière, pas d'un rebond. Intuitivement, la lumière incidente est simplement égale à l'intensité de la source de lumière. Sauf que ce n'est qu'une approximation, et une assez mauvaise. En réalité, l'approximation est bonne si la lumière arrive proche de la verticale, mais elle est d'autant plus mauvaise que la lumière arrive penchée, voire rasante. La raison : la lumière incidente sera étalée sur une surface plus grande, si elle arrive penchée. Si vous vous souvenez de vos cours de collège, c'est le même principe qui explique les saisons. La lumière du soleil est proche de la verticale en été, mais est de plus en plus penché quand on s'avance vers l'Hiver. La lumière solaire est donc étalée sur une surface plus grande, ce qui fait qu'un point de la surface recevra moins de lumière, celle-ci étant diluée, étalée. [[File:Radiación solar.png|centre|vignette|upright=2|Exemple avec la lumière solaire.]] [[File:Angle of incidence.svg|vignette|upright=1|Angle d'incidence.]] En clair, tout dépend de l''''angle d'incidence''' de la lumière. Reste à voir comment calculer cet angle. La lumière incidente est définie par un vecteur, qui part de la source de lumière et atterrit sur le sommet considéré. Imaginez simplement que ce vecteur suit un rayon lumineux provenant de la source de lumière. Le vecteur pour la lumière incidente sera noté L. L'angle d'incidence est l'angle que fait ce vecteur avec la verticale de la surface, au niveau du sommet considéré. [[File:Graphics lightmodel ptsource.png|vignette|Normale de la surface.]] Pour cela, les calculs d'éclairage ont besoin de connaitre la verticale d'un sommet. Un sommet est donc associé à un vecteur, appelé la '''normale''', qui indique la verticale en ce point. Deux sommets différents peuvent avoir deux normales différentes, même s'ils sont proches. Elles sont d'autant plus différentes que la surface est rugueuse, non-lisse. La normale est prédéterminée lors de la création du modèle 3D, il n'y a pas besoin de le calculer. Par contre, elle est modifiée lors de l'étape de transformation, quand on place le modèle 3D dans la scène 3D. Les deux autres vecteurs sont à calculer à chaque image, car ils changent quand on bouge le sommet. La lumière qui arrive sur la surface dépend de l'angle entre la normale et le vecteur L. Précisément, elle dépend du cosinus de cet angle. En multipliant ce cosinus avec l'intensité de la lumière, on a la lumière arrivante. La couleur finale d'un pixel est donc : : <math>\text{Couleur finale} = I \times \cos{(N, L)} \times BRDF(...)</math> Le terme <math>I \times \cos{N, L}</math> ne dépend pas de la surface considérée. Juste de la position de la source de lumière, de la position du sommet et de son orientation par rapport à la lumière. Aussi, il est parfois appelé le '''terme géométrique''', en opposition aux propriétés de la surface. Les propriétés de la surface sont définies par un '''''material''''', qui indique comment il réfléchit la lumière, ainsi que sa texture. ===Le produit scalaire de deux vecteurs=== Calculer le terme géométrique demande de calculer le cosinus d'un angle. Et il n'est pas le seul : les autres calculs d'éclairage que nous allons voir demandent de calculer des cosinus. Or, les calculs trigonométriques sont très gourmands pour le GPU. Pour éviter le calcul d'un cosinus, les GPU utilisent une opération mathématique appelée le ''produit scalaire''. Le produit scalaire agit sur deux vecteurs, que l'on notera A et B. Un produit scalaire prend : la longueur des deux vecteurs, et l'angle entre les deux vecteurs noté <math>\omega</math>. Le produit scalaire est équivalent à la formule suivante : : <math>\text{Produit scalaire de deux vecteurs A et B} = \vec{A} \cdot \vec{B} = A \times B \times \cos{(\omega)}</math>, avec A et B la longueur des deux vecteurs A et B. L'avantage est que le produit scalaire se calcule simplement avec des additions, soustractions et multiplications, des opérations que les cartes graphiques savent faire très facilement. Le produit scalaire de deux vecteurs de coordonnées x,y,z est le suivant : : <math>\vec{A} \cdot \vec{B} = x_A \times x_B + y_A \times y_B + z_A \times z_B</math> En clair, on multiplie les coordonnées identiques, et on additionne les résultats. Rien de compliqué. Un avantage est que tous les vecteurs vus précédemment sont normalisés, à savoir qu'ils ont une longueur qui vaut 1. Ainsi, le calcul du produit scalaire devient équivalent au calcul du produit scalaire. ===La réflexion de la lumière sur la surface=== [[File:Ray Diagram 2.svg|vignette|Reflection de la lumière sur une surface parfaitement lisse.]] Maintenant que nous venons de voir le terme géométrique, voyons le BRDF, qui définit comment la surface de l'objet 3D réfléchit la lumière. Vos cours de collège vous ont sans doute appris que la lumière est réfléchie avec le même angle d'arrivée. L'angle d'incidence et l'angle de réflexion sont égaux, comme illustré ci-contre. On parle alors de '''réflexion parfaite'''. Mais cela ne vaut que pour une surface parfaitement lisse, comme un miroir parfait. Dans la réalité, une surface a tendance à renvoyer des rayons dans toutes les directions. La raison est qu'une surface réelle est rugueuse, avec de petites aspérités et des micro-reliefs, qui renvoient la lumière dans des directions "aléatoires". La lumière « rebondit » sur la surface de l'objet et une partie s'éparpille dans un peu toutes les directions. On parle alors de '''réflexion diffuse'''. {| |- |[[File:Dioptre reflexion diffuse speculaire refraction.svg|vignette|upright=1.4|Différence entre réflexion diffuse et spéculaire.]] |[[File:Diffuse reflection.svg|vignette|upright=1|Réflexion diffuse.]] |} Maintenant, imaginons que la surface n'ait qu'une réflexion diffuse, pas d'autres formes de réflexion. Et imaginons aussi que cette réflexion diffuse soit parfaite, à savoir que la lumière réfléchie soit renvoyée à l'identique dans toutes les directions, sans aucune direction privilégiée. On a alors le ''material'' le plus simple qui soit, appelé un '''''diffuse material'''''. Vu que la lumière est réfléchie à l'identique dans toutes les directions, elle sera identique peu importe où on place la caméra. La lumière finale ne dépend donc que des propriété de la surface, que de sa couleur. En clair, il suffit de donner une '''couleur diffuse''' à chaque sommet. La couleur diffuse est simplement multipliée par le terme géométrique, pour obtenir la lumière réfléchie finale. Rien de plus, rien de moins. Cela donne l'équation suivante, avec les termes suivants : * L est le vecteur pour la lumière incidente ; * N est la normale du sommet ; * I est l'intensité de la source de lumière ; * <math>C_d</math> est la couleur diffuse. : <math>\text{Illumination diffuse} = C_d \times \left[ I \times (\vec{N} \cdot \vec{L}) \right]</math> Rajoutons maintenant l'effet de la lumière ambiante à un ''material'' de ce genre. Pour rappel, la lumière ambiante vient de toutes les directions à part égale, ce qui fait que son angle d'incidence n'a donc pas d'effet. L'intensité de la lumière ambiante est déterminée lors de la création de la scène 3D, c'est une constante qui n'a pas à être calculée. Pour obtenir l'effet de la lumière ambiante sur un objet, il suffit de multiplier sa couleur diffuse par l'intensité de la lumière ambiante. Cependant, de nombreux moteurs de jeux ajoutent une '''couleur ambiante''', différente de la couleur diffuse. : <math>\text{Illumination ambiante} = C_a \times I_a</math> avec <math>C_a</math> la couleur ambiante du point de surface et <math>I_a</math> l'intensité de la lumière ambiante. En plus de la réflexion diffuse parfaite, de nombreux matériaux ajoutent une '''réflexion spéculaire''', qui n'est pas exactement la réflexion parfaite, en est très proche. Les rayons réfléchis sont très proches de la direction de réflexion parfaite, et s'atténuent très vite en s'en éloignant. Le résultat ressemble à une sorte de petit "point blanc", très lumineux, orienté vers la source de lumière, appelé le '''''specular highlight'''''. La réflexion diffuse est prédominante pour les matériaux rugueux, alors que la réflexion spéculaire est dominante sur les matériaux métalliques ou très lisses. [[File:Phong components version 4.png|centre|vignette|upright=3.0|Couleurs utilisées dans l'algorithme de Phong.]] [[File:Phong Vectors.svg|vignette|Vecteurs utilisés dans l'algorithme de Phong (et dans le calcul de l'éclairage, de manière générale).]] Pour calculer la réflexion spéculaire, il faut d'abord connaitre le vecteur pour la réflexion parfaite, que nous noterons R dans ce qui suit. Le vecteur R peut se calculer avec la formule ci-dessous : : <math>\vec{R} = 2 (\vec{L} \cdot \vec{N}) \times \vec{N} - \vec{L} </math> La réflexion spéculaire dépend de l'angle entre la direction du regard et la normale : plus celui-ci est proche de l'angle de réflexion parfaite, plus la réflexion spéculaire sera intense. Le vecteur pour la direction du regard sera noté V, pour vue ou vision. La réflexion spéculaire est une fonction qui dépend de l'angle entre les vecteurs R et V. Le calcul de la réflexion spéculaire utilise une '''couleur spéculaire''', qui est l'équivalent de la couleur diffuse pour la réflexion spéculaire. : <math>\text{BRDF spéculaire} = C_s \times f(\vec{R} \cdot \vec{V}) </math> La fonction varie grandement d'un modèle de calcul spéculaire à l'autre. Aussi, je ne rentre pas dans le détail. L'essentiel est que vous compreniez que le calcul de l'éclairage utilise de nombreux calculs géométriques, réalisés avec des produits scalaires. Les calculs géométriques utilisent la couleur d'un sommet, la normale du sommet, et le vecteur de la lumière incidente. Les autres informations sont calculées à l'exécution. ===Les algorithmes d'éclairage basiques : par triangle, par sommet et par pixel=== Dans tout ce qui a été dit précédemment, l'éclairage est calculé pour chaque sommet. Il attribue une illumination/couleur à chaque sommet de la scène 3D, ce qui fait qu'on parle d''''éclairage par sommet''', ou ''vertex lighting''. Il est assez rudimentaire et donne un éclairage très brut, mais il peut être réalisé avant l'étape de rastérisation. Mais une fois qu'on a obtenu la couleur des sommets, reste à colorier les triangles. Et pour cela, il y a deux manières de faire, qui sont appelées l'éclairage plat et l'éclairage de Gouraud. [[File:D3D Shading Triangles.png|vignette|Dans ce dessin, le triangle a un sommet de couleur bleu foncé, un autre de couleur rouge et un autre de couleur bleu clair. L’interpolation plate et de Gouraud donnent des résultats bien différents.]] L''''éclairage plat''' calcule l'éclairage triangle par triangle. Il y a plusieurs manières de faire pour ça, mais la plus simple colorie un triangle avec la couleur moyenne des trois sommets. Une autre possibilité fait les calculs d'éclairage triangle par triangle, en utilisant une normale par triangle et non par sommet, idem pour les couleurs ambiante/spéculaire/diffuse. Mais c'est plus rare car cela demande de placer la normale quelque part dans le triangle, ce qui rajoute des informations. L''''éclairage de Gouraud''' effectue lui aussi une moyenne de la couleur de chaque sommet, sauf que celle-ci est pondérée par la distance du sommet avec le pixel. Plus le pixel est loin d'un sommet, plus son coefficient est petit. Typiquement, le coefficient varie entre 0 et 1 : de 1 si le pixel est sur le sommet, à 0 si le pixel est sur un des sommets adjacents. La moyenne effectuée est généralement une interpolation bilinéaire, mais n'importe quel algorithme d'interpolation peut marcher, qu'il soit simplement linéaire, bilinéaire, cubique, hyperbolique. L'étape d'interpolation est prise en charge par l'étape de rastérisation, qui effectue cette moyenne automatiquement. L'éclairage par sommet a eu son heure de gloire, mais il est maintenant remplacé par l''''éclairage par pixel''' (''per-pixel lighting''), qui calcule l'éclairage pixel par pixel. En clair, l’éclairage est finalisé après l'étape de rastérisation, il ne se fait pas qu'au niveau de la géométrie. Il existe plusieurs types d'éclairage par pixel, mais on peut les classer en deux grands types : l'éclairage de Phong et le ''bump/normal mapping''. L''''éclairage de Phong''' calcule l'éclairage pixel par pixel. Avec cet algorithme, la géométrie n'est pas éclairée : les couleurs des sommets ne sont pas calculées. A la place, les normales sont envoyées à l'étape de rastérisation, qui effectue une opération d'interpolation, qui renvoie une normale pour chaque pixel. Les calculs d'éclairage utilisent alors ces normales pour faire les calculs d'éclairage pour chaque pixel. La technique du '''''normal mapping''''' est assez simple à expliquer, sans compter que plusieurs cartes graphiques l'ont implémentée directement dans leurs circuits. Là où l'éclairage de Phong interpole les normales pour chaque pixel, le ''normal-mapping'' précalcule les normales d'une surface dans une texture, appelée la ''normal-map''. Lors des calculs d'éclairage, la carte graphique lit les normales adéquates directement depuis cette texture, puis fait les calculs d'éclairage avec. [[File:WallSimpleAndNormalMapping.png|centre|vignette|upright=2|Différence sans et avec ''normal-mapping''.]] Avec cette technique, l'éclairage n'est pas géré par pixel, mais par texel, ce qui fait qu'il a une qualité de rendu un peu inférieure à un vrai éclairage de Phong, mais bien supérieure à un éclairage par sommet. Par contre, les techniques de ''normal mapping'' permettent d'ajouter du relief et des détails sur des surfaces planes en jouant sur l'éclairage. Elles permettent ainsi de simplifier grandement la géométrie rendue, tout en utilisant l'éclairage pour compenser. [[File:Bump mapping.png|centre|vignette|upright=2|Bump mapping]] L'éclairage par pixel a une qualité d'éclairage supérieure aux techniques d'éclairage par sommet, mais il est aussi plus gourmand. L'éclairage par pixel est utilisé dans presque tous les jeux vidéo depuis DOOM 3, en raison de sa meilleure qualité, mais cela n'aurait pas été possible si le matériel n'avait pas évolué de manière à incorporer des algorithmes d'éclairage matériel assez puissants, avant de basculer sur un éclairage programmable. La différence entre l'éclairage par pixel et par sommet se voit assez facilement à l'écran. L'éclairage plat donne un éclairage assez carré, avec des frontières assez nettes. L'éclairage de Gouraud donne des ombres plus lisses, dans une certaine mesure, mais pèche à rendre correctement les reflets spéculaires. L'éclairage de Phong est de meilleure qualité, surtout pour les reflets spéculaires. es trois algorithmes peuvent être implémentés soit dans la carte graphique, soit en logiciel. Nous verrons comment les cartes graphiques peuvent implémenter ces algorithmes, dans les deux prochains chapitres. {| |- |[[File:Per face lighting.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting.png|vignette|upright=1|Phong Shading]] |- |[[File:Per face lighting example.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting example.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting example.png|vignette|upright=1|Phong Shading]] |} ===Les ''shaders'' : des programmes exécutés sur le GPU=== Maintenant que nous venons de voir les algorithmes d'éclairages, il est temps de voir comment les réaliser sur une carte graphique. Nous venons de voir qu'il y a une différence entre l'éclairage par pixel et par sommet. Intuitivement, l'éclairage par sommet devrait se faire avec les calculs géométriques, alors que l'éclairage par pixel devrait se faire après avoir appliqué les textures. Les toutes premières cartes graphiques ne géraient ni l'éclairage par sommet, ni l'éclairage par pixel. Elles laissaient les calculs géométriques au CPU. Par la suite, la Geforce 256 a intégré '''circuit de ''Transform & Lightning''''', qui s'occupait de tous les calculs géométriques, éclairage par sommet inclus (d'où le L de T&L). Elle gérait alors l'éclairage par sommet, mais un algorithme particulier, qui n'était pas très flexible. Il ne gérait que des ''material'' bien précis (des ''Phong materials''), rien de plus. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Unité de T&L : géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} L'amélioration suivante est venue sur la Geforce 3 : l'unité de T&L est devenue programmable. Au vu le grand nombre d'algorithmes d'éclairages possibles et le grand nombre de ''materials'' possibles, c'était la seule voie possibles. Les programmeurs pouvaient programmer leurs propres algorithmes d'éclairage par sommet, même s'ils devaient aussi programmer les étapes de transformation et de projection. Mais nous détaillerons cela dans un chapitre dédié sur l'historique des GPUs. Ce qui est important est que la Geforce 3 a introduit une fonctionnalité absolument cruciale pour le rendu 3D moderne : les '''''shaders'''''. Il s'agit de programmes informatiques exécutés par la carte graphique, qui servaient initialement à coder des algorithmes d'éclairage. D'où leur nom : ''shader'' pour ''shading'' (éclairage en anglais). Cependant, l'usage modernes des shaders dépasse le cadre des algorithmes d'éclairage. L'avantage est que cela simplifie grandement l'implémentation des algorithmes d'éclairage. Pas besoin de les intégrer dans la carte graphique pour les utiliser, pas besoin d'un circuit distinct pour chaque algorithme. Sans shaders, si la carte graphique ne gère pas un algorithme d'éclairage, on ne peut pas l'utiliser. A la rigueur, il est parfois possible de l'émuler avec des contournements logiciels, mais au prix de performances souvent désastreuses. Avec des shaders, il est possible de programmer l'algorithme d'éclairage de notre choix, pour l'exécuter sur la carte graphique, avec des performances plus que convenables. [[File:Implémentation de l'éclairage sur les cartes graphiques.png|vignette|Implémentation de l'éclairage sur les cartes graphiques]] Il existe plusieurs types de shaders, mais les deux principaux sont les '''''vertex shaders''''' et les '''''pixel shaders'''''. Les pixels shaders s'occupent de l'éclairage par pixel, leur nom est assez parlent. Les vertex shaders s'occupent de l'éclairage par sommet, mais aussi des étapes de transformation/projection. Je parle bien des trois étapes de transformation vues plus haut, qui effectuent des calculs de transformation de coordonnées avec des matrices. La raison à cela est que les calculs de transformation ressemblent beaucoup aux calculs d'éclairage par sommet. Ils impliquent tous deux des calculs vectoriels, comme des produits scalaires et des produits vectoriels, qui agissent sur des sommets/triangles. Si la carte graphique incorpore un processeur de shader capable de faire de tels calculs, alors il peut servir pour les deux. Pour implémenter les shaders, il a fallu ajouter des processeurs à la carte graphique. Les processeurs en question exécutent les shaders, ils peuvent lire ou écrire dans des textures, mais ne font rien d'autres. Les ''vertex shaders'' font tout ce qui a trait à la géométrie, ils remplacent l'unité de T&L. Les pixels shaders sont entre la rastérisation et les ROPs, ils sont très liés à l'unité de texture. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | rowspan="2" class="f_rouge" | ''Vertex shader'' | rowspan="2" | Rastérisation | Placage de textures | rowspan="2" |''Raster Operations Pipeline'' |- | class="f_rouge" | ''Pixel shader'' |} {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage des anciens PC | prevText=Les cartes d'affichage des anciens PC | next=Avant les GPUs : les cartes accélératrices 3D | nextText=Avant les GPUs : les cartes accélératrices 3D }}{{autocat}} jcuu99bjd1det8429dzne5e6cilz61f 764868 764867 2026-04-24T17:47:21Z Mewtow 31375 /* La caméra : le point de vue depuis l'écran */ 764868 wikitext text/x-wiki Le premier jeu à utiliser de la "vraie 3D" texturée fut le jeu Quake, premier du nom. Et depuis sa sortie, la grande majorité des jeux vidéo utilisent de la 3D, même s'il existe encore quelques jeux en 2D. Face à la prolifération des jeux vidéo en 3D, les fabricants de cartes graphiques ont inventé les cartes accélératrices 3D, des cartes vidéo capables d'accélérer le rendu en 3D. Dans ce chapitre, nous allons voir comment elles fonctionnent et comment elles ont évolué dans le temps. Pour comprendre comment celles-ci fonctionnent, il faut faire quelques rapides rappels sur les bases du rendu 3D. ==Les bases du rendu 3D== Une '''scène 3D''' est composée d'un espace en trois dimensions, dans laquelle le moteur d’un jeu vidéo place des objets et les fait bouger. Cette scène est, en première approche, un simple parallélogramme. Un des coins de ce parallélogramme sert d’origine à un système de coordonnées : il est à la position (0, 0, 0), et les axes partent de ce point en suivant les arêtes. Les objets seront placés à des coordonnées bien précises dans ce parallélogramme. ===Les objets 3D et leur géométrie=== <noinclude>[[File:Dolphin triangle mesh.png|vignette|Illustration d'un dauphin, représenté avec des triangles.]]</noinclude> Dans la quasi-totalité des jeux vidéo actuels, les objets et la scène 3D sont modélisés par un assemblage de triangles collés les uns aux autres, ce qui porte le nom de '''maillage''', (''mesh'' en anglais). Il a été tenté dans le passé d'utiliser des quadrilatères (rendu dit en ''quad'') ou d'autres polygones, mais les contraintes techniques ont fait que ces solutions n'ont pas été retenues. [[File:CG WIKI.jpg|centre|vignette|upright=2|Exemple de modèle 3D.]] Les modèles 3D sont définis par leurs sommets, aussi appelés '''vertices''' dans le domaine du rendu 3D. Chaque sommet possède trois coordonnées, qui indiquent sa position dans la scène 3D : abscisse, ordonnée, profondeur. Les sommets sont regroupés en triangles, qui sont formés en combinant trois sommets entre eux. Les anciennes cartes graphiques géraient aussi d'autres formes géométriques, comme des points, des lignes, ou des quadrilatères. Les quadrilatères étaient appelés des ''quads'', et ce terme reviendra occasionnellement dans ce cours. De telles formes basiques, gérées nativement, sont appelées des '''primitives'''. La représentation exacte d'un objet est donc une liste plus ou moins structurée de sommets. La liste doit préciser les coordonnées de chaque sommet, ainsi que comment les relier pour former des triangles. Pour cela, l'objet est représenté par une structure qui contient la liste des sommets, mais aussi de quoi savoir quels sont les sommets reliés entre eux par un segment. Nous en dirons plus dans le chapitre sur le rendu de la géométrie. ===La caméra : le point de vue depuis l'écran=== Outre les objets proprement dit, on trouve une '''caméra''', qui représente les yeux du joueur. Cette caméra est définie au minimum par : * une position ; * par la direction du regard (un vecteur). A la caméra, il faut ajouter tout ce qui permet de déterminer le '''champ de vision'''. Le champ de vision contient tout ce qui est visible à l'écran. Et sa forme dépend de la perspective utilisée. Dans le cas le plus courant dans les jeux vidéos en 3D, il correspond à une '''pyramide de vision''' dont la pointe est la caméra, et dont les faces sont délimitées par les bords de l'écran. A l'intérieur de la pyramide, il y a un rectangle qui représente l'écran du joueur, appelé le '''''viewport'''''. <noinclude>[[File:ViewFrustum.jpg|centre|vignette|upright=2|Caméra.]]</noinclude> [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] La majorité des jeux vidéos ajoutent deux plans : * un ''near plane'' en-deça duquel les objets ne sont pas affichés. Il élimine du champ de vision les objets trop proches. * Un ''far plane'', un '''plan limite''' au-delà duquel on ne voit plus les objets. Il élimine les objets trop lointains. Avec ces deux plans, le champ de vision de la caméra est donc un volume en forme de pyramide tronquée, appelé le '''''view frustum'''''. Le tout est parfois appelée, bien que par abus de langage, la pyramide de vision. Avec d'autres perspectives moins utilisées, le ''view frustum'' est un pavé, mais nous n'en parlerons pas plus dans le cadre de ce cours car elles ne sont presque pas utilisés dans les jeux vidéos actuels. ===Les textures=== Tout objet à rendre en 3D est donc composé d'un assemblage de triangles, et ceux-ci sont éclairés et coloriés par divers algorithmes. Pour rajouter de la couleur, les objets sont recouverts par des '''textures''', des images qui servent de papier peint à un objet. Un objet géométrique est donc recouvert par une ou plusieurs textures qui permettent de le colorier ou de lui appliquer du relief. [[File:Texture+Mapping.jpg|centre|vignette|upright=2|Texture Mapping]] Notons que les textures sont des images comme les autres, codées pixel par pixel. Pour faire la différence entre les pixels de l'écran et les pixels d'une texture, on appelle ces derniers des '''texels'''. Ce terme est assez important, aussi profitez-en pour le mémoriser, nous le réutiliserons dans quelques chapitres. Un autre point lié au fait que les textures sont des images est leur compression, leur format. N'allez pas croire que les textures sont stockées dans un fichier .jpg, .png ou tout autre format de ce genre. Les textures utilisent des formats spécialisés, comme le DXTC1, le S3TC ou d'autres, plus adaptés à leur rôle de texture. Mais qu'il s'agisse d'images normales (.jpg, .png ou autres) ou de textures, toutes sont compressées. Les textures sont compressées pour prendre moins de mémoire. Songez que la compression de texture est terriblement efficace, souvent capable de diviser par 6 la mémoire occupée par une texture. S'en est au point où les textures restent compressées sur le disque dur, mais aussi dans la mémoire vidéo ! Nous en reparlerons dans le chapitre sur la mémoire d'une carte graphique. Plaquer une texture sur un objet peut se faire de deux manières, qui portent les noms de placage de texture inverse et direct. Le placage de texture direct a été utilisé au tout début de la 3D, sur des bornes d'arcade et les consoles de jeu 3DO, PS1, Sega Saturn. De nos jours, on utilise uniquement la technique de placage de texture inverse. Les deux seront décrites dans le détail plus bas. ===La différence entre rastérisation et lancer de rayons=== [[File:Render Types.png|vignette|Même géométrie, plusieurs rendus différents.]] Les techniques de rendu 3D sont nombreuses, mais on peut les classer en deux grands types : le ''lancer de rayons'' et la ''rasterization''. Sans décrire les deux techniques, sachez cependant que le lancer de rayon n'est pas beaucoup utilisé pour les jeux vidéo. Il est surtout utilisé dans la production de films d'animation, d'effets spéciaux, ou d'autres rendu spéciaux. Dans les jeux vidéos, il est surtout utilisé pour quelques effets graphiques, la rasterization restant le mode de rendu principal. La raison principale est que le lancer de rayons demande beaucoup de puissance de calcul. Une autre raison est que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Il a existé des cartes accélératrices permettant d'accélérer le rendu en lancer de rayons, mais elles sont restées confidentielles. Les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, mais ils restent d'un usage marginal et servent de compléments au rendu par rastérization. Un chapitre entier sera dédié aux cartes accélératrices de lancer de rayons et nous verrons pourquoi le lancer de rayons est difficile à implémenter avec des performances convenables, ce qui explique que les jeux vidéo utilisent la ''rasterization''. La rastérisation est structurée autour de trois étapes principales : * Une étape purement logicielle, effectuée par le processeur, où le moteur physique calcule la géométrie de la scène 3D. * Une étape de '''traitement de la géométrie''', qui gère tout ce qui a trait aux sommets et triangles. * Une étape de '''rastérisation''' qui détermine sur quels pixels de l'écran est affiché le triangle. * Une étape de '''traitement des pixels''', qui colorie les pixels et gère les textures. [[File:Graphics pipeline 2 en.svg|centre|vignette|upright=2.5|Pipeline graphique basique.]] Il existe plusieurs rendus différents et la rastérisation ne se fait pas de la même manière selon le rendu utilisé. Il existe des rendus sans textures, d'autres avec, d'autres avec éclairage, d'autres sans, etc. Par contre, l'étape de calcul de la géométrie est la même quel que soit le rendu ! Mieux : le calcul de la géométrie se fait de la même manière entre rastérisation et lancer de rayons, il est le même quelle que soit la technique de rendu 3D utilisée. Les trois étapes précédentes sont réalisées dans des circuits ou processeurs séparés, comme on le verra plus tard. Et cela permet d'utiliser la technique dite du '''pipeline'''. Concrètement, supposons que la carte graphique traite les données par paquets de triangles (en réalité, c'est des paquets de sommets, mais passons). L'étape de traitement de la géométrie peut travailler sur un paquet de triangle, pendant que le paquet précédent est dans l'étape de rastérisation, et que le paquet encore précédent est en train de traiter ses pixels. Cela permet de traiter trois paquets de triangles en même temps, mais à des états d'avancements différents. Mieux que cela : le traitement de la géométrie est lui-même composé d'une succession de sous-étapes, la rasterisation est elle-même découpée en plusieurs sous-étapes, et ainsi de suite. Le nombre d'étapes pour une carte graphique moderne dépasse la dizaine. La rastérisation calcule un rendu 3D avec une suite d'étapes consécutives qui doivent s'enchainer dans un ordre bien précis. L'ensemble de ces étapes est appelé le '''pipeline graphique''', qui sera détaillé dans ce qui suit. ==Le calcul de la géométrie== Le calcul de la géométrie regroupe plusieurs manipulations différentes. La principale demande juste de placer les modèles 3D dans la scène, de placer les objets dans le monde. Puis, il faut centrer la scène 3D sur la caméra. Les deux changements ont pour point commun de demander des changements de repères. Par changement de repères, on veut dire que l'on passe d'un système de coordonnées à un autre. En tout, il existe trois changements de repères distincts qui sont regroupés dans l''''étape de transformation''' : un premier qui place chaque objet 3D dans la scène 3D, un autre qui centre la scène du point de vue de la caméra, et un autre qui corrige la perspective. ===Les trois étapes de transformation=== La première étape place les objets 3D dans la scène 3D. Un modèle 3D est représentée par un ensemble de sommets, qui sont reliés pour former sa surface. Les données du modèle 3D indiquent, pour chaque sommet, sa position par rapport au centre de l'objet qui a les coordonnées (0, 0, 0). La première étape place l'objet 3D à une position dans la scène 3D, déterminée par le moteur physique, qui a des coordonnées (X, Y, Z). Une fois placé dans la scène 3D, le centre de l'objet passe donc des coordonnées (0, 0, 0) aux coordonnées (X, Y, Z) et tous les sommets de l'objet doivent être mis à jour. De plus, l'objet a une certaine orientation : il faut aussi le faire tourner. Enfin, l'objet peut aussi subir une mise à l'échelle : on peut le gonfler ou le faire rapetisser, du moment que cela ne modifie pas sa forme, mais simplement sa taille. En clair, le modèle 3D subit une translation, une rotation et une mise à l'échelle, les trois impliquant une modification des coordonnées des sommets.. [[File:Similarity and congruence transformations.svg|centre|vignette|upright=1.5|Transformations géométriques possibles pour chaque triangle.]] Une fois le placement des différents objets effectué, la carte graphique effectue un changement de coordonnées pour centrer le monde sur la caméra. Au lieu de considérer un des bords de la scène 3D comme étant le point de coordonnées (0, 0, 0), il va passer dans le référentiel de la caméra. Après cette transformation, le point de coordonnées (0, 0, 0) sera la caméra. La direction de la vue du joueur sera alignée avec l'axe de la profondeur (l'axe Z). [[File:View transform.svg|centre|vignette|upright=2|Étape de transformation dans un environnement en deux dimensions : avant et après. On voit que l'on centre le monde sur la position de la caméra et dans sa direction.]] Enfin, il faut aussi corriger la perspective, ce qui est le fait de l'étape de projection, qui modifie la forme du ''view frustum'' sans en modifier le contenu. Différents types de perspective existent et celles-ci ont un impact différent les unes des autres sur le ''view frustum''. Dans le cas qui nous intéresse, le ''view frustum'' passe d’une forme de trapèze tridimensionnel à une forme de pavé dont l'écran est une des faces. ===Les changements de coordonnées se font via des multiplications de matrices=== Les trois étapes précédentes demande de faire des changements de coordonnées, chaque sommet voyant ses coordonnées remplacées par de nouvelles. Or, un changement de coordonnée s'effectue assez simplement, avec des matrices, à savoir des tableaux organisés en lignes et en colonnes avec un nombre dans chaque case. Un changement de coordonnées se fait simplement en multipliant le vecteur (X, Y, Z) des coordonnées d'un sommet par une matrice adéquate. Il existe des matrices pour la translation, la mise à l'échelle, d'autres pour la rotation, une autre pour la transformation de la caméra, une autre pour l'étape de projection, etc. Un changement de coordonnée s'effectue assez simplement en multipliant le vecteur-coordonnées (X, Y, Z) d'un sommet par une matrice adéquate. Un petit problème est que les matrices qui le permettent sont des matrices avec 4 lignes et 4 colonnes. Or, la multiplication demande que le nombre de coordonnées du vecteur soit égal au nombre de colonnes. Pour résoudre ce petit problème, on ajoute une 4éme coordonnée aux sommets, la coordonnée homogène, qui ne sert à rien, et est souvent mise à 1, par défaut. Mais oublions ce détail. Il se trouve que multiplier des matrices amène certaines simplifications. Au lieu de faire plusieurs multiplications de matrices, il est possible de fusionner les matrices en une seule, ce qui permet de simplifier les calculs. Ce qui fait que le placement des objets, changement de repère pour centrer la caméra, et d'autres traitements forts différents sont regroupés ensemble. Le traitement de la géométrie implique, sans surprise, des calculs de géométrie dans l'espace. Et cela implique des opérations mathématiques aux noms barbares : produits scalaires, produits vectoriels, et autres calculs impliquant des vecteurs et/ou des matrices. Et les calculs vectoriels/matriciels impliquent beaucoup d'additions, de soustractions, de multiplications, de division, mais aussi des opérations plus complexes : calculs trigonométriques, racines carrées, inverse d'une racine carrée, etc. Au final, un simple processeur peut faire ce genre de calculs, si on lui fournit le programme adéquat, l'implémentation est assez aisée. Mais on peut aussi implémenter le tout avec un circuit spécialisé, non-programmable. Les deux solutions sont possibles, tant que le circuit dispose d'assez de puissance de calcul. Les cartes graphiques anciennes contenaient un ou plusieurs circuits de multiplication de matrices spécialisés dans l'étape de transformation. Chacun de ces circuits prend un sommet et renvoie le sommet transformé. Ils sont composés d'un gros paquet de multiplieurs et d'additionneurs flottants. Pour plus d'efficacité, les cartes graphiques comportent plusieurs de ces circuits, afin de pouvoir traiter plusieurs sommets en même temps. ==L'élimination des surfaces cachées== Un point important du rendu 3D est que ce que certaines portions de la scène 3D ne sont pas visibles depuis la caméra. Et idéalement, les portions de la scène 3D qui ne sont pas visibles à l'écran ne doivent pas être calculées. A quoi bon calculer des choses qui ne seront pas affichées ? Ce serait gâcher de la puissance de calcul. Et pour cela, de nombreuses optimisations visent à éliminer les calculs inutiles. Elles sont regroupées sous les termes de '''''clipping''''' ou de '''''culling'''''. La différence entre ''culling'' et ''clipping'' n'est pas fixée et la terminologie n'est pas claire. Dans ce qui va suivre, nous n'utiliserons que le terme ''culling''. Les cartes graphiques modernes embarquent diverses méthodes de ''culling'' pour abandonner les calculs quand elles s’aperçoivent que ceux-ci portent sur une partie non-affichée de l'image. Cela fait des économies de puissance de calcul assez appréciables et un gain en performance assez important. Précisons que le ''culling'' peut être plus ou moins précoce suivant le type de rendu 3D utilisé, mais nous verrons cela dans la suite du chapitre. ===Les différentes formes de ''culling''/''clipping''=== La première forme de ''culling'' est le '''''view frustum culling''''', dont le nom indique qu'il s'agit de l'élimination de tout ce qui est situé en-dehors du ''view frustum''. Ce qui est en-dehors du champ de vision de la caméra n'est pas affiché à l'écran n'est pas calculé ou rendu, dans une certaine mesure. Le ''view frustum culling'' est assez trivial : il suffit d'éliminer ce qui n'est pas dans le ''view frustum'' avec quelques calculs de coordonnées assez simples. Quelques subtilités surviennent quand un triangle est partiellement dans le ''view frustrum'', ce qui arrive parfois si le triangle est sur un bord de l'écran. Mais rien d'insurmontable. [[File:View frustum culling.svg|centre|vignette|upright=1|''View frustum culling'' : les parties potentiellement visibles sont en vert, celles invisibles en rouge et celles partiellement visibles en bleu.]] Les autres formes de ''culling'' visent à éliminer ce qui est dans le ''view frustum'', mais qui n'est pas visible depuis la caméra. Pensez à des objets cachés par un autre objet plus proche, par exemple. Ou encore, pensez aux faces à l'arrière d'un objet opaque qui sont cachées par l'avant. Ces deux cas correspondent à deux types de ''culling''. L'élimination des objets masqués par d'autres est appelé l'''occlusion culling''. L'élimination des parties arrières d'un objet est appelé le ''back-face culling''. Dans les deux cas, nous parlerons d''''élimination des surfaces cachées'''. [[File:Occlusion culling example PL.svg|centre|vignette|''Occlusion culling'' : les objets en bleu sont visibles, ceux en rouge sont masqués par les objets en bleu.]] Le lancer de rayons n'a pas besoin d'éliminer les surfaces cachées, il ne calcule que les surfaces visibles. Par contre, la rastérisation demande d'éliminer les surfaces cachées. Sans cela, le rendu est incorrect dans le pire des cas, ou alors le rendu calcule des surfaces invisibles pour rien. Il existe de nombreux algorithmes logiciels pour implémenter l'élimination des surfaces cachées, mais la carte graphique peut aussi s'en charger. L'''occlusion culling'' demande de connaitre la distance à la caméra de chaque triangle. La distance à la caméra est appelée la '''profondeur''' du triangle. Elle est déterminée à l'étape de rastérisation et est calculée à chaque sommet. Lors de la rastérisation, chaque sommet se voit attribuer trois coordonnées : deux coordonnées x et y qui indiquent sa position à l'écran, et une coordonnée de profondeur notée z. ===L'algorithme du peintre=== Pour éliminer les surfaces cachées, la solution la plus simple consiste simplement à rendre les triangles du plus lointain au plus proche. L'idée est que si deux triangles se recouvrent totalement ou partiellement, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Il ne s'agit ni plus ni moins que de l''''algorithme du peintre'''. [[File:Polygons cross.svg|vignette|Polygons cross]] [[File:Painters problem.svg|vignette|Painters problem]] Un problème est que la solution ne marche pas avec certaines configurations particulières, dans le cas où des polygones un peu complexes se chevauchent plusieurs fois. Il se présente rarement dans un rendu 3D normal, mais c'est quand même un cas qu'il faut gérer. Le problème est suffisant pour que cette solution ne soit plus utilisée dans le rendu 3D normal. Un autre problème est que l'algorithme demande de trier les triangles d'une scène 3D selon leur profondeur, du plus profond au moins profond. Et les cartes graphiques n'aiment pas ça, que ce soit les anciennes cartes graphiques comme les modernes. Il s'agit généralement d'une tâche qui est réalisée par le processeur, le CPU, qui est plus efficace que le GPU pour trier des trucs. Aussi, l'algorithme du peintre était utilisé sur d'anciennes cartes graphiques, qui ne géraient pas la géométrie mais seulement les textures et quelques effets de post-processing. Avec ces GPU, les jeux vidéo calculaient la géométrie et la triait sur le CPU, puis effectuaient le reste de la rastérisation sur le GPU. Les anciens jeux en 2.5D comme DOOM ou les DOOM-like, utilisaient une amélioration de l'algorithme du peintre. L'amélioration variait suivant le moteur de jeu utilisé, et donnait soit une technique dite de ''portal rendering'', soit un système de ''Binary Space Partionning'', assez complexes et difficiles à expliquer. Mais il ne s'agissait pas de jeux en 3D, les maps de ces jeux avaient des contraintes qui rendaient cette technique utilisable. Ils n'avaient pas de polygones qui se chevauchent, notamment. ===Le tampon de profondeur=== [[File:Z-buffer no text.jpg|vignette|Z-buffer correspondant à un rendu]] Une autre solution utilise ce qu'on appelle un '''tampon de profondeur''', aussi appelé un ''z-buffer''. Il s'agit d'un tableau, stocké en mémoire vidéo, qui mémorise la coordonnée z de l'objet le plus proche pour chaque pixel. Par défaut, ce tampon de profondeur est initialisé avec la valeur de profondeur maximale, celle du ''far plane'' du ''viewfrustum''. Au fur et à mesure que les objets seront calculés, le tampon de profondeur est mis à jour, conservant ainsi la trace de l'objet le plus proche de la caméra. Si jamais un triangle a une coordonnée z plus grande que celle du tampon de profondeur, cela veut dire qu'il est situé derrière un objet déjà rendu. Il est éliminé (sauf si transparence il y a) et le tampon de profondeur n'a pas à être mis à jour. Dans le cas contraire, l'objet est plus près de la caméra et sa coordonnée z remplace l'ancienne valeur z dans le tampon de profondeur. [[File:Z-buffer.svg|centre|vignette|upright=2.0|Illustration du processus de mise à jour du Z-buffer.]] Il existe des techniques alternatives pour coder la coordonnée de profondeur, qui se distinguent par le fait que la coordonnée z n'est pas proportionnelle à la distance entre le fragment et la caméra. Mais il s'agit là de détails assez mathématiques que je me permets de passer sous silence. Dans la suite de ce cours, nous allons juste parler de profondeur pour regrouper toutes ces techniques, conventionnelles ou alternatives. Toutes les cartes graphiques modernes utilisent un système de ''z-buffer''. C'est la seule solution pour avoir des performances dignes de ce nom. Il faut cependant noter qu'elles utilisent des tampons de profondeur légèrement modifiés, qui ne mémorisent pas la coordonnée de profondeur, mais une valeur dérivée. Pour simplifier, ils ne mémorisent pas la coordonnée de profondeur z, mais son inverse 1/z. Les raisons à cela ne peuvent pas encore être expliquées à ce moment du cours, aussi nous allons simplement dire que c'est une histoire de correction de perspective. Les coordonnées z et 1/z sont codées sur quelques bits, allant de 16 bits pour les anciennes cartes graphiques, à 24/32 bits pour les cartes plus récentes. De nos jours, les Z-buffer de 16 bits sont abandonnés et toutes les cartes graphiques utilisent des coordonnées z de 24 à 32 bits. La raison est que les Z-buffer de 16 bits ont une précision insuffisante, ce qui fait que des artefacts peuvent survenir. Si deux objets sont suffisamment proches, le tampon de profondeur n'a pas la précision suffisante pour discriminer les deux objets. Pour lui, les deux objets sont à la même place. Conséquence : il faut bien choisir un des deux objets et ce choix se fait pixel par pixel, ce qui fait des artefacts visuels apparaissent. On parle alors de '''''z-fighting'''''. Voici ce que cela donne : [[File:Z-fighting.png|centre|vignette|Z-fighting]] Un défaut du tampon de profondeur est qu'il ne gère pas correctement les objets transparents. Dès que de la transparence est présente dans une scène 3D, le tampon de profondeur ne peut pas être utilisé. Une solution pour cela est de rendre une scène 3D en deux phases : une pour les objets opaques, une avec les objets transparents. La où on rend les objets opaques utilise le tampon de profondeur, mais il est désactivé lors de la seconde. ==La rastérisation et les textures== Dans cette section, nous allons voir ensemble l'étape de rastérisation et l'étape de traitement des pixels. La rastérisation est difficile à expliquer, surtout que son rôle exact dépend de la technique de rendu utilisée. Pour simplifier, elle projette un rendu en 3D sur un écran en 2D. Une autre explication tout aussi vague est qu'elle s'occupe la traduction des triangles en un affichage pixelisé à l'écran. Elle détermine à quoi ressemble la scène visible sur l'écran. C'est par exemple lors de cette étape que sont appliquées certaines techniques de ''culling'', qui éliminent les portions non-visibles de l'image, ainsi qu'une correction de la perspective et diverses opérations d'interpolation dont nous parlerons dans plusieurs chapitres. La rastérisation et placage de textures sont deux opérations très liées entre elles. Il existe deux manières principales pour lier les textures à la géométrie : la méthode directe et la méthode inverse (''UV Mapping''). Et les deux font que la rastérisation se fait de manière très différente. Précisons cependant que les rendus les plus simples n'utilisent pas de textures du tout. Ils se contentent de colorier les triangles, voire d'un simple rendu en fil de fer basé sur du tracé de lignes. Dans la suite de cette section, nous allons voir les quatre types de rendu principaux : le rendu en fils de fer, le rendu colorié, et deux rendus utilisant des textures. ===Le rendu en fil de fer=== [[File:Obj lineremoval.png|vignette|Rendu en fil de fer d'un objet 3D.]] Le '''rendu 3D en fils de fer''' est illustré ci-contre. Il s'agit d'un rendu assez ancien, utilisé au tout début de la 3D, sur des machines qu'on aurait du mal à appeler ordinateurs. Il se contente de tracer des lignes à l'écran, lignes qui connectent deux sommets, qui ne sont autres que les arêtes de la géométrie de la scène rendue. Le tout était suffisant pour réaliser quelques jeux vidéos rudimentaires. Les tout premiers jeux vidéos utilisaient ce rendu, l'un d'entre eux étant Maze War, le tout premier FPS. {| |[[File:Maze war.jpg|vignette|Maze war]] |[[File:Maze representation using wireframes 2022-01-10.gif|centre|vignette|Maze representation using wireframes 2022-01-10]] |} Le monde est calculé en 3D, il y a toujours un calcul de la géométrie, la scène est rastérisée normalement, les portions invisbles de l'image sont retirées, mais il n'y a pas d'application de textures après rastérisation. A la place, un algorithme de tracé de ligne trace les lignes à l'écran. Quand un triangle passe l'étape de rastérisation, l'étape de rastérisation fournit la position des trois sommets sur l'écran. En clair, elle fournit les coordonnées de trois pixels, un par sommet. A la suite, un algorithme de tracé de ligne trace trois lignes, une par paire de sommet. L'implémentation demande juste d'avoir une unité de calcul géométrique, une unité de rastérisation, et un VDC qui supporte le tracé de lignes. Elle est donc assez simple et ne demande pas de circuits de gestion des textures ni de ROP. Le VDC écrit directement dans le ''framebuffer'' les lignes à tracer. Il a existé des proto-cartes graphiques spécialisées dans ce genre de rendu, comme le '''''Line Drawing System-1''''' de l'entreprise Eans & Sutherland. Nous détaillerons son fonctionnement dans quelques chapitres. ===Le rendu à primitives colorées=== [[File:MiniFighter.png|vignette|upright=1|Exemple de rendu pouvant être obtenu avec des sommets colorés.]] Une amélioration du rendu précédent utilise des triangles/''quads'' coloriés. Chaque triangle ou ''quad'' est associé à une couleur, et cette couleur est dessinée sur le triangle/''quad''après la rastérisation. Le rendu est une amélioration du rendu en fils de fer. L'idée est que chaque triangle/''quad'' est associé à une couleur, qui est dessinée sur le triangle/''quad'' après la rastérisation. La technique est nommée ''colored vertices'' en anglais, nous parlerons de '''rendu à maillage coloré'''. [[File:Malla irregular de triángulos modelizando una superficie convexa.png|centre|vignette|upright=2|Maillage coloré.]] La couleur est propagée lors des calculs géométriques et de la rastérisation, sans subir de modifications. Une fois un rendu en fils de fer effectué, la couleur du triangle est récupérée. Le triangle/''quad'' rendu correspond à un triangle/''quad'' à l'écran. Et l'intérieur de ce triangle/''quad'' est colorié avec la couleur transmise. Pour cela, on utilise encore une fois une fonction du VDC : celle du remplissage de figure géométrique. Nous l’avions vu en parlant des VDC à accélération 2D, mais elle est souvent prise en charge par les ''blitters''. Ils peuvent remplir une figure géométrique avec une couleur unique, on réutilise cette fonction pour colorier le triangle/''quad''. L'étape de rastérisation fournit les coordonnées des sommets de la figure géométrique, le ''blitter'' les utilise pour colorier la figure géométrique. Niveau matériel, quelques bornes d'arcade ont utilisé ce rendu. La toute première borne d'arcade utilisant le rendu à maillage coloré est celle du jeu I Robot, d'Atari, sorti en 1983. Par la suite, dès 1988, les cartes d'arcades Namco System 21 et les bornes d'arcades Sega Model 1 utilisaient ce genre de rendu. On peut s'en rendre compte en regardant les graphismes des jeux tournant sur ces bornes d'arcade. Des jeux comme Virtua Racing, Virtua Fighter ou Virtua Formula sont assez parlants à ce niveau. Leurs graphismes sont assez anguleux et on voit qu'ils sont basés sur des triangles uniformément colorés. Pour ceux qui veulent en savoir plus sur la toute première borne d'arcade en rendu à maillage colorée, la borne ''I Robot'' d'Atari, voici une vidéo youtube à ce sujet : * [https://www.youtube.com/watch?v=6miEkPENsT0 I Robot d'Atari, le pionnier de la 3D Flat.] ===Le placage de textures direct=== Les deux rendus précédents sont très simples, mais n'utilisent pas de textures. Et il est temps de voir les deux rendus qui utilisent des textures. Il y en a deux types, appelés rendu avec placage de texture direct et indirect, nous allons voir le '''rendu par placage de texture direct''' en premier. Et nous l'appellerons ''rendu direct'' dans ce qui suit, pour simplifier les explications. L'idée est assez simple et peut utiliser aussi bien des triangles que des ''quads'', mais nous allons partir du principe qu'elle utilise des '''''quads''''', à savoir que les objets 3D sont composés de quadrilatères. Lorsqu'un ''quad'' est rastérisé, sa forme à l'écran est un rectangle déformé par la perspective. On obtient un rectangle si le ''quad'' est vu de face, un trapèze si on le voit de biais. Et le ''sprite'' doit être déformé de la même manière que le ''quad''. L'idée est que tout quad est associé à une texture, à un sprite. La figure géométrique qui correspond à un ''quad'' à l'écran est remplie non pas par une couleur uniforme, mais par un ''sprite'' rectangulaire. Il suffit techniquement de recopier le ''sprite'' à l'écran, c'est à dire dans la figure géométrique, au bon endroit dans le ''framebuffer''. Le rendu direct est en effet un intermédiaire entre rendu 2D à base de ''sprite'' et rendu 3D moderne. La géométrie est rendue en 3D pour générer des ''quads'', mais ces ''quads'' ne servent à guider la copie des sprites/textures dans le ''framebuffer''. [[File:TextureMapping.png|centre|vignette|upright=2|Exemple caricatural de placage de texture sur un ''quad''.]] La subtilité est que le sprite est déformé de manière à rentrer dans un quadrilatère, qui n'est pas forcément un rectangle à l'écran, mais est déformé par la perspective et son orientation en 3D. Le sprite doit être déformé de deux manières : il doit être agrandi/réduit en fonction de la taille de la figure affichée à l'écran, tourné en fonction de l'orientation du ''quad'', déformé pour gérer la perspective. Pour cela, il faut connaitre les coordonnées de profondeur de chaque bord d'un ''quad'', et de faire quelques calculs. N'importe quel VDC incluant un ''blitter'' avec une gestion du zoom/rotation des sprites peut le faire. : Si on veut avoir de beaux graphismes, il vaut mieux appliquer un filtre pour lisser le sprite envoyé dans le trapèze, filtre qui se résume à une opération d'interpolation et n'est pas très différent du filtrage de texture qui lisse les textures à l'écran. Un autre point est que les ''quads'' doivent être rendus du plus lointain au plus proche. Sans cela, on obtient rapidement des erreurs de rendu. L'idée est que si deux quads se chevauchent, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. L'écriture du sprite du second quad écrasera les données du premier quad, pour les portions recouvertes, lors de l'écriture du sprite dans le ''framebuffer''. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Le rendu inverse utilise très souvent des triangles pour la géométrie, alors que le rendu direct a tendance à utiliser des ''quads'', mais il ne s'agit pas d'une différence stricte. L'usage de triangles/''quads'' peut se faire aussi bien avec un rendu direct comme avec un rendu inverse. Cependant, le rendu en ''quad'' se marie très bien au rendu direct, alors que le rendu en triangle colle mieux au rendu inverse. L'avantage de cette technique est qu'on parcourt les textures dans un ordre bien précis. Par exemple, on peut parcourir la texture ligne par ligne, l'exploiter par blocs de 4*4 pixels, etc. Et accéder à une texture de manière prédictible se marie bien avec l'usage de mémoires caches, ce qui est un avantage en matière de performances. Mais un même pixel du ''framebuffer'' est écrit plusieurs fois quand plusieurs quads se superposent, alors que le rendu inverse gère la situation avec une seule écriture (sauf si usage de la transparence). De plus, la gestion de la transparence était compliquée et les jeux devaient ruser en utilisation des solutions logicielles assez complexes. Niveau implémentation matérielle, une carte graphique en rendu direct demande juste trois circuits. Le premier est un circuit de calcul géométrique, qui rend la scène 3D. Le tri des quads est souvent réalisé par le processeur principal, et non pas par un circuit séparé. Toutes les étapes au-delà de l'étape de rastérisation étaient prises en charge par un VDC amélioré, qui écrivait des sprites/textures directement dans le ''framebuffer''. {|class="wikitable" |- ! Géométrie | Processeurs dédiés programmé pour émuler le pipeline graphique |- ! Tri des quads du plus lointain au plus proche | Processeur principal (implémentation logicielle) |- ! Application des textures | ''Blitter'' amélioré, capable de faire tourner et de zoomer sur des ''sprites''. |} L'implémentation était très simple et réutilisait des composants déjà existants : des VDC 2D pour l'application des textures, des processeurs dédiés pour la géométrie. Les unités de calcul de la géométrie étaient généralement implémentées avec un ou plusieurs processeurs dédiés. Vu qu'on savait déjà effectuer le rendu géométrique en logiciel, pas besoin de créer un circuit sur mesure. Il suffisait de dédier un processeur spécialisé rien que pour les calculs géométriques et on lui faisait exécuter un code déjà bien connu à la base. En clair, ils utilisaient un code spécifique pour émuler un circuit fixe. C'était clairement la solution la plus adaptée pour l'époque. Les unités géométriques étaient des processeurs RISC, normalement utilisés dans l'embarqué ou sur des serveurs. Elles utilisaient parfois des DSP. Pour rappel, les DSP des processeurs de traitement de signal assez communs, pas spécialement dédiés aux rendu 3D, mais spécialisé dans le traitement de signal audio, vidéo et autre. Ils avaient un jeu d'instruction assez proche de celui des cartes graphiques actuelles, et supportaient de nombreuses instructions utiles pour le rendu 3D. [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] Le rendu direct a été utilisé dans la période de transition entre rendu 2D et rendu 3D, car il était très adapté pour faire cette transition. Coupler un VDC à un processeur pour la géométrie était particulièrement simple à l'époque. Le rendu direct a été utilisé sur des bornes d'arcade dès les années 90. Outre les bornes d'arcade, quelques consoles de 5ème génération utilisaient le rendu direct, avec les mêmes solutions matérielles. La géométrie était calculée sur plusieurs processeurs dédiés. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. Deux consoles étaient dans ce cas : la 3DO, et la Sega Saturn. Le rendu direct est aujourd'hui abandonné. ===Le placage de textures inverse=== Le rendu précédent, le rendu direct, permet d'appliquer des textures directement dans le ''framebuffer''. Mais comme dit plus haut, il existe une seconde technique pour plaquer des textures, appelé le '''placage de texture inverse''', aussi appelé l'''UV Mapping''. Elle associe une texture complète pour un modèle 3D,contrairement au placage de tecture direct qui associe une texture par ''quad''/triangle. L'idée est que l'on attribue un texel à chaque sommet. Plus précisémment, chaque sommet est associé à des '''coordonnées de texture''', qui précisent quelle texture appliquer, mais aussi où se situe le texel à appliquer dans la texture. Par exemple, la coordonnée de texture peut dire : je veux le pixel qui est à ligne 5, colonne 27 dans cette texture. La correspondance entre texture et géométrie est réalisée lorsque les créateurs de jeu vidéo conçoivent le modèle de l'objet. [[File:Texture Mapping example.png|centre|vignette|upright=2|Exemple de placage de texture.]] Dans les faits, on n'utilise pas de coordonnées entières de ce type, mais deux nombres flottants compris entre 0 et 1. La coordonnée 0,0 correspond au texel en bas à gauche, celui de coordonnée 1,1 est tout en haut à droite. L'avantage est que ces coordonnées sont indépendantes de la résolution de la texture, ce qui aura des avantages pour certaines techniques de rendu, comme le ''mip-mapping''. Les deux coordonnées de texture sont notées u,v avec DirectX, ou encore s,t dans le cas général : u est la coordonnée horizontale, v la verticale. [[File:UVMapping.png|centre|vignette|upright=2|UV Mapping]] Avec le placage de texture inverse, la rastérisation se fait grosso-modo en trois étapes : la rastérisation proprement dite, le placage de textures, et les opérations finales qui écrivent un pixel dans le ''framebuffer''. Au niveau du matériel, ainsi que dans la plupart des API 3D, les trois étapes sont réalisées par des circuits séparés. [[File:01 3D-Rasterung-a.svg|vignette|Illustration du principe de la rasterization. La surface correspondant à l'écran est subdivisée en pixels carrés, de coordonnées x et y. La caméra est placée au point e. Pour chaque pixel, on trace une droite qui part de la caméra et qui passe par le pixel considéré. L'intersection entre une surface et cette droite se fait en un point, appartenant à un triangle.]] Lors de la rasterisation, chaque triangle se voit attribuer un ou plusieurs pixels à l'écran. Pour bien comprendre, imaginez une ligne droite qui part de caméra et qui passe par un pixel sur le plan de l'écran. Cette ligne intersecte 0, 1 ou plusieurs objets dans la scène 3D. Les triangles situés ces intersections entre cette ligne et les objets rencontrés seront associés au pixel correspondant. L'étape de rastérisation prend en entrée un triangle et renvoie la coordonnée x,y du pixel associé. Il s'agit là d'une simplification, car un triangle tend à occuper plusieurs pixels sur l'écran. L'étape de rastérisation fournit la liste de tous les pixels occupés par un triangle, et les traite un par un. Quand un triangle est rastérisé, le rasteriseur détermine la coordonnée x,y du premier pixel, applique une texture dessus, puis passe au suivant, et rebelote jusqu'à ce que tous les pixels occupés par le triangles aient été traités. L'implémentation matérielle du placage de texture inverse est beaucoup plus complexe que pour les autres techniques. Pour être franc, nous allons passer le reste du cours à parler de l'implémentation matérielle du placage de texture inverse, ce qui prendra plus d'une dizaine de chapitres. ==La transparence, les fragments et les ROPs== Dans ce qui suit, nous allons parler uniquement de la rastérisation avec placage de textures inverse. Les autres formes de rastérisation ne seront pas abordées. La raison est que tous les GPUs modernes utilisent cette forme de rastérisation, les exceptions étant rares. De même, ils utilisent un tampon de profondeur, pour l'élimination des surfaces cachées. La rastérisation effectue donc des calculs géométriques, suivis d'une étape de rastérisation, puis de placage des textures. Ces trois étapes sont réalisées par une unité géométrique, une unité de rastérisation, et un circuit de placage de textures. Du moins sur le principe, car les cartes graphiques modernes ont fortement optimisé l'implémentation et n'ont pas hésité à fusionner certains circuits. Mais nous verrons cela en temps voulu, nous n'allons pas résumer plusieurs décennies d'innovation technologique en quelques paragraphes. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures |} Mais où mettre le tampon de profondeur ? Intuitivement, on se dit qu'il vaut mieux faire l'élimination des surfaces cachées le plus tôt possible, dès que la coordonnée de profondeur est connue. Et elle est connu à l'étape de rastérisation, une fois les sommets transformés. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Tampon de profondeur | Placage de textures |} En réalité, la profondeur des fragments est gérée par un circuit appelé le '''''Raster Operations Pipeline''''' (ROP), situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo. Il est placé à la fin du pipeline pour gérer correctement la transparence. Et nous allons voir pourquoi la transparence est gérée à la fin du pipeline. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} ===Le mélange ''alpha''=== La transparence se manifeste quand plusieurs objets sont l'un derrière l'autre. Histoire de simplifier les explications, nous allons d'abord voir le cas où un objet semi-transparent est devant un objet opaque. La couleur perçue est alors un mélange de la couleur de l'objet opaque et celle de l'objet semi-transparent. Le mélange dépend d'à quel point l'objet semi-transparent est transparent. Avec un objet parfaitement transparent, seul l'objet opaque est visible. Avec un objet à moitié transparent, la couleur finale sera pour moitié celle de l'objet opaque, pour moitié celle de l'objet semi-transparent. Et c'est pareil pour les cas intermédiaires entre un objet totalement transparent et un objet totalement opaque. La transparence d'un objet/pixel est définie par un nombre, appelé la '''composante ''alpha'''''. Plus la composante alpha est élevée, plus le pixel est opaque. Elle vaut 0 pour un objet opaque et 1 pour un objet transparent. Elle est ajoutée aux composantes RGB, ce qui fait que tout fragment contient une "couleur de transparence" en plus des couleurs RGB. Elle agit comme un coefficient qui dit comment mélanger la couleur d'un objet transparent et d'un objet opaque. Le calcul de la transparence est une moyenne pondérée par la composante alpha. On parle alors d''''''alpha blending'''''. : <math>\text{Couleur finale} = \alpha \times \text{Couleur de l'objet transparent} + (1 - \alpha) \times \text{Couleur de l'objet opaque}</math> [[File:Texture splatting.png|centre|vignette|upright=2.0|Calcul de transparence. La première ligne montre le produit pour l'objet transparent, la seconde ligne est celle de l'objet opaque. La troisième ligne est celle de l'addition finale.]] Maintenant, qu'en est-il du cas où plusieurs objets sont superposés ? Si vous tracez une demi-droite dont l'origine est la caméra et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points, un point par objet sur la ligne du regarde. Sans transparence, l'objet le plus proche cache tous les autres et c'est donc lui qui décide de la couleur du pixel. Mais avec un objet transparent, la couleur finale est un mélange de la couleur de plusieurs points d'intersection. Il faut donc calculer un pseudo-pixel pour chaque point d'intersection, auquel on donne le nom de '''fragment'''. Un fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont combinés pour obtenir la couleur finale de ce pixel. Il est possible d'utiliser le mélange ''alpha'' pour cela. Il suffit de faire le mélange ''alpha'' entre le fragment qui vient d'être calculé, et le pixel dans le ''framebuffer''. Pour cela, le fragment a une composante ''alpha'', qui est ajouté aux trois couleurs RGB. Le pixel déjà dans le ''framebuffer'' est un résultat temporaire, né du mélange ''alpha'' de tous les fragments précédents. Un défaut de cette méthode est qu'elle fonctionne assez mal avec un tampon de profondeur. Si le tampon de profondeur est activé, le mélange ''alpha'' ne fonctionne que si les objets sont rendus du plus lointain au plus proche. Et procéder dans cet ordre a un défaut : on dessine des objets dans le ''framebuffer'', pour qu'ensuite les objets devant écrasent ce qui a déjà été dessiné. Un même pixel peut donc être dessiné plusieurs fois, dont une seule sera pertinente. Et ces écritures utilisent de la bande passante mémoire, qui est une ressource précieuse sur un GPU moderne. Il s'agit d'un phénomène appelé '''''overdraw''''', ou sur-dessinage en français. Quelques optimisations permettent d'éliminer l'''overdraw'' en rendant les objets du plus proche au plus lointain, d'autres permettent de dessiner des objets dans un ordre arbitraire, mais nous ne pouvons pas en parler ici. Beaucoup de moteurs 3D rendent séparément les objets opaques et transparents. Une première passe rend les objets opaques, puis les objets transparents sont rendus dans une seconde passe. Les objets opaques sont rendus dans le désordre, ce qui fait qu'on n'a pas à les trier, alors que les objets transparents doivent être triés selon leur distance. un autre avantage est que le mélange ''alpha'' est désactivé lors de la première passe, alors que c'est la mise à jour du tampon de profondeur qui est désactivé lors de la seconde passe, ce qui augmente un peu les performances dans les deux cas. ===Le test ''alpha''=== Le test ''alpha'' est une technique qui permet d'annuler le rendu d'un fragment en fonction de sa transparence. Si la composante alpha est en-dessous ou au-dessus d'un seuil, le fragment est simplement abandonné. Le seuil en question est configurable, de même que la comparaison utilisée : on peut éliminer le fragment si sa transparence est au-dessus d'un certain seuil, en-dessous, égal, différent, etc. Il s'agit d'une optimisation qui est utile dans certains scénarios spécifiques. Par exemple, si l'objet a une transparence très élevée, du genre 95%, autant le compter comme complétement transparent, afin d'éviter des opérations de mélange ''alpha''. En effet, les opérations de mélange ''alpha'' sont très lentes, car elles demandent de faire des opérations de lecture-écriture en mémoire vidéo : on lit un pixel dans le ''framebuffer'', on applique le mélange ''alpha'' et on écrit le résultat en mémoire vidéo. L'''alpha test'' permet donc de gagner en performance au prix d'une baisse de la qualité d'image. Il y a cependant des cas où l'usage du test ''alpha'' est primordial, au-delà d'une question de performances. Un exemple classique est celui du rendu du feuillage dans un jeu 3D. Un feuillage est composé en assemblant plusieurs images de feuilles. Chaque feuille est un carré sur lequel on place une texture de feuille, qui est opaque pour la partie verte des feuilles, transparente pour le reste. Les carrés ne sont cependant pas superposés, mais s'intersectent fortement, ce qui fait que le mélange ''alpha'' ne donne pas de bons résultats. L'usage du test ''alpha'' permet d'obtenir un rendu correct. Pour d'informations via ce lien : * [https://bgolus.medium.com/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f Anti-aliased Alpha Test: The Esoteric Alpha To Coverage]. ===Les effets de brouillard=== Les '''effets de brouillard''' sont nécessaires dans certains jeux vidéo pour l'ambiance (pensez à des jeux d'horreur comme Silent Hill), mais ils ont surtout été utilisés pour économiser des calculs. L'idée est de ne pas calculer les graphismes au-delà d'une certaine distance, sans que cela se voie. Le ''view frustum'' utilise alors un plan limite, au-delà duquel on ne voit pas les objets. Mais ce plan limite donne une cassure inesthétique dans le rendu. Pour masquer cette cassure, les programmeurs ajoutaient un effet de brouillard. Les objets au-delà du plan limite étaient totalement dans le brouillard, puis ce brouillard se réduisait progressivement en se rapprochant de la caméra, avant de s'annuler à partir d'une certaine distance. Pour calculer le brouillard, on effectue un mélange ''alpha'' entre la couleur du pixel et une ''couleur de brouillard''. La différence est que l'on n'utilise pas la transparence pour faire le mélange, mais un '''coefficient de brouillard''', noté <math>\text{fog}(z)</math>. : <math>\text{Couleur finale} = \text{fog}(z) \times \text{Couleur de brouillard} + [ 1 - \text{fog}(z) ] \times \text{Couleur du pixel}</math> Le coefficient de brouillard dépend de la coordonnée de profondeur, de la distance du pixel par rapport à la caméra. Le brouillard démarre à une distance <math>z_{fog-start}</math>, et masque totalement les objets à partir d'une distance <math>z_{fog-end}</math>. Entre les deux, le coefficient de brouillard dépend de la distance. OpenGL autorise trois formules de calcul suivantes : : <math>\text{fog}(z) = \frac{z_{fog-end} - z}{z_{fog-end} - z_{fog-start}}</math> : <math>\text{fog}(z) = e^{- k \times z}</math> : <math>\text{fog}(z) = e^{- (k \times z)^2}</math> ==L'éclairage d'une scène 3D== L'éclairage d'une scène 3D calcule les ombres, mais aussi la luminosité de chaque pixel, ainsi que bien d'autres effets graphiques. Les algorithmes d'éclairage ont longtemps été implémentés directement en matériel, les cartes graphiques géraient l'éclairage dans des circuits spécialisés. Aussi, il est important de voir ces algorithmes d'éclairage. Il est possible d'implémenter l'éclairage à deux endroits différents du pipeline : juste avant la rastérisation, et après la rastérisation. ===Les sources de lumière et les couleurs associées=== L'éclairage d'une scène 3D provient de sources de lumières, comme des lampes, des torches, le soleil, etc. Il existe de nombreux types de sources de lumière, et nous n'allons parler que des principales. Elles sont au nombre de quatre et elles sont illustrées ci-dessous. [[File:3udUJ.gif|centre|vignette|upright=2|Types de sources de lumière.]] [[File:Graphics lightmodel directional.png|vignette|upright=1.0|Source de lumière directionnelle.]] Les '''sources directionnelles''' servent à modéliser des sources de lumière très éloignées, comme le soleil ou la lune. Elles sont simplement définies par un vecteur qui indique la direction de la lumière, rien de plus. Les '''sources ponctuelles''' sont des points, qui émettent de la lumière dans toutes les directions. Elles sont définies par une position, et une intensité lumineuse, éventuellement la couleur de la lumière émise. Il existe deyux types de sources de lumière ponctuelles. * Le premières émettent de manière égale dans toutes les directions. Elles sont appelées des ''point light'' dans le schéma du dessus. * Les secondes émettent de la lumière dans une '''direction privilégiée'''. L'exemple le plus parlant est celui d'une lampe-torche : elle émet de la lumière "tout droit", dans la direction où la lampe est orientée. Elles sont appelées des ''sport light'' dans le schéma du dessus. La direction privilégiée est un vecteur, notée v dans le schéma du dessous. [[File:Graphics lightmodel ambient.png|vignette|upright=1.0|Lumière ambiante.]] En théorie, la lumière rebondit sur les surfaces et a tendance à se disperser un peu partout à force de rebondir. C'est ce qui explique qu'on arrive à voir à l'intérieur d'une pièce si une fenêtre est ouverte. Il en résulte un certain '''éclairage ambiant''', qui est assez difficile à représenter dans un moteur de rendu 3D. Auparavant, l'éclairage ambiant était simulé par une lumière égale en tout point de la scène 3D, appelée simplement la '''lumière ambiante'''. Précisément, on suppose que la lumière ambiante en un point vient de toutes les directions et a une intensité constante, identique dans toutes les directions. Le tout est illustré ci-contre. C'est assez irréaliste, mais ça donne une bonne approximation de la lumière ambiante. ===La lumière incidente : le terme géométrique=== Pour simplifier, nous allons supposer que l'éclairage est calculé pour chaque sommet, pas par triangle. C'est de loin le cas le plus courant, aussi ce n'est pas une simplification abusive. La lumière qui arrive sur un sommet est appelée la '''lumière incidente'''. La couleur d'un sommet dépend de deux choses : la lumière incidente directe, comment il réfléchit cette lumière. Mathématiquement, il est possible de résumer cela avec le produit de deux termes : l'intensité de la lumière incidente, une fonction qui indique comment la surface réfléchit la lumière incidente. La fonction en question est appelée la '''réflectivité bidirectionnelle'''. Le terme anglais est ''bidirectional reflectance distribution function'', abrévié en BRDF, et nous utiliserons cette abréviation dans ce qui suit. : <math>\text{Couleur finale} = \text{Lumière incidente} \times BRDF(...)</math> La lumière incidente vient soit directement des sources de lumière, soit de la lumière qui a rebondit sur d'autres objets proches. La première est appelée la lumière directe, celle qui vient des rebonds s'appelle la lumière indirecte. Pour simplifier, la lumière indirecte est gérée par la lumière ambiante, nous passons sous silence les techniques d'illumination globale. En clair : nous allons nous limiter au cas où la lumière incidente vient directement d'une source de lumière, pas d'un rebond. Intuitivement, la lumière incidente est simplement égale à l'intensité de la source de lumière. Sauf que ce n'est qu'une approximation, et une assez mauvaise. En réalité, l'approximation est bonne si la lumière arrive proche de la verticale, mais elle est d'autant plus mauvaise que la lumière arrive penchée, voire rasante. La raison : la lumière incidente sera étalée sur une surface plus grande, si elle arrive penchée. Si vous vous souvenez de vos cours de collège, c'est le même principe qui explique les saisons. La lumière du soleil est proche de la verticale en été, mais est de plus en plus penché quand on s'avance vers l'Hiver. La lumière solaire est donc étalée sur une surface plus grande, ce qui fait qu'un point de la surface recevra moins de lumière, celle-ci étant diluée, étalée. [[File:Radiación solar.png|centre|vignette|upright=2|Exemple avec la lumière solaire.]] [[File:Angle of incidence.svg|vignette|upright=1|Angle d'incidence.]] En clair, tout dépend de l''''angle d'incidence''' de la lumière. Reste à voir comment calculer cet angle. La lumière incidente est définie par un vecteur, qui part de la source de lumière et atterrit sur le sommet considéré. Imaginez simplement que ce vecteur suit un rayon lumineux provenant de la source de lumière. Le vecteur pour la lumière incidente sera noté L. L'angle d'incidence est l'angle que fait ce vecteur avec la verticale de la surface, au niveau du sommet considéré. [[File:Graphics lightmodel ptsource.png|vignette|Normale de la surface.]] Pour cela, les calculs d'éclairage ont besoin de connaitre la verticale d'un sommet. Un sommet est donc associé à un vecteur, appelé la '''normale''', qui indique la verticale en ce point. Deux sommets différents peuvent avoir deux normales différentes, même s'ils sont proches. Elles sont d'autant plus différentes que la surface est rugueuse, non-lisse. La normale est prédéterminée lors de la création du modèle 3D, il n'y a pas besoin de le calculer. Par contre, elle est modifiée lors de l'étape de transformation, quand on place le modèle 3D dans la scène 3D. Les deux autres vecteurs sont à calculer à chaque image, car ils changent quand on bouge le sommet. La lumière qui arrive sur la surface dépend de l'angle entre la normale et le vecteur L. Précisément, elle dépend du cosinus de cet angle. En multipliant ce cosinus avec l'intensité de la lumière, on a la lumière arrivante. La couleur finale d'un pixel est donc : : <math>\text{Couleur finale} = I \times \cos{(N, L)} \times BRDF(...)</math> Le terme <math>I \times \cos{N, L}</math> ne dépend pas de la surface considérée. Juste de la position de la source de lumière, de la position du sommet et de son orientation par rapport à la lumière. Aussi, il est parfois appelé le '''terme géométrique''', en opposition aux propriétés de la surface. Les propriétés de la surface sont définies par un '''''material''''', qui indique comment il réfléchit la lumière, ainsi que sa texture. ===Le produit scalaire de deux vecteurs=== Calculer le terme géométrique demande de calculer le cosinus d'un angle. Et il n'est pas le seul : les autres calculs d'éclairage que nous allons voir demandent de calculer des cosinus. Or, les calculs trigonométriques sont très gourmands pour le GPU. Pour éviter le calcul d'un cosinus, les GPU utilisent une opération mathématique appelée le ''produit scalaire''. Le produit scalaire agit sur deux vecteurs, que l'on notera A et B. Un produit scalaire prend : la longueur des deux vecteurs, et l'angle entre les deux vecteurs noté <math>\omega</math>. Le produit scalaire est équivalent à la formule suivante : : <math>\text{Produit scalaire de deux vecteurs A et B} = \vec{A} \cdot \vec{B} = A \times B \times \cos{(\omega)}</math>, avec A et B la longueur des deux vecteurs A et B. L'avantage est que le produit scalaire se calcule simplement avec des additions, soustractions et multiplications, des opérations que les cartes graphiques savent faire très facilement. Le produit scalaire de deux vecteurs de coordonnées x,y,z est le suivant : : <math>\vec{A} \cdot \vec{B} = x_A \times x_B + y_A \times y_B + z_A \times z_B</math> En clair, on multiplie les coordonnées identiques, et on additionne les résultats. Rien de compliqué. Un avantage est que tous les vecteurs vus précédemment sont normalisés, à savoir qu'ils ont une longueur qui vaut 1. Ainsi, le calcul du produit scalaire devient équivalent au calcul du produit scalaire. ===La réflexion de la lumière sur la surface=== [[File:Ray Diagram 2.svg|vignette|Reflection de la lumière sur une surface parfaitement lisse.]] Maintenant que nous venons de voir le terme géométrique, voyons le BRDF, qui définit comment la surface de l'objet 3D réfléchit la lumière. Vos cours de collège vous ont sans doute appris que la lumière est réfléchie avec le même angle d'arrivée. L'angle d'incidence et l'angle de réflexion sont égaux, comme illustré ci-contre. On parle alors de '''réflexion parfaite'''. Mais cela ne vaut que pour une surface parfaitement lisse, comme un miroir parfait. Dans la réalité, une surface a tendance à renvoyer des rayons dans toutes les directions. La raison est qu'une surface réelle est rugueuse, avec de petites aspérités et des micro-reliefs, qui renvoient la lumière dans des directions "aléatoires". La lumière « rebondit » sur la surface de l'objet et une partie s'éparpille dans un peu toutes les directions. On parle alors de '''réflexion diffuse'''. {| |- |[[File:Dioptre reflexion diffuse speculaire refraction.svg|vignette|upright=1.4|Différence entre réflexion diffuse et spéculaire.]] |[[File:Diffuse reflection.svg|vignette|upright=1|Réflexion diffuse.]] |} Maintenant, imaginons que la surface n'ait qu'une réflexion diffuse, pas d'autres formes de réflexion. Et imaginons aussi que cette réflexion diffuse soit parfaite, à savoir que la lumière réfléchie soit renvoyée à l'identique dans toutes les directions, sans aucune direction privilégiée. On a alors le ''material'' le plus simple qui soit, appelé un '''''diffuse material'''''. Vu que la lumière est réfléchie à l'identique dans toutes les directions, elle sera identique peu importe où on place la caméra. La lumière finale ne dépend donc que des propriété de la surface, que de sa couleur. En clair, il suffit de donner une '''couleur diffuse''' à chaque sommet. La couleur diffuse est simplement multipliée par le terme géométrique, pour obtenir la lumière réfléchie finale. Rien de plus, rien de moins. Cela donne l'équation suivante, avec les termes suivants : * L est le vecteur pour la lumière incidente ; * N est la normale du sommet ; * I est l'intensité de la source de lumière ; * <math>C_d</math> est la couleur diffuse. : <math>\text{Illumination diffuse} = C_d \times \left[ I \times (\vec{N} \cdot \vec{L}) \right]</math> Rajoutons maintenant l'effet de la lumière ambiante à un ''material'' de ce genre. Pour rappel, la lumière ambiante vient de toutes les directions à part égale, ce qui fait que son angle d'incidence n'a donc pas d'effet. L'intensité de la lumière ambiante est déterminée lors de la création de la scène 3D, c'est une constante qui n'a pas à être calculée. Pour obtenir l'effet de la lumière ambiante sur un objet, il suffit de multiplier sa couleur diffuse par l'intensité de la lumière ambiante. Cependant, de nombreux moteurs de jeux ajoutent une '''couleur ambiante''', différente de la couleur diffuse. : <math>\text{Illumination ambiante} = C_a \times I_a</math> avec <math>C_a</math> la couleur ambiante du point de surface et <math>I_a</math> l'intensité de la lumière ambiante. En plus de la réflexion diffuse parfaite, de nombreux matériaux ajoutent une '''réflexion spéculaire''', qui n'est pas exactement la réflexion parfaite, en est très proche. Les rayons réfléchis sont très proches de la direction de réflexion parfaite, et s'atténuent très vite en s'en éloignant. Le résultat ressemble à une sorte de petit "point blanc", très lumineux, orienté vers la source de lumière, appelé le '''''specular highlight'''''. La réflexion diffuse est prédominante pour les matériaux rugueux, alors que la réflexion spéculaire est dominante sur les matériaux métalliques ou très lisses. [[File:Phong components version 4.png|centre|vignette|upright=3.0|Couleurs utilisées dans l'algorithme de Phong.]] [[File:Phong Vectors.svg|vignette|Vecteurs utilisés dans l'algorithme de Phong (et dans le calcul de l'éclairage, de manière générale).]] Pour calculer la réflexion spéculaire, il faut d'abord connaitre le vecteur pour la réflexion parfaite, que nous noterons R dans ce qui suit. Le vecteur R peut se calculer avec la formule ci-dessous : : <math>\vec{R} = 2 (\vec{L} \cdot \vec{N}) \times \vec{N} - \vec{L} </math> La réflexion spéculaire dépend de l'angle entre la direction du regard et la normale : plus celui-ci est proche de l'angle de réflexion parfaite, plus la réflexion spéculaire sera intense. Le vecteur pour la direction du regard sera noté V, pour vue ou vision. La réflexion spéculaire est une fonction qui dépend de l'angle entre les vecteurs R et V. Le calcul de la réflexion spéculaire utilise une '''couleur spéculaire''', qui est l'équivalent de la couleur diffuse pour la réflexion spéculaire. : <math>\text{BRDF spéculaire} = C_s \times f(\vec{R} \cdot \vec{V}) </math> La fonction varie grandement d'un modèle de calcul spéculaire à l'autre. Aussi, je ne rentre pas dans le détail. L'essentiel est que vous compreniez que le calcul de l'éclairage utilise de nombreux calculs géométriques, réalisés avec des produits scalaires. Les calculs géométriques utilisent la couleur d'un sommet, la normale du sommet, et le vecteur de la lumière incidente. Les autres informations sont calculées à l'exécution. ===Les algorithmes d'éclairage basiques : par triangle, par sommet et par pixel=== Dans tout ce qui a été dit précédemment, l'éclairage est calculé pour chaque sommet. Il attribue une illumination/couleur à chaque sommet de la scène 3D, ce qui fait qu'on parle d''''éclairage par sommet''', ou ''vertex lighting''. Il est assez rudimentaire et donne un éclairage très brut, mais il peut être réalisé avant l'étape de rastérisation. Mais une fois qu'on a obtenu la couleur des sommets, reste à colorier les triangles. Et pour cela, il y a deux manières de faire, qui sont appelées l'éclairage plat et l'éclairage de Gouraud. [[File:D3D Shading Triangles.png|vignette|Dans ce dessin, le triangle a un sommet de couleur bleu foncé, un autre de couleur rouge et un autre de couleur bleu clair. L’interpolation plate et de Gouraud donnent des résultats bien différents.]] L''''éclairage plat''' calcule l'éclairage triangle par triangle. Il y a plusieurs manières de faire pour ça, mais la plus simple colorie un triangle avec la couleur moyenne des trois sommets. Une autre possibilité fait les calculs d'éclairage triangle par triangle, en utilisant une normale par triangle et non par sommet, idem pour les couleurs ambiante/spéculaire/diffuse. Mais c'est plus rare car cela demande de placer la normale quelque part dans le triangle, ce qui rajoute des informations. L''''éclairage de Gouraud''' effectue lui aussi une moyenne de la couleur de chaque sommet, sauf que celle-ci est pondérée par la distance du sommet avec le pixel. Plus le pixel est loin d'un sommet, plus son coefficient est petit. Typiquement, le coefficient varie entre 0 et 1 : de 1 si le pixel est sur le sommet, à 0 si le pixel est sur un des sommets adjacents. La moyenne effectuée est généralement une interpolation bilinéaire, mais n'importe quel algorithme d'interpolation peut marcher, qu'il soit simplement linéaire, bilinéaire, cubique, hyperbolique. L'étape d'interpolation est prise en charge par l'étape de rastérisation, qui effectue cette moyenne automatiquement. L'éclairage par sommet a eu son heure de gloire, mais il est maintenant remplacé par l''''éclairage par pixel''' (''per-pixel lighting''), qui calcule l'éclairage pixel par pixel. En clair, l’éclairage est finalisé après l'étape de rastérisation, il ne se fait pas qu'au niveau de la géométrie. Il existe plusieurs types d'éclairage par pixel, mais on peut les classer en deux grands types : l'éclairage de Phong et le ''bump/normal mapping''. L''''éclairage de Phong''' calcule l'éclairage pixel par pixel. Avec cet algorithme, la géométrie n'est pas éclairée : les couleurs des sommets ne sont pas calculées. A la place, les normales sont envoyées à l'étape de rastérisation, qui effectue une opération d'interpolation, qui renvoie une normale pour chaque pixel. Les calculs d'éclairage utilisent alors ces normales pour faire les calculs d'éclairage pour chaque pixel. La technique du '''''normal mapping''''' est assez simple à expliquer, sans compter que plusieurs cartes graphiques l'ont implémentée directement dans leurs circuits. Là où l'éclairage de Phong interpole les normales pour chaque pixel, le ''normal-mapping'' précalcule les normales d'une surface dans une texture, appelée la ''normal-map''. Lors des calculs d'éclairage, la carte graphique lit les normales adéquates directement depuis cette texture, puis fait les calculs d'éclairage avec. [[File:WallSimpleAndNormalMapping.png|centre|vignette|upright=2|Différence sans et avec ''normal-mapping''.]] Avec cette technique, l'éclairage n'est pas géré par pixel, mais par texel, ce qui fait qu'il a une qualité de rendu un peu inférieure à un vrai éclairage de Phong, mais bien supérieure à un éclairage par sommet. Par contre, les techniques de ''normal mapping'' permettent d'ajouter du relief et des détails sur des surfaces planes en jouant sur l'éclairage. Elles permettent ainsi de simplifier grandement la géométrie rendue, tout en utilisant l'éclairage pour compenser. [[File:Bump mapping.png|centre|vignette|upright=2|Bump mapping]] L'éclairage par pixel a une qualité d'éclairage supérieure aux techniques d'éclairage par sommet, mais il est aussi plus gourmand. L'éclairage par pixel est utilisé dans presque tous les jeux vidéo depuis DOOM 3, en raison de sa meilleure qualité, mais cela n'aurait pas été possible si le matériel n'avait pas évolué de manière à incorporer des algorithmes d'éclairage matériel assez puissants, avant de basculer sur un éclairage programmable. La différence entre l'éclairage par pixel et par sommet se voit assez facilement à l'écran. L'éclairage plat donne un éclairage assez carré, avec des frontières assez nettes. L'éclairage de Gouraud donne des ombres plus lisses, dans une certaine mesure, mais pèche à rendre correctement les reflets spéculaires. L'éclairage de Phong est de meilleure qualité, surtout pour les reflets spéculaires. es trois algorithmes peuvent être implémentés soit dans la carte graphique, soit en logiciel. Nous verrons comment les cartes graphiques peuvent implémenter ces algorithmes, dans les deux prochains chapitres. {| |- |[[File:Per face lighting.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting.png|vignette|upright=1|Phong Shading]] |- |[[File:Per face lighting example.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting example.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting example.png|vignette|upright=1|Phong Shading]] |} ===Les ''shaders'' : des programmes exécutés sur le GPU=== Maintenant que nous venons de voir les algorithmes d'éclairages, il est temps de voir comment les réaliser sur une carte graphique. Nous venons de voir qu'il y a une différence entre l'éclairage par pixel et par sommet. Intuitivement, l'éclairage par sommet devrait se faire avec les calculs géométriques, alors que l'éclairage par pixel devrait se faire après avoir appliqué les textures. Les toutes premières cartes graphiques ne géraient ni l'éclairage par sommet, ni l'éclairage par pixel. Elles laissaient les calculs géométriques au CPU. Par la suite, la Geforce 256 a intégré '''circuit de ''Transform & Lightning''''', qui s'occupait de tous les calculs géométriques, éclairage par sommet inclus (d'où le L de T&L). Elle gérait alors l'éclairage par sommet, mais un algorithme particulier, qui n'était pas très flexible. Il ne gérait que des ''material'' bien précis (des ''Phong materials''), rien de plus. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Unité de T&L : géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} L'amélioration suivante est venue sur la Geforce 3 : l'unité de T&L est devenue programmable. Au vu le grand nombre d'algorithmes d'éclairages possibles et le grand nombre de ''materials'' possibles, c'était la seule voie possibles. Les programmeurs pouvaient programmer leurs propres algorithmes d'éclairage par sommet, même s'ils devaient aussi programmer les étapes de transformation et de projection. Mais nous détaillerons cela dans un chapitre dédié sur l'historique des GPUs. Ce qui est important est que la Geforce 3 a introduit une fonctionnalité absolument cruciale pour le rendu 3D moderne : les '''''shaders'''''. Il s'agit de programmes informatiques exécutés par la carte graphique, qui servaient initialement à coder des algorithmes d'éclairage. D'où leur nom : ''shader'' pour ''shading'' (éclairage en anglais). Cependant, l'usage modernes des shaders dépasse le cadre des algorithmes d'éclairage. L'avantage est que cela simplifie grandement l'implémentation des algorithmes d'éclairage. Pas besoin de les intégrer dans la carte graphique pour les utiliser, pas besoin d'un circuit distinct pour chaque algorithme. Sans shaders, si la carte graphique ne gère pas un algorithme d'éclairage, on ne peut pas l'utiliser. A la rigueur, il est parfois possible de l'émuler avec des contournements logiciels, mais au prix de performances souvent désastreuses. Avec des shaders, il est possible de programmer l'algorithme d'éclairage de notre choix, pour l'exécuter sur la carte graphique, avec des performances plus que convenables. [[File:Implémentation de l'éclairage sur les cartes graphiques.png|vignette|Implémentation de l'éclairage sur les cartes graphiques]] Il existe plusieurs types de shaders, mais les deux principaux sont les '''''vertex shaders''''' et les '''''pixel shaders'''''. Les pixels shaders s'occupent de l'éclairage par pixel, leur nom est assez parlent. Les vertex shaders s'occupent de l'éclairage par sommet, mais aussi des étapes de transformation/projection. Je parle bien des trois étapes de transformation vues plus haut, qui effectuent des calculs de transformation de coordonnées avec des matrices. La raison à cela est que les calculs de transformation ressemblent beaucoup aux calculs d'éclairage par sommet. Ils impliquent tous deux des calculs vectoriels, comme des produits scalaires et des produits vectoriels, qui agissent sur des sommets/triangles. Si la carte graphique incorpore un processeur de shader capable de faire de tels calculs, alors il peut servir pour les deux. Pour implémenter les shaders, il a fallu ajouter des processeurs à la carte graphique. Les processeurs en question exécutent les shaders, ils peuvent lire ou écrire dans des textures, mais ne font rien d'autres. Les ''vertex shaders'' font tout ce qui a trait à la géométrie, ils remplacent l'unité de T&L. Les pixels shaders sont entre la rastérisation et les ROPs, ils sont très liés à l'unité de texture. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | rowspan="2" class="f_rouge" | ''Vertex shader'' | rowspan="2" | Rastérisation | Placage de textures | rowspan="2" |''Raster Operations Pipeline'' |- | class="f_rouge" | ''Pixel shader'' |} {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage des anciens PC | prevText=Les cartes d'affichage des anciens PC | next=Avant les GPUs : les cartes accélératrices 3D | nextText=Avant les GPUs : les cartes accélératrices 3D }}{{autocat}} o9kkdcvk2ktcqu9eqihpm3q5anm2phl 764869 764868 2026-04-24T17:47:50Z Mewtow 31375 /* L'algorithme du peintre */ 764869 wikitext text/x-wiki Le premier jeu à utiliser de la "vraie 3D" texturée fut le jeu Quake, premier du nom. Et depuis sa sortie, la grande majorité des jeux vidéo utilisent de la 3D, même s'il existe encore quelques jeux en 2D. Face à la prolifération des jeux vidéo en 3D, les fabricants de cartes graphiques ont inventé les cartes accélératrices 3D, des cartes vidéo capables d'accélérer le rendu en 3D. Dans ce chapitre, nous allons voir comment elles fonctionnent et comment elles ont évolué dans le temps. Pour comprendre comment celles-ci fonctionnent, il faut faire quelques rapides rappels sur les bases du rendu 3D. ==Les bases du rendu 3D== Une '''scène 3D''' est composée d'un espace en trois dimensions, dans laquelle le moteur d’un jeu vidéo place des objets et les fait bouger. Cette scène est, en première approche, un simple parallélogramme. Un des coins de ce parallélogramme sert d’origine à un système de coordonnées : il est à la position (0, 0, 0), et les axes partent de ce point en suivant les arêtes. Les objets seront placés à des coordonnées bien précises dans ce parallélogramme. ===Les objets 3D et leur géométrie=== <noinclude>[[File:Dolphin triangle mesh.png|vignette|Illustration d'un dauphin, représenté avec des triangles.]]</noinclude> Dans la quasi-totalité des jeux vidéo actuels, les objets et la scène 3D sont modélisés par un assemblage de triangles collés les uns aux autres, ce qui porte le nom de '''maillage''', (''mesh'' en anglais). Il a été tenté dans le passé d'utiliser des quadrilatères (rendu dit en ''quad'') ou d'autres polygones, mais les contraintes techniques ont fait que ces solutions n'ont pas été retenues. [[File:CG WIKI.jpg|centre|vignette|upright=2|Exemple de modèle 3D.]] Les modèles 3D sont définis par leurs sommets, aussi appelés '''vertices''' dans le domaine du rendu 3D. Chaque sommet possède trois coordonnées, qui indiquent sa position dans la scène 3D : abscisse, ordonnée, profondeur. Les sommets sont regroupés en triangles, qui sont formés en combinant trois sommets entre eux. Les anciennes cartes graphiques géraient aussi d'autres formes géométriques, comme des points, des lignes, ou des quadrilatères. Les quadrilatères étaient appelés des ''quads'', et ce terme reviendra occasionnellement dans ce cours. De telles formes basiques, gérées nativement, sont appelées des '''primitives'''. La représentation exacte d'un objet est donc une liste plus ou moins structurée de sommets. La liste doit préciser les coordonnées de chaque sommet, ainsi que comment les relier pour former des triangles. Pour cela, l'objet est représenté par une structure qui contient la liste des sommets, mais aussi de quoi savoir quels sont les sommets reliés entre eux par un segment. Nous en dirons plus dans le chapitre sur le rendu de la géométrie. ===La caméra : le point de vue depuis l'écran=== Outre les objets proprement dit, on trouve une '''caméra''', qui représente les yeux du joueur. Cette caméra est définie au minimum par : * une position ; * par la direction du regard (un vecteur). A la caméra, il faut ajouter tout ce qui permet de déterminer le '''champ de vision'''. Le champ de vision contient tout ce qui est visible à l'écran. Et sa forme dépend de la perspective utilisée. Dans le cas le plus courant dans les jeux vidéos en 3D, il correspond à une '''pyramide de vision''' dont la pointe est la caméra, et dont les faces sont délimitées par les bords de l'écran. A l'intérieur de la pyramide, il y a un rectangle qui représente l'écran du joueur, appelé le '''''viewport'''''. <noinclude>[[File:ViewFrustum.jpg|centre|vignette|upright=2|Caméra.]]</noinclude> [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] La majorité des jeux vidéos ajoutent deux plans : * un ''near plane'' en-deça duquel les objets ne sont pas affichés. Il élimine du champ de vision les objets trop proches. * Un ''far plane'', un '''plan limite''' au-delà duquel on ne voit plus les objets. Il élimine les objets trop lointains. Avec ces deux plans, le champ de vision de la caméra est donc un volume en forme de pyramide tronquée, appelé le '''''view frustum'''''. Le tout est parfois appelée, bien que par abus de langage, la pyramide de vision. Avec d'autres perspectives moins utilisées, le ''view frustum'' est un pavé, mais nous n'en parlerons pas plus dans le cadre de ce cours car elles ne sont presque pas utilisés dans les jeux vidéos actuels. ===Les textures=== Tout objet à rendre en 3D est donc composé d'un assemblage de triangles, et ceux-ci sont éclairés et coloriés par divers algorithmes. Pour rajouter de la couleur, les objets sont recouverts par des '''textures''', des images qui servent de papier peint à un objet. Un objet géométrique est donc recouvert par une ou plusieurs textures qui permettent de le colorier ou de lui appliquer du relief. [[File:Texture+Mapping.jpg|centre|vignette|upright=2|Texture Mapping]] Notons que les textures sont des images comme les autres, codées pixel par pixel. Pour faire la différence entre les pixels de l'écran et les pixels d'une texture, on appelle ces derniers des '''texels'''. Ce terme est assez important, aussi profitez-en pour le mémoriser, nous le réutiliserons dans quelques chapitres. Un autre point lié au fait que les textures sont des images est leur compression, leur format. N'allez pas croire que les textures sont stockées dans un fichier .jpg, .png ou tout autre format de ce genre. Les textures utilisent des formats spécialisés, comme le DXTC1, le S3TC ou d'autres, plus adaptés à leur rôle de texture. Mais qu'il s'agisse d'images normales (.jpg, .png ou autres) ou de textures, toutes sont compressées. Les textures sont compressées pour prendre moins de mémoire. Songez que la compression de texture est terriblement efficace, souvent capable de diviser par 6 la mémoire occupée par une texture. S'en est au point où les textures restent compressées sur le disque dur, mais aussi dans la mémoire vidéo ! Nous en reparlerons dans le chapitre sur la mémoire d'une carte graphique. Plaquer une texture sur un objet peut se faire de deux manières, qui portent les noms de placage de texture inverse et direct. Le placage de texture direct a été utilisé au tout début de la 3D, sur des bornes d'arcade et les consoles de jeu 3DO, PS1, Sega Saturn. De nos jours, on utilise uniquement la technique de placage de texture inverse. Les deux seront décrites dans le détail plus bas. ===La différence entre rastérisation et lancer de rayons=== [[File:Render Types.png|vignette|Même géométrie, plusieurs rendus différents.]] Les techniques de rendu 3D sont nombreuses, mais on peut les classer en deux grands types : le ''lancer de rayons'' et la ''rasterization''. Sans décrire les deux techniques, sachez cependant que le lancer de rayon n'est pas beaucoup utilisé pour les jeux vidéo. Il est surtout utilisé dans la production de films d'animation, d'effets spéciaux, ou d'autres rendu spéciaux. Dans les jeux vidéos, il est surtout utilisé pour quelques effets graphiques, la rasterization restant le mode de rendu principal. La raison principale est que le lancer de rayons demande beaucoup de puissance de calcul. Une autre raison est que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Il a existé des cartes accélératrices permettant d'accélérer le rendu en lancer de rayons, mais elles sont restées confidentielles. Les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, mais ils restent d'un usage marginal et servent de compléments au rendu par rastérization. Un chapitre entier sera dédié aux cartes accélératrices de lancer de rayons et nous verrons pourquoi le lancer de rayons est difficile à implémenter avec des performances convenables, ce qui explique que les jeux vidéo utilisent la ''rasterization''. La rastérisation est structurée autour de trois étapes principales : * Une étape purement logicielle, effectuée par le processeur, où le moteur physique calcule la géométrie de la scène 3D. * Une étape de '''traitement de la géométrie''', qui gère tout ce qui a trait aux sommets et triangles. * Une étape de '''rastérisation''' qui détermine sur quels pixels de l'écran est affiché le triangle. * Une étape de '''traitement des pixels''', qui colorie les pixels et gère les textures. [[File:Graphics pipeline 2 en.svg|centre|vignette|upright=2.5|Pipeline graphique basique.]] Il existe plusieurs rendus différents et la rastérisation ne se fait pas de la même manière selon le rendu utilisé. Il existe des rendus sans textures, d'autres avec, d'autres avec éclairage, d'autres sans, etc. Par contre, l'étape de calcul de la géométrie est la même quel que soit le rendu ! Mieux : le calcul de la géométrie se fait de la même manière entre rastérisation et lancer de rayons, il est le même quelle que soit la technique de rendu 3D utilisée. Les trois étapes précédentes sont réalisées dans des circuits ou processeurs séparés, comme on le verra plus tard. Et cela permet d'utiliser la technique dite du '''pipeline'''. Concrètement, supposons que la carte graphique traite les données par paquets de triangles (en réalité, c'est des paquets de sommets, mais passons). L'étape de traitement de la géométrie peut travailler sur un paquet de triangle, pendant que le paquet précédent est dans l'étape de rastérisation, et que le paquet encore précédent est en train de traiter ses pixels. Cela permet de traiter trois paquets de triangles en même temps, mais à des états d'avancements différents. Mieux que cela : le traitement de la géométrie est lui-même composé d'une succession de sous-étapes, la rasterisation est elle-même découpée en plusieurs sous-étapes, et ainsi de suite. Le nombre d'étapes pour une carte graphique moderne dépasse la dizaine. La rastérisation calcule un rendu 3D avec une suite d'étapes consécutives qui doivent s'enchainer dans un ordre bien précis. L'ensemble de ces étapes est appelé le '''pipeline graphique''', qui sera détaillé dans ce qui suit. ==Le calcul de la géométrie== Le calcul de la géométrie regroupe plusieurs manipulations différentes. La principale demande juste de placer les modèles 3D dans la scène, de placer les objets dans le monde. Puis, il faut centrer la scène 3D sur la caméra. Les deux changements ont pour point commun de demander des changements de repères. Par changement de repères, on veut dire que l'on passe d'un système de coordonnées à un autre. En tout, il existe trois changements de repères distincts qui sont regroupés dans l''''étape de transformation''' : un premier qui place chaque objet 3D dans la scène 3D, un autre qui centre la scène du point de vue de la caméra, et un autre qui corrige la perspective. ===Les trois étapes de transformation=== La première étape place les objets 3D dans la scène 3D. Un modèle 3D est représentée par un ensemble de sommets, qui sont reliés pour former sa surface. Les données du modèle 3D indiquent, pour chaque sommet, sa position par rapport au centre de l'objet qui a les coordonnées (0, 0, 0). La première étape place l'objet 3D à une position dans la scène 3D, déterminée par le moteur physique, qui a des coordonnées (X, Y, Z). Une fois placé dans la scène 3D, le centre de l'objet passe donc des coordonnées (0, 0, 0) aux coordonnées (X, Y, Z) et tous les sommets de l'objet doivent être mis à jour. De plus, l'objet a une certaine orientation : il faut aussi le faire tourner. Enfin, l'objet peut aussi subir une mise à l'échelle : on peut le gonfler ou le faire rapetisser, du moment que cela ne modifie pas sa forme, mais simplement sa taille. En clair, le modèle 3D subit une translation, une rotation et une mise à l'échelle, les trois impliquant une modification des coordonnées des sommets.. [[File:Similarity and congruence transformations.svg|centre|vignette|upright=1.5|Transformations géométriques possibles pour chaque triangle.]] Une fois le placement des différents objets effectué, la carte graphique effectue un changement de coordonnées pour centrer le monde sur la caméra. Au lieu de considérer un des bords de la scène 3D comme étant le point de coordonnées (0, 0, 0), il va passer dans le référentiel de la caméra. Après cette transformation, le point de coordonnées (0, 0, 0) sera la caméra. La direction de la vue du joueur sera alignée avec l'axe de la profondeur (l'axe Z). [[File:View transform.svg|centre|vignette|upright=2|Étape de transformation dans un environnement en deux dimensions : avant et après. On voit que l'on centre le monde sur la position de la caméra et dans sa direction.]] Enfin, il faut aussi corriger la perspective, ce qui est le fait de l'étape de projection, qui modifie la forme du ''view frustum'' sans en modifier le contenu. Différents types de perspective existent et celles-ci ont un impact différent les unes des autres sur le ''view frustum''. Dans le cas qui nous intéresse, le ''view frustum'' passe d’une forme de trapèze tridimensionnel à une forme de pavé dont l'écran est une des faces. ===Les changements de coordonnées se font via des multiplications de matrices=== Les trois étapes précédentes demande de faire des changements de coordonnées, chaque sommet voyant ses coordonnées remplacées par de nouvelles. Or, un changement de coordonnée s'effectue assez simplement, avec des matrices, à savoir des tableaux organisés en lignes et en colonnes avec un nombre dans chaque case. Un changement de coordonnées se fait simplement en multipliant le vecteur (X, Y, Z) des coordonnées d'un sommet par une matrice adéquate. Il existe des matrices pour la translation, la mise à l'échelle, d'autres pour la rotation, une autre pour la transformation de la caméra, une autre pour l'étape de projection, etc. Un changement de coordonnée s'effectue assez simplement en multipliant le vecteur-coordonnées (X, Y, Z) d'un sommet par une matrice adéquate. Un petit problème est que les matrices qui le permettent sont des matrices avec 4 lignes et 4 colonnes. Or, la multiplication demande que le nombre de coordonnées du vecteur soit égal au nombre de colonnes. Pour résoudre ce petit problème, on ajoute une 4éme coordonnée aux sommets, la coordonnée homogène, qui ne sert à rien, et est souvent mise à 1, par défaut. Mais oublions ce détail. Il se trouve que multiplier des matrices amène certaines simplifications. Au lieu de faire plusieurs multiplications de matrices, il est possible de fusionner les matrices en une seule, ce qui permet de simplifier les calculs. Ce qui fait que le placement des objets, changement de repère pour centrer la caméra, et d'autres traitements forts différents sont regroupés ensemble. Le traitement de la géométrie implique, sans surprise, des calculs de géométrie dans l'espace. Et cela implique des opérations mathématiques aux noms barbares : produits scalaires, produits vectoriels, et autres calculs impliquant des vecteurs et/ou des matrices. Et les calculs vectoriels/matriciels impliquent beaucoup d'additions, de soustractions, de multiplications, de division, mais aussi des opérations plus complexes : calculs trigonométriques, racines carrées, inverse d'une racine carrée, etc. Au final, un simple processeur peut faire ce genre de calculs, si on lui fournit le programme adéquat, l'implémentation est assez aisée. Mais on peut aussi implémenter le tout avec un circuit spécialisé, non-programmable. Les deux solutions sont possibles, tant que le circuit dispose d'assez de puissance de calcul. Les cartes graphiques anciennes contenaient un ou plusieurs circuits de multiplication de matrices spécialisés dans l'étape de transformation. Chacun de ces circuits prend un sommet et renvoie le sommet transformé. Ils sont composés d'un gros paquet de multiplieurs et d'additionneurs flottants. Pour plus d'efficacité, les cartes graphiques comportent plusieurs de ces circuits, afin de pouvoir traiter plusieurs sommets en même temps. ==L'élimination des surfaces cachées== Un point important du rendu 3D est que ce que certaines portions de la scène 3D ne sont pas visibles depuis la caméra. Et idéalement, les portions de la scène 3D qui ne sont pas visibles à l'écran ne doivent pas être calculées. A quoi bon calculer des choses qui ne seront pas affichées ? Ce serait gâcher de la puissance de calcul. Et pour cela, de nombreuses optimisations visent à éliminer les calculs inutiles. Elles sont regroupées sous les termes de '''''clipping''''' ou de '''''culling'''''. La différence entre ''culling'' et ''clipping'' n'est pas fixée et la terminologie n'est pas claire. Dans ce qui va suivre, nous n'utiliserons que le terme ''culling''. Les cartes graphiques modernes embarquent diverses méthodes de ''culling'' pour abandonner les calculs quand elles s’aperçoivent que ceux-ci portent sur une partie non-affichée de l'image. Cela fait des économies de puissance de calcul assez appréciables et un gain en performance assez important. Précisons que le ''culling'' peut être plus ou moins précoce suivant le type de rendu 3D utilisé, mais nous verrons cela dans la suite du chapitre. ===Les différentes formes de ''culling''/''clipping''=== La première forme de ''culling'' est le '''''view frustum culling''''', dont le nom indique qu'il s'agit de l'élimination de tout ce qui est situé en-dehors du ''view frustum''. Ce qui est en-dehors du champ de vision de la caméra n'est pas affiché à l'écran n'est pas calculé ou rendu, dans une certaine mesure. Le ''view frustum culling'' est assez trivial : il suffit d'éliminer ce qui n'est pas dans le ''view frustum'' avec quelques calculs de coordonnées assez simples. Quelques subtilités surviennent quand un triangle est partiellement dans le ''view frustrum'', ce qui arrive parfois si le triangle est sur un bord de l'écran. Mais rien d'insurmontable. [[File:View frustum culling.svg|centre|vignette|upright=1|''View frustum culling'' : les parties potentiellement visibles sont en vert, celles invisibles en rouge et celles partiellement visibles en bleu.]] Les autres formes de ''culling'' visent à éliminer ce qui est dans le ''view frustum'', mais qui n'est pas visible depuis la caméra. Pensez à des objets cachés par un autre objet plus proche, par exemple. Ou encore, pensez aux faces à l'arrière d'un objet opaque qui sont cachées par l'avant. Ces deux cas correspondent à deux types de ''culling''. L'élimination des objets masqués par d'autres est appelé l'''occlusion culling''. L'élimination des parties arrières d'un objet est appelé le ''back-face culling''. Dans les deux cas, nous parlerons d''''élimination des surfaces cachées'''. [[File:Occlusion culling example PL.svg|centre|vignette|''Occlusion culling'' : les objets en bleu sont visibles, ceux en rouge sont masqués par les objets en bleu.]] Le lancer de rayons n'a pas besoin d'éliminer les surfaces cachées, il ne calcule que les surfaces visibles. Par contre, la rastérisation demande d'éliminer les surfaces cachées. Sans cela, le rendu est incorrect dans le pire des cas, ou alors le rendu calcule des surfaces invisibles pour rien. Il existe de nombreux algorithmes logiciels pour implémenter l'élimination des surfaces cachées, mais la carte graphique peut aussi s'en charger. L'''occlusion culling'' demande de connaitre la distance à la caméra de chaque triangle. La distance à la caméra est appelée la '''profondeur''' du triangle. Elle est déterminée à l'étape de rastérisation et est calculée à chaque sommet. Lors de la rastérisation, chaque sommet se voit attribuer trois coordonnées : deux coordonnées x et y qui indiquent sa position à l'écran, et une coordonnée de profondeur notée z. ===L'algorithme du peintre=== Pour éliminer les surfaces cachées, la solution la plus simple consiste simplement à rendre les triangles du plus lointain au plus proche. L'idée est que si deux triangles se recouvrent totalement ou partiellement, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Il ne s'agit ni plus ni moins que de l''''algorithme du peintre'''. [[File:Polygons cross.svg|vignette|Polygons cross]] <noinclude>[[File:Painters problem.svg|vignette|Painters problem]]</noinclude> Un problème est que la solution ne marche pas avec certaines configurations particulières, dans le cas où des polygones un peu complexes se chevauchent plusieurs fois. Il se présente rarement dans un rendu 3D normal, mais c'est quand même un cas qu'il faut gérer. Le problème est suffisant pour que cette solution ne soit plus utilisée dans le rendu 3D normal. Un autre problème est que l'algorithme demande de trier les triangles d'une scène 3D selon leur profondeur, du plus profond au moins profond. Et les cartes graphiques n'aiment pas ça, que ce soit les anciennes cartes graphiques comme les modernes. Il s'agit généralement d'une tâche qui est réalisée par le processeur, le CPU, qui est plus efficace que le GPU pour trier des trucs. Aussi, l'algorithme du peintre était utilisé sur d'anciennes cartes graphiques, qui ne géraient pas la géométrie mais seulement les textures et quelques effets de post-processing. Avec ces GPU, les jeux vidéo calculaient la géométrie et la triait sur le CPU, puis effectuaient le reste de la rastérisation sur le GPU. Les anciens jeux en 2.5D comme DOOM ou les DOOM-like, utilisaient une amélioration de l'algorithme du peintre. L'amélioration variait suivant le moteur de jeu utilisé, et donnait soit une technique dite de ''portal rendering'', soit un système de ''Binary Space Partionning'', assez complexes et difficiles à expliquer. Mais il ne s'agissait pas de jeux en 3D, les maps de ces jeux avaient des contraintes qui rendaient cette technique utilisable. Ils n'avaient pas de polygones qui se chevauchent, notamment. ===Le tampon de profondeur=== [[File:Z-buffer no text.jpg|vignette|Z-buffer correspondant à un rendu]] Une autre solution utilise ce qu'on appelle un '''tampon de profondeur''', aussi appelé un ''z-buffer''. Il s'agit d'un tableau, stocké en mémoire vidéo, qui mémorise la coordonnée z de l'objet le plus proche pour chaque pixel. Par défaut, ce tampon de profondeur est initialisé avec la valeur de profondeur maximale, celle du ''far plane'' du ''viewfrustum''. Au fur et à mesure que les objets seront calculés, le tampon de profondeur est mis à jour, conservant ainsi la trace de l'objet le plus proche de la caméra. Si jamais un triangle a une coordonnée z plus grande que celle du tampon de profondeur, cela veut dire qu'il est situé derrière un objet déjà rendu. Il est éliminé (sauf si transparence il y a) et le tampon de profondeur n'a pas à être mis à jour. Dans le cas contraire, l'objet est plus près de la caméra et sa coordonnée z remplace l'ancienne valeur z dans le tampon de profondeur. [[File:Z-buffer.svg|centre|vignette|upright=2.0|Illustration du processus de mise à jour du Z-buffer.]] Il existe des techniques alternatives pour coder la coordonnée de profondeur, qui se distinguent par le fait que la coordonnée z n'est pas proportionnelle à la distance entre le fragment et la caméra. Mais il s'agit là de détails assez mathématiques que je me permets de passer sous silence. Dans la suite de ce cours, nous allons juste parler de profondeur pour regrouper toutes ces techniques, conventionnelles ou alternatives. Toutes les cartes graphiques modernes utilisent un système de ''z-buffer''. C'est la seule solution pour avoir des performances dignes de ce nom. Il faut cependant noter qu'elles utilisent des tampons de profondeur légèrement modifiés, qui ne mémorisent pas la coordonnée de profondeur, mais une valeur dérivée. Pour simplifier, ils ne mémorisent pas la coordonnée de profondeur z, mais son inverse 1/z. Les raisons à cela ne peuvent pas encore être expliquées à ce moment du cours, aussi nous allons simplement dire que c'est une histoire de correction de perspective. Les coordonnées z et 1/z sont codées sur quelques bits, allant de 16 bits pour les anciennes cartes graphiques, à 24/32 bits pour les cartes plus récentes. De nos jours, les Z-buffer de 16 bits sont abandonnés et toutes les cartes graphiques utilisent des coordonnées z de 24 à 32 bits. La raison est que les Z-buffer de 16 bits ont une précision insuffisante, ce qui fait que des artefacts peuvent survenir. Si deux objets sont suffisamment proches, le tampon de profondeur n'a pas la précision suffisante pour discriminer les deux objets. Pour lui, les deux objets sont à la même place. Conséquence : il faut bien choisir un des deux objets et ce choix se fait pixel par pixel, ce qui fait des artefacts visuels apparaissent. On parle alors de '''''z-fighting'''''. Voici ce que cela donne : [[File:Z-fighting.png|centre|vignette|Z-fighting]] Un défaut du tampon de profondeur est qu'il ne gère pas correctement les objets transparents. Dès que de la transparence est présente dans une scène 3D, le tampon de profondeur ne peut pas être utilisé. Une solution pour cela est de rendre une scène 3D en deux phases : une pour les objets opaques, une avec les objets transparents. La où on rend les objets opaques utilise le tampon de profondeur, mais il est désactivé lors de la seconde. ==La rastérisation et les textures== Dans cette section, nous allons voir ensemble l'étape de rastérisation et l'étape de traitement des pixels. La rastérisation est difficile à expliquer, surtout que son rôle exact dépend de la technique de rendu utilisée. Pour simplifier, elle projette un rendu en 3D sur un écran en 2D. Une autre explication tout aussi vague est qu'elle s'occupe la traduction des triangles en un affichage pixelisé à l'écran. Elle détermine à quoi ressemble la scène visible sur l'écran. C'est par exemple lors de cette étape que sont appliquées certaines techniques de ''culling'', qui éliminent les portions non-visibles de l'image, ainsi qu'une correction de la perspective et diverses opérations d'interpolation dont nous parlerons dans plusieurs chapitres. La rastérisation et placage de textures sont deux opérations très liées entre elles. Il existe deux manières principales pour lier les textures à la géométrie : la méthode directe et la méthode inverse (''UV Mapping''). Et les deux font que la rastérisation se fait de manière très différente. Précisons cependant que les rendus les plus simples n'utilisent pas de textures du tout. Ils se contentent de colorier les triangles, voire d'un simple rendu en fil de fer basé sur du tracé de lignes. Dans la suite de cette section, nous allons voir les quatre types de rendu principaux : le rendu en fils de fer, le rendu colorié, et deux rendus utilisant des textures. ===Le rendu en fil de fer=== [[File:Obj lineremoval.png|vignette|Rendu en fil de fer d'un objet 3D.]] Le '''rendu 3D en fils de fer''' est illustré ci-contre. Il s'agit d'un rendu assez ancien, utilisé au tout début de la 3D, sur des machines qu'on aurait du mal à appeler ordinateurs. Il se contente de tracer des lignes à l'écran, lignes qui connectent deux sommets, qui ne sont autres que les arêtes de la géométrie de la scène rendue. Le tout était suffisant pour réaliser quelques jeux vidéos rudimentaires. Les tout premiers jeux vidéos utilisaient ce rendu, l'un d'entre eux étant Maze War, le tout premier FPS. {| |[[File:Maze war.jpg|vignette|Maze war]] |[[File:Maze representation using wireframes 2022-01-10.gif|centre|vignette|Maze representation using wireframes 2022-01-10]] |} Le monde est calculé en 3D, il y a toujours un calcul de la géométrie, la scène est rastérisée normalement, les portions invisbles de l'image sont retirées, mais il n'y a pas d'application de textures après rastérisation. A la place, un algorithme de tracé de ligne trace les lignes à l'écran. Quand un triangle passe l'étape de rastérisation, l'étape de rastérisation fournit la position des trois sommets sur l'écran. En clair, elle fournit les coordonnées de trois pixels, un par sommet. A la suite, un algorithme de tracé de ligne trace trois lignes, une par paire de sommet. L'implémentation demande juste d'avoir une unité de calcul géométrique, une unité de rastérisation, et un VDC qui supporte le tracé de lignes. Elle est donc assez simple et ne demande pas de circuits de gestion des textures ni de ROP. Le VDC écrit directement dans le ''framebuffer'' les lignes à tracer. Il a existé des proto-cartes graphiques spécialisées dans ce genre de rendu, comme le '''''Line Drawing System-1''''' de l'entreprise Eans & Sutherland. Nous détaillerons son fonctionnement dans quelques chapitres. ===Le rendu à primitives colorées=== [[File:MiniFighter.png|vignette|upright=1|Exemple de rendu pouvant être obtenu avec des sommets colorés.]] Une amélioration du rendu précédent utilise des triangles/''quads'' coloriés. Chaque triangle ou ''quad'' est associé à une couleur, et cette couleur est dessinée sur le triangle/''quad''après la rastérisation. Le rendu est une amélioration du rendu en fils de fer. L'idée est que chaque triangle/''quad'' est associé à une couleur, qui est dessinée sur le triangle/''quad'' après la rastérisation. La technique est nommée ''colored vertices'' en anglais, nous parlerons de '''rendu à maillage coloré'''. [[File:Malla irregular de triángulos modelizando una superficie convexa.png|centre|vignette|upright=2|Maillage coloré.]] La couleur est propagée lors des calculs géométriques et de la rastérisation, sans subir de modifications. Une fois un rendu en fils de fer effectué, la couleur du triangle est récupérée. Le triangle/''quad'' rendu correspond à un triangle/''quad'' à l'écran. Et l'intérieur de ce triangle/''quad'' est colorié avec la couleur transmise. Pour cela, on utilise encore une fois une fonction du VDC : celle du remplissage de figure géométrique. Nous l’avions vu en parlant des VDC à accélération 2D, mais elle est souvent prise en charge par les ''blitters''. Ils peuvent remplir une figure géométrique avec une couleur unique, on réutilise cette fonction pour colorier le triangle/''quad''. L'étape de rastérisation fournit les coordonnées des sommets de la figure géométrique, le ''blitter'' les utilise pour colorier la figure géométrique. Niveau matériel, quelques bornes d'arcade ont utilisé ce rendu. La toute première borne d'arcade utilisant le rendu à maillage coloré est celle du jeu I Robot, d'Atari, sorti en 1983. Par la suite, dès 1988, les cartes d'arcades Namco System 21 et les bornes d'arcades Sega Model 1 utilisaient ce genre de rendu. On peut s'en rendre compte en regardant les graphismes des jeux tournant sur ces bornes d'arcade. Des jeux comme Virtua Racing, Virtua Fighter ou Virtua Formula sont assez parlants à ce niveau. Leurs graphismes sont assez anguleux et on voit qu'ils sont basés sur des triangles uniformément colorés. Pour ceux qui veulent en savoir plus sur la toute première borne d'arcade en rendu à maillage colorée, la borne ''I Robot'' d'Atari, voici une vidéo youtube à ce sujet : * [https://www.youtube.com/watch?v=6miEkPENsT0 I Robot d'Atari, le pionnier de la 3D Flat.] ===Le placage de textures direct=== Les deux rendus précédents sont très simples, mais n'utilisent pas de textures. Et il est temps de voir les deux rendus qui utilisent des textures. Il y en a deux types, appelés rendu avec placage de texture direct et indirect, nous allons voir le '''rendu par placage de texture direct''' en premier. Et nous l'appellerons ''rendu direct'' dans ce qui suit, pour simplifier les explications. L'idée est assez simple et peut utiliser aussi bien des triangles que des ''quads'', mais nous allons partir du principe qu'elle utilise des '''''quads''''', à savoir que les objets 3D sont composés de quadrilatères. Lorsqu'un ''quad'' est rastérisé, sa forme à l'écran est un rectangle déformé par la perspective. On obtient un rectangle si le ''quad'' est vu de face, un trapèze si on le voit de biais. Et le ''sprite'' doit être déformé de la même manière que le ''quad''. L'idée est que tout quad est associé à une texture, à un sprite. La figure géométrique qui correspond à un ''quad'' à l'écran est remplie non pas par une couleur uniforme, mais par un ''sprite'' rectangulaire. Il suffit techniquement de recopier le ''sprite'' à l'écran, c'est à dire dans la figure géométrique, au bon endroit dans le ''framebuffer''. Le rendu direct est en effet un intermédiaire entre rendu 2D à base de ''sprite'' et rendu 3D moderne. La géométrie est rendue en 3D pour générer des ''quads'', mais ces ''quads'' ne servent à guider la copie des sprites/textures dans le ''framebuffer''. [[File:TextureMapping.png|centre|vignette|upright=2|Exemple caricatural de placage de texture sur un ''quad''.]] La subtilité est que le sprite est déformé de manière à rentrer dans un quadrilatère, qui n'est pas forcément un rectangle à l'écran, mais est déformé par la perspective et son orientation en 3D. Le sprite doit être déformé de deux manières : il doit être agrandi/réduit en fonction de la taille de la figure affichée à l'écran, tourné en fonction de l'orientation du ''quad'', déformé pour gérer la perspective. Pour cela, il faut connaitre les coordonnées de profondeur de chaque bord d'un ''quad'', et de faire quelques calculs. N'importe quel VDC incluant un ''blitter'' avec une gestion du zoom/rotation des sprites peut le faire. : Si on veut avoir de beaux graphismes, il vaut mieux appliquer un filtre pour lisser le sprite envoyé dans le trapèze, filtre qui se résume à une opération d'interpolation et n'est pas très différent du filtrage de texture qui lisse les textures à l'écran. Un autre point est que les ''quads'' doivent être rendus du plus lointain au plus proche. Sans cela, on obtient rapidement des erreurs de rendu. L'idée est que si deux quads se chevauchent, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. L'écriture du sprite du second quad écrasera les données du premier quad, pour les portions recouvertes, lors de l'écriture du sprite dans le ''framebuffer''. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Le rendu inverse utilise très souvent des triangles pour la géométrie, alors que le rendu direct a tendance à utiliser des ''quads'', mais il ne s'agit pas d'une différence stricte. L'usage de triangles/''quads'' peut se faire aussi bien avec un rendu direct comme avec un rendu inverse. Cependant, le rendu en ''quad'' se marie très bien au rendu direct, alors que le rendu en triangle colle mieux au rendu inverse. L'avantage de cette technique est qu'on parcourt les textures dans un ordre bien précis. Par exemple, on peut parcourir la texture ligne par ligne, l'exploiter par blocs de 4*4 pixels, etc. Et accéder à une texture de manière prédictible se marie bien avec l'usage de mémoires caches, ce qui est un avantage en matière de performances. Mais un même pixel du ''framebuffer'' est écrit plusieurs fois quand plusieurs quads se superposent, alors que le rendu inverse gère la situation avec une seule écriture (sauf si usage de la transparence). De plus, la gestion de la transparence était compliquée et les jeux devaient ruser en utilisation des solutions logicielles assez complexes. Niveau implémentation matérielle, une carte graphique en rendu direct demande juste trois circuits. Le premier est un circuit de calcul géométrique, qui rend la scène 3D. Le tri des quads est souvent réalisé par le processeur principal, et non pas par un circuit séparé. Toutes les étapes au-delà de l'étape de rastérisation étaient prises en charge par un VDC amélioré, qui écrivait des sprites/textures directement dans le ''framebuffer''. {|class="wikitable" |- ! Géométrie | Processeurs dédiés programmé pour émuler le pipeline graphique |- ! Tri des quads du plus lointain au plus proche | Processeur principal (implémentation logicielle) |- ! Application des textures | ''Blitter'' amélioré, capable de faire tourner et de zoomer sur des ''sprites''. |} L'implémentation était très simple et réutilisait des composants déjà existants : des VDC 2D pour l'application des textures, des processeurs dédiés pour la géométrie. Les unités de calcul de la géométrie étaient généralement implémentées avec un ou plusieurs processeurs dédiés. Vu qu'on savait déjà effectuer le rendu géométrique en logiciel, pas besoin de créer un circuit sur mesure. Il suffisait de dédier un processeur spécialisé rien que pour les calculs géométriques et on lui faisait exécuter un code déjà bien connu à la base. En clair, ils utilisaient un code spécifique pour émuler un circuit fixe. C'était clairement la solution la plus adaptée pour l'époque. Les unités géométriques étaient des processeurs RISC, normalement utilisés dans l'embarqué ou sur des serveurs. Elles utilisaient parfois des DSP. Pour rappel, les DSP des processeurs de traitement de signal assez communs, pas spécialement dédiés aux rendu 3D, mais spécialisé dans le traitement de signal audio, vidéo et autre. Ils avaient un jeu d'instruction assez proche de celui des cartes graphiques actuelles, et supportaient de nombreuses instructions utiles pour le rendu 3D. [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] Le rendu direct a été utilisé dans la période de transition entre rendu 2D et rendu 3D, car il était très adapté pour faire cette transition. Coupler un VDC à un processeur pour la géométrie était particulièrement simple à l'époque. Le rendu direct a été utilisé sur des bornes d'arcade dès les années 90. Outre les bornes d'arcade, quelques consoles de 5ème génération utilisaient le rendu direct, avec les mêmes solutions matérielles. La géométrie était calculée sur plusieurs processeurs dédiés. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. Deux consoles étaient dans ce cas : la 3DO, et la Sega Saturn. Le rendu direct est aujourd'hui abandonné. ===Le placage de textures inverse=== Le rendu précédent, le rendu direct, permet d'appliquer des textures directement dans le ''framebuffer''. Mais comme dit plus haut, il existe une seconde technique pour plaquer des textures, appelé le '''placage de texture inverse''', aussi appelé l'''UV Mapping''. Elle associe une texture complète pour un modèle 3D,contrairement au placage de tecture direct qui associe une texture par ''quad''/triangle. L'idée est que l'on attribue un texel à chaque sommet. Plus précisémment, chaque sommet est associé à des '''coordonnées de texture''', qui précisent quelle texture appliquer, mais aussi où se situe le texel à appliquer dans la texture. Par exemple, la coordonnée de texture peut dire : je veux le pixel qui est à ligne 5, colonne 27 dans cette texture. La correspondance entre texture et géométrie est réalisée lorsque les créateurs de jeu vidéo conçoivent le modèle de l'objet. [[File:Texture Mapping example.png|centre|vignette|upright=2|Exemple de placage de texture.]] Dans les faits, on n'utilise pas de coordonnées entières de ce type, mais deux nombres flottants compris entre 0 et 1. La coordonnée 0,0 correspond au texel en bas à gauche, celui de coordonnée 1,1 est tout en haut à droite. L'avantage est que ces coordonnées sont indépendantes de la résolution de la texture, ce qui aura des avantages pour certaines techniques de rendu, comme le ''mip-mapping''. Les deux coordonnées de texture sont notées u,v avec DirectX, ou encore s,t dans le cas général : u est la coordonnée horizontale, v la verticale. [[File:UVMapping.png|centre|vignette|upright=2|UV Mapping]] Avec le placage de texture inverse, la rastérisation se fait grosso-modo en trois étapes : la rastérisation proprement dite, le placage de textures, et les opérations finales qui écrivent un pixel dans le ''framebuffer''. Au niveau du matériel, ainsi que dans la plupart des API 3D, les trois étapes sont réalisées par des circuits séparés. [[File:01 3D-Rasterung-a.svg|vignette|Illustration du principe de la rasterization. La surface correspondant à l'écran est subdivisée en pixels carrés, de coordonnées x et y. La caméra est placée au point e. Pour chaque pixel, on trace une droite qui part de la caméra et qui passe par le pixel considéré. L'intersection entre une surface et cette droite se fait en un point, appartenant à un triangle.]] Lors de la rasterisation, chaque triangle se voit attribuer un ou plusieurs pixels à l'écran. Pour bien comprendre, imaginez une ligne droite qui part de caméra et qui passe par un pixel sur le plan de l'écran. Cette ligne intersecte 0, 1 ou plusieurs objets dans la scène 3D. Les triangles situés ces intersections entre cette ligne et les objets rencontrés seront associés au pixel correspondant. L'étape de rastérisation prend en entrée un triangle et renvoie la coordonnée x,y du pixel associé. Il s'agit là d'une simplification, car un triangle tend à occuper plusieurs pixels sur l'écran. L'étape de rastérisation fournit la liste de tous les pixels occupés par un triangle, et les traite un par un. Quand un triangle est rastérisé, le rasteriseur détermine la coordonnée x,y du premier pixel, applique une texture dessus, puis passe au suivant, et rebelote jusqu'à ce que tous les pixels occupés par le triangles aient été traités. L'implémentation matérielle du placage de texture inverse est beaucoup plus complexe que pour les autres techniques. Pour être franc, nous allons passer le reste du cours à parler de l'implémentation matérielle du placage de texture inverse, ce qui prendra plus d'une dizaine de chapitres. ==La transparence, les fragments et les ROPs== Dans ce qui suit, nous allons parler uniquement de la rastérisation avec placage de textures inverse. Les autres formes de rastérisation ne seront pas abordées. La raison est que tous les GPUs modernes utilisent cette forme de rastérisation, les exceptions étant rares. De même, ils utilisent un tampon de profondeur, pour l'élimination des surfaces cachées. La rastérisation effectue donc des calculs géométriques, suivis d'une étape de rastérisation, puis de placage des textures. Ces trois étapes sont réalisées par une unité géométrique, une unité de rastérisation, et un circuit de placage de textures. Du moins sur le principe, car les cartes graphiques modernes ont fortement optimisé l'implémentation et n'ont pas hésité à fusionner certains circuits. Mais nous verrons cela en temps voulu, nous n'allons pas résumer plusieurs décennies d'innovation technologique en quelques paragraphes. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures |} Mais où mettre le tampon de profondeur ? Intuitivement, on se dit qu'il vaut mieux faire l'élimination des surfaces cachées le plus tôt possible, dès que la coordonnée de profondeur est connue. Et elle est connu à l'étape de rastérisation, une fois les sommets transformés. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Tampon de profondeur | Placage de textures |} En réalité, la profondeur des fragments est gérée par un circuit appelé le '''''Raster Operations Pipeline''''' (ROP), situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo. Il est placé à la fin du pipeline pour gérer correctement la transparence. Et nous allons voir pourquoi la transparence est gérée à la fin du pipeline. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} ===Le mélange ''alpha''=== La transparence se manifeste quand plusieurs objets sont l'un derrière l'autre. Histoire de simplifier les explications, nous allons d'abord voir le cas où un objet semi-transparent est devant un objet opaque. La couleur perçue est alors un mélange de la couleur de l'objet opaque et celle de l'objet semi-transparent. Le mélange dépend d'à quel point l'objet semi-transparent est transparent. Avec un objet parfaitement transparent, seul l'objet opaque est visible. Avec un objet à moitié transparent, la couleur finale sera pour moitié celle de l'objet opaque, pour moitié celle de l'objet semi-transparent. Et c'est pareil pour les cas intermédiaires entre un objet totalement transparent et un objet totalement opaque. La transparence d'un objet/pixel est définie par un nombre, appelé la '''composante ''alpha'''''. Plus la composante alpha est élevée, plus le pixel est opaque. Elle vaut 0 pour un objet opaque et 1 pour un objet transparent. Elle est ajoutée aux composantes RGB, ce qui fait que tout fragment contient une "couleur de transparence" en plus des couleurs RGB. Elle agit comme un coefficient qui dit comment mélanger la couleur d'un objet transparent et d'un objet opaque. Le calcul de la transparence est une moyenne pondérée par la composante alpha. On parle alors d''''''alpha blending'''''. : <math>\text{Couleur finale} = \alpha \times \text{Couleur de l'objet transparent} + (1 - \alpha) \times \text{Couleur de l'objet opaque}</math> [[File:Texture splatting.png|centre|vignette|upright=2.0|Calcul de transparence. La première ligne montre le produit pour l'objet transparent, la seconde ligne est celle de l'objet opaque. La troisième ligne est celle de l'addition finale.]] Maintenant, qu'en est-il du cas où plusieurs objets sont superposés ? Si vous tracez une demi-droite dont l'origine est la caméra et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points, un point par objet sur la ligne du regarde. Sans transparence, l'objet le plus proche cache tous les autres et c'est donc lui qui décide de la couleur du pixel. Mais avec un objet transparent, la couleur finale est un mélange de la couleur de plusieurs points d'intersection. Il faut donc calculer un pseudo-pixel pour chaque point d'intersection, auquel on donne le nom de '''fragment'''. Un fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont combinés pour obtenir la couleur finale de ce pixel. Il est possible d'utiliser le mélange ''alpha'' pour cela. Il suffit de faire le mélange ''alpha'' entre le fragment qui vient d'être calculé, et le pixel dans le ''framebuffer''. Pour cela, le fragment a une composante ''alpha'', qui est ajouté aux trois couleurs RGB. Le pixel déjà dans le ''framebuffer'' est un résultat temporaire, né du mélange ''alpha'' de tous les fragments précédents. Un défaut de cette méthode est qu'elle fonctionne assez mal avec un tampon de profondeur. Si le tampon de profondeur est activé, le mélange ''alpha'' ne fonctionne que si les objets sont rendus du plus lointain au plus proche. Et procéder dans cet ordre a un défaut : on dessine des objets dans le ''framebuffer'', pour qu'ensuite les objets devant écrasent ce qui a déjà été dessiné. Un même pixel peut donc être dessiné plusieurs fois, dont une seule sera pertinente. Et ces écritures utilisent de la bande passante mémoire, qui est une ressource précieuse sur un GPU moderne. Il s'agit d'un phénomène appelé '''''overdraw''''', ou sur-dessinage en français. Quelques optimisations permettent d'éliminer l'''overdraw'' en rendant les objets du plus proche au plus lointain, d'autres permettent de dessiner des objets dans un ordre arbitraire, mais nous ne pouvons pas en parler ici. Beaucoup de moteurs 3D rendent séparément les objets opaques et transparents. Une première passe rend les objets opaques, puis les objets transparents sont rendus dans une seconde passe. Les objets opaques sont rendus dans le désordre, ce qui fait qu'on n'a pas à les trier, alors que les objets transparents doivent être triés selon leur distance. un autre avantage est que le mélange ''alpha'' est désactivé lors de la première passe, alors que c'est la mise à jour du tampon de profondeur qui est désactivé lors de la seconde passe, ce qui augmente un peu les performances dans les deux cas. ===Le test ''alpha''=== Le test ''alpha'' est une technique qui permet d'annuler le rendu d'un fragment en fonction de sa transparence. Si la composante alpha est en-dessous ou au-dessus d'un seuil, le fragment est simplement abandonné. Le seuil en question est configurable, de même que la comparaison utilisée : on peut éliminer le fragment si sa transparence est au-dessus d'un certain seuil, en-dessous, égal, différent, etc. Il s'agit d'une optimisation qui est utile dans certains scénarios spécifiques. Par exemple, si l'objet a une transparence très élevée, du genre 95%, autant le compter comme complétement transparent, afin d'éviter des opérations de mélange ''alpha''. En effet, les opérations de mélange ''alpha'' sont très lentes, car elles demandent de faire des opérations de lecture-écriture en mémoire vidéo : on lit un pixel dans le ''framebuffer'', on applique le mélange ''alpha'' et on écrit le résultat en mémoire vidéo. L'''alpha test'' permet donc de gagner en performance au prix d'une baisse de la qualité d'image. Il y a cependant des cas où l'usage du test ''alpha'' est primordial, au-delà d'une question de performances. Un exemple classique est celui du rendu du feuillage dans un jeu 3D. Un feuillage est composé en assemblant plusieurs images de feuilles. Chaque feuille est un carré sur lequel on place une texture de feuille, qui est opaque pour la partie verte des feuilles, transparente pour le reste. Les carrés ne sont cependant pas superposés, mais s'intersectent fortement, ce qui fait que le mélange ''alpha'' ne donne pas de bons résultats. L'usage du test ''alpha'' permet d'obtenir un rendu correct. Pour d'informations via ce lien : * [https://bgolus.medium.com/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f Anti-aliased Alpha Test: The Esoteric Alpha To Coverage]. ===Les effets de brouillard=== Les '''effets de brouillard''' sont nécessaires dans certains jeux vidéo pour l'ambiance (pensez à des jeux d'horreur comme Silent Hill), mais ils ont surtout été utilisés pour économiser des calculs. L'idée est de ne pas calculer les graphismes au-delà d'une certaine distance, sans que cela se voie. Le ''view frustum'' utilise alors un plan limite, au-delà duquel on ne voit pas les objets. Mais ce plan limite donne une cassure inesthétique dans le rendu. Pour masquer cette cassure, les programmeurs ajoutaient un effet de brouillard. Les objets au-delà du plan limite étaient totalement dans le brouillard, puis ce brouillard se réduisait progressivement en se rapprochant de la caméra, avant de s'annuler à partir d'une certaine distance. Pour calculer le brouillard, on effectue un mélange ''alpha'' entre la couleur du pixel et une ''couleur de brouillard''. La différence est que l'on n'utilise pas la transparence pour faire le mélange, mais un '''coefficient de brouillard''', noté <math>\text{fog}(z)</math>. : <math>\text{Couleur finale} = \text{fog}(z) \times \text{Couleur de brouillard} + [ 1 - \text{fog}(z) ] \times \text{Couleur du pixel}</math> Le coefficient de brouillard dépend de la coordonnée de profondeur, de la distance du pixel par rapport à la caméra. Le brouillard démarre à une distance <math>z_{fog-start}</math>, et masque totalement les objets à partir d'une distance <math>z_{fog-end}</math>. Entre les deux, le coefficient de brouillard dépend de la distance. OpenGL autorise trois formules de calcul suivantes : : <math>\text{fog}(z) = \frac{z_{fog-end} - z}{z_{fog-end} - z_{fog-start}}</math> : <math>\text{fog}(z) = e^{- k \times z}</math> : <math>\text{fog}(z) = e^{- (k \times z)^2}</math> ==L'éclairage d'une scène 3D== L'éclairage d'une scène 3D calcule les ombres, mais aussi la luminosité de chaque pixel, ainsi que bien d'autres effets graphiques. Les algorithmes d'éclairage ont longtemps été implémentés directement en matériel, les cartes graphiques géraient l'éclairage dans des circuits spécialisés. Aussi, il est important de voir ces algorithmes d'éclairage. Il est possible d'implémenter l'éclairage à deux endroits différents du pipeline : juste avant la rastérisation, et après la rastérisation. ===Les sources de lumière et les couleurs associées=== L'éclairage d'une scène 3D provient de sources de lumières, comme des lampes, des torches, le soleil, etc. Il existe de nombreux types de sources de lumière, et nous n'allons parler que des principales. Elles sont au nombre de quatre et elles sont illustrées ci-dessous. [[File:3udUJ.gif|centre|vignette|upright=2|Types de sources de lumière.]] [[File:Graphics lightmodel directional.png|vignette|upright=1.0|Source de lumière directionnelle.]] Les '''sources directionnelles''' servent à modéliser des sources de lumière très éloignées, comme le soleil ou la lune. Elles sont simplement définies par un vecteur qui indique la direction de la lumière, rien de plus. Les '''sources ponctuelles''' sont des points, qui émettent de la lumière dans toutes les directions. Elles sont définies par une position, et une intensité lumineuse, éventuellement la couleur de la lumière émise. Il existe deyux types de sources de lumière ponctuelles. * Le premières émettent de manière égale dans toutes les directions. Elles sont appelées des ''point light'' dans le schéma du dessus. * Les secondes émettent de la lumière dans une '''direction privilégiée'''. L'exemple le plus parlant est celui d'une lampe-torche : elle émet de la lumière "tout droit", dans la direction où la lampe est orientée. Elles sont appelées des ''sport light'' dans le schéma du dessus. La direction privilégiée est un vecteur, notée v dans le schéma du dessous. [[File:Graphics lightmodel ambient.png|vignette|upright=1.0|Lumière ambiante.]] En théorie, la lumière rebondit sur les surfaces et a tendance à se disperser un peu partout à force de rebondir. C'est ce qui explique qu'on arrive à voir à l'intérieur d'une pièce si une fenêtre est ouverte. Il en résulte un certain '''éclairage ambiant''', qui est assez difficile à représenter dans un moteur de rendu 3D. Auparavant, l'éclairage ambiant était simulé par une lumière égale en tout point de la scène 3D, appelée simplement la '''lumière ambiante'''. Précisément, on suppose que la lumière ambiante en un point vient de toutes les directions et a une intensité constante, identique dans toutes les directions. Le tout est illustré ci-contre. C'est assez irréaliste, mais ça donne une bonne approximation de la lumière ambiante. ===La lumière incidente : le terme géométrique=== Pour simplifier, nous allons supposer que l'éclairage est calculé pour chaque sommet, pas par triangle. C'est de loin le cas le plus courant, aussi ce n'est pas une simplification abusive. La lumière qui arrive sur un sommet est appelée la '''lumière incidente'''. La couleur d'un sommet dépend de deux choses : la lumière incidente directe, comment il réfléchit cette lumière. Mathématiquement, il est possible de résumer cela avec le produit de deux termes : l'intensité de la lumière incidente, une fonction qui indique comment la surface réfléchit la lumière incidente. La fonction en question est appelée la '''réflectivité bidirectionnelle'''. Le terme anglais est ''bidirectional reflectance distribution function'', abrévié en BRDF, et nous utiliserons cette abréviation dans ce qui suit. : <math>\text{Couleur finale} = \text{Lumière incidente} \times BRDF(...)</math> La lumière incidente vient soit directement des sources de lumière, soit de la lumière qui a rebondit sur d'autres objets proches. La première est appelée la lumière directe, celle qui vient des rebonds s'appelle la lumière indirecte. Pour simplifier, la lumière indirecte est gérée par la lumière ambiante, nous passons sous silence les techniques d'illumination globale. En clair : nous allons nous limiter au cas où la lumière incidente vient directement d'une source de lumière, pas d'un rebond. Intuitivement, la lumière incidente est simplement égale à l'intensité de la source de lumière. Sauf que ce n'est qu'une approximation, et une assez mauvaise. En réalité, l'approximation est bonne si la lumière arrive proche de la verticale, mais elle est d'autant plus mauvaise que la lumière arrive penchée, voire rasante. La raison : la lumière incidente sera étalée sur une surface plus grande, si elle arrive penchée. Si vous vous souvenez de vos cours de collège, c'est le même principe qui explique les saisons. La lumière du soleil est proche de la verticale en été, mais est de plus en plus penché quand on s'avance vers l'Hiver. La lumière solaire est donc étalée sur une surface plus grande, ce qui fait qu'un point de la surface recevra moins de lumière, celle-ci étant diluée, étalée. [[File:Radiación solar.png|centre|vignette|upright=2|Exemple avec la lumière solaire.]] [[File:Angle of incidence.svg|vignette|upright=1|Angle d'incidence.]] En clair, tout dépend de l''''angle d'incidence''' de la lumière. Reste à voir comment calculer cet angle. La lumière incidente est définie par un vecteur, qui part de la source de lumière et atterrit sur le sommet considéré. Imaginez simplement que ce vecteur suit un rayon lumineux provenant de la source de lumière. Le vecteur pour la lumière incidente sera noté L. L'angle d'incidence est l'angle que fait ce vecteur avec la verticale de la surface, au niveau du sommet considéré. [[File:Graphics lightmodel ptsource.png|vignette|Normale de la surface.]] Pour cela, les calculs d'éclairage ont besoin de connaitre la verticale d'un sommet. Un sommet est donc associé à un vecteur, appelé la '''normale''', qui indique la verticale en ce point. Deux sommets différents peuvent avoir deux normales différentes, même s'ils sont proches. Elles sont d'autant plus différentes que la surface est rugueuse, non-lisse. La normale est prédéterminée lors de la création du modèle 3D, il n'y a pas besoin de le calculer. Par contre, elle est modifiée lors de l'étape de transformation, quand on place le modèle 3D dans la scène 3D. Les deux autres vecteurs sont à calculer à chaque image, car ils changent quand on bouge le sommet. La lumière qui arrive sur la surface dépend de l'angle entre la normale et le vecteur L. Précisément, elle dépend du cosinus de cet angle. En multipliant ce cosinus avec l'intensité de la lumière, on a la lumière arrivante. La couleur finale d'un pixel est donc : : <math>\text{Couleur finale} = I \times \cos{(N, L)} \times BRDF(...)</math> Le terme <math>I \times \cos{N, L}</math> ne dépend pas de la surface considérée. Juste de la position de la source de lumière, de la position du sommet et de son orientation par rapport à la lumière. Aussi, il est parfois appelé le '''terme géométrique''', en opposition aux propriétés de la surface. Les propriétés de la surface sont définies par un '''''material''''', qui indique comment il réfléchit la lumière, ainsi que sa texture. ===Le produit scalaire de deux vecteurs=== Calculer le terme géométrique demande de calculer le cosinus d'un angle. Et il n'est pas le seul : les autres calculs d'éclairage que nous allons voir demandent de calculer des cosinus. Or, les calculs trigonométriques sont très gourmands pour le GPU. Pour éviter le calcul d'un cosinus, les GPU utilisent une opération mathématique appelée le ''produit scalaire''. Le produit scalaire agit sur deux vecteurs, que l'on notera A et B. Un produit scalaire prend : la longueur des deux vecteurs, et l'angle entre les deux vecteurs noté <math>\omega</math>. Le produit scalaire est équivalent à la formule suivante : : <math>\text{Produit scalaire de deux vecteurs A et B} = \vec{A} \cdot \vec{B} = A \times B \times \cos{(\omega)}</math>, avec A et B la longueur des deux vecteurs A et B. L'avantage est que le produit scalaire se calcule simplement avec des additions, soustractions et multiplications, des opérations que les cartes graphiques savent faire très facilement. Le produit scalaire de deux vecteurs de coordonnées x,y,z est le suivant : : <math>\vec{A} \cdot \vec{B} = x_A \times x_B + y_A \times y_B + z_A \times z_B</math> En clair, on multiplie les coordonnées identiques, et on additionne les résultats. Rien de compliqué. Un avantage est que tous les vecteurs vus précédemment sont normalisés, à savoir qu'ils ont une longueur qui vaut 1. Ainsi, le calcul du produit scalaire devient équivalent au calcul du produit scalaire. ===La réflexion de la lumière sur la surface=== [[File:Ray Diagram 2.svg|vignette|Reflection de la lumière sur une surface parfaitement lisse.]] Maintenant que nous venons de voir le terme géométrique, voyons le BRDF, qui définit comment la surface de l'objet 3D réfléchit la lumière. Vos cours de collège vous ont sans doute appris que la lumière est réfléchie avec le même angle d'arrivée. L'angle d'incidence et l'angle de réflexion sont égaux, comme illustré ci-contre. On parle alors de '''réflexion parfaite'''. Mais cela ne vaut que pour une surface parfaitement lisse, comme un miroir parfait. Dans la réalité, une surface a tendance à renvoyer des rayons dans toutes les directions. La raison est qu'une surface réelle est rugueuse, avec de petites aspérités et des micro-reliefs, qui renvoient la lumière dans des directions "aléatoires". La lumière « rebondit » sur la surface de l'objet et une partie s'éparpille dans un peu toutes les directions. On parle alors de '''réflexion diffuse'''. {| |- |[[File:Dioptre reflexion diffuse speculaire refraction.svg|vignette|upright=1.4|Différence entre réflexion diffuse et spéculaire.]] |[[File:Diffuse reflection.svg|vignette|upright=1|Réflexion diffuse.]] |} Maintenant, imaginons que la surface n'ait qu'une réflexion diffuse, pas d'autres formes de réflexion. Et imaginons aussi que cette réflexion diffuse soit parfaite, à savoir que la lumière réfléchie soit renvoyée à l'identique dans toutes les directions, sans aucune direction privilégiée. On a alors le ''material'' le plus simple qui soit, appelé un '''''diffuse material'''''. Vu que la lumière est réfléchie à l'identique dans toutes les directions, elle sera identique peu importe où on place la caméra. La lumière finale ne dépend donc que des propriété de la surface, que de sa couleur. En clair, il suffit de donner une '''couleur diffuse''' à chaque sommet. La couleur diffuse est simplement multipliée par le terme géométrique, pour obtenir la lumière réfléchie finale. Rien de plus, rien de moins. Cela donne l'équation suivante, avec les termes suivants : * L est le vecteur pour la lumière incidente ; * N est la normale du sommet ; * I est l'intensité de la source de lumière ; * <math>C_d</math> est la couleur diffuse. : <math>\text{Illumination diffuse} = C_d \times \left[ I \times (\vec{N} \cdot \vec{L}) \right]</math> Rajoutons maintenant l'effet de la lumière ambiante à un ''material'' de ce genre. Pour rappel, la lumière ambiante vient de toutes les directions à part égale, ce qui fait que son angle d'incidence n'a donc pas d'effet. L'intensité de la lumière ambiante est déterminée lors de la création de la scène 3D, c'est une constante qui n'a pas à être calculée. Pour obtenir l'effet de la lumière ambiante sur un objet, il suffit de multiplier sa couleur diffuse par l'intensité de la lumière ambiante. Cependant, de nombreux moteurs de jeux ajoutent une '''couleur ambiante''', différente de la couleur diffuse. : <math>\text{Illumination ambiante} = C_a \times I_a</math> avec <math>C_a</math> la couleur ambiante du point de surface et <math>I_a</math> l'intensité de la lumière ambiante. En plus de la réflexion diffuse parfaite, de nombreux matériaux ajoutent une '''réflexion spéculaire''', qui n'est pas exactement la réflexion parfaite, en est très proche. Les rayons réfléchis sont très proches de la direction de réflexion parfaite, et s'atténuent très vite en s'en éloignant. Le résultat ressemble à une sorte de petit "point blanc", très lumineux, orienté vers la source de lumière, appelé le '''''specular highlight'''''. La réflexion diffuse est prédominante pour les matériaux rugueux, alors que la réflexion spéculaire est dominante sur les matériaux métalliques ou très lisses. [[File:Phong components version 4.png|centre|vignette|upright=3.0|Couleurs utilisées dans l'algorithme de Phong.]] [[File:Phong Vectors.svg|vignette|Vecteurs utilisés dans l'algorithme de Phong (et dans le calcul de l'éclairage, de manière générale).]] Pour calculer la réflexion spéculaire, il faut d'abord connaitre le vecteur pour la réflexion parfaite, que nous noterons R dans ce qui suit. Le vecteur R peut se calculer avec la formule ci-dessous : : <math>\vec{R} = 2 (\vec{L} \cdot \vec{N}) \times \vec{N} - \vec{L} </math> La réflexion spéculaire dépend de l'angle entre la direction du regard et la normale : plus celui-ci est proche de l'angle de réflexion parfaite, plus la réflexion spéculaire sera intense. Le vecteur pour la direction du regard sera noté V, pour vue ou vision. La réflexion spéculaire est une fonction qui dépend de l'angle entre les vecteurs R et V. Le calcul de la réflexion spéculaire utilise une '''couleur spéculaire''', qui est l'équivalent de la couleur diffuse pour la réflexion spéculaire. : <math>\text{BRDF spéculaire} = C_s \times f(\vec{R} \cdot \vec{V}) </math> La fonction varie grandement d'un modèle de calcul spéculaire à l'autre. Aussi, je ne rentre pas dans le détail. L'essentiel est que vous compreniez que le calcul de l'éclairage utilise de nombreux calculs géométriques, réalisés avec des produits scalaires. Les calculs géométriques utilisent la couleur d'un sommet, la normale du sommet, et le vecteur de la lumière incidente. Les autres informations sont calculées à l'exécution. ===Les algorithmes d'éclairage basiques : par triangle, par sommet et par pixel=== Dans tout ce qui a été dit précédemment, l'éclairage est calculé pour chaque sommet. Il attribue une illumination/couleur à chaque sommet de la scène 3D, ce qui fait qu'on parle d''''éclairage par sommet''', ou ''vertex lighting''. Il est assez rudimentaire et donne un éclairage très brut, mais il peut être réalisé avant l'étape de rastérisation. Mais une fois qu'on a obtenu la couleur des sommets, reste à colorier les triangles. Et pour cela, il y a deux manières de faire, qui sont appelées l'éclairage plat et l'éclairage de Gouraud. [[File:D3D Shading Triangles.png|vignette|Dans ce dessin, le triangle a un sommet de couleur bleu foncé, un autre de couleur rouge et un autre de couleur bleu clair. L’interpolation plate et de Gouraud donnent des résultats bien différents.]] L''''éclairage plat''' calcule l'éclairage triangle par triangle. Il y a plusieurs manières de faire pour ça, mais la plus simple colorie un triangle avec la couleur moyenne des trois sommets. Une autre possibilité fait les calculs d'éclairage triangle par triangle, en utilisant une normale par triangle et non par sommet, idem pour les couleurs ambiante/spéculaire/diffuse. Mais c'est plus rare car cela demande de placer la normale quelque part dans le triangle, ce qui rajoute des informations. L''''éclairage de Gouraud''' effectue lui aussi une moyenne de la couleur de chaque sommet, sauf que celle-ci est pondérée par la distance du sommet avec le pixel. Plus le pixel est loin d'un sommet, plus son coefficient est petit. Typiquement, le coefficient varie entre 0 et 1 : de 1 si le pixel est sur le sommet, à 0 si le pixel est sur un des sommets adjacents. La moyenne effectuée est généralement une interpolation bilinéaire, mais n'importe quel algorithme d'interpolation peut marcher, qu'il soit simplement linéaire, bilinéaire, cubique, hyperbolique. L'étape d'interpolation est prise en charge par l'étape de rastérisation, qui effectue cette moyenne automatiquement. L'éclairage par sommet a eu son heure de gloire, mais il est maintenant remplacé par l''''éclairage par pixel''' (''per-pixel lighting''), qui calcule l'éclairage pixel par pixel. En clair, l’éclairage est finalisé après l'étape de rastérisation, il ne se fait pas qu'au niveau de la géométrie. Il existe plusieurs types d'éclairage par pixel, mais on peut les classer en deux grands types : l'éclairage de Phong et le ''bump/normal mapping''. L''''éclairage de Phong''' calcule l'éclairage pixel par pixel. Avec cet algorithme, la géométrie n'est pas éclairée : les couleurs des sommets ne sont pas calculées. A la place, les normales sont envoyées à l'étape de rastérisation, qui effectue une opération d'interpolation, qui renvoie une normale pour chaque pixel. Les calculs d'éclairage utilisent alors ces normales pour faire les calculs d'éclairage pour chaque pixel. La technique du '''''normal mapping''''' est assez simple à expliquer, sans compter que plusieurs cartes graphiques l'ont implémentée directement dans leurs circuits. Là où l'éclairage de Phong interpole les normales pour chaque pixel, le ''normal-mapping'' précalcule les normales d'une surface dans une texture, appelée la ''normal-map''. Lors des calculs d'éclairage, la carte graphique lit les normales adéquates directement depuis cette texture, puis fait les calculs d'éclairage avec. [[File:WallSimpleAndNormalMapping.png|centre|vignette|upright=2|Différence sans et avec ''normal-mapping''.]] Avec cette technique, l'éclairage n'est pas géré par pixel, mais par texel, ce qui fait qu'il a une qualité de rendu un peu inférieure à un vrai éclairage de Phong, mais bien supérieure à un éclairage par sommet. Par contre, les techniques de ''normal mapping'' permettent d'ajouter du relief et des détails sur des surfaces planes en jouant sur l'éclairage. Elles permettent ainsi de simplifier grandement la géométrie rendue, tout en utilisant l'éclairage pour compenser. [[File:Bump mapping.png|centre|vignette|upright=2|Bump mapping]] L'éclairage par pixel a une qualité d'éclairage supérieure aux techniques d'éclairage par sommet, mais il est aussi plus gourmand. L'éclairage par pixel est utilisé dans presque tous les jeux vidéo depuis DOOM 3, en raison de sa meilleure qualité, mais cela n'aurait pas été possible si le matériel n'avait pas évolué de manière à incorporer des algorithmes d'éclairage matériel assez puissants, avant de basculer sur un éclairage programmable. La différence entre l'éclairage par pixel et par sommet se voit assez facilement à l'écran. L'éclairage plat donne un éclairage assez carré, avec des frontières assez nettes. L'éclairage de Gouraud donne des ombres plus lisses, dans une certaine mesure, mais pèche à rendre correctement les reflets spéculaires. L'éclairage de Phong est de meilleure qualité, surtout pour les reflets spéculaires. es trois algorithmes peuvent être implémentés soit dans la carte graphique, soit en logiciel. Nous verrons comment les cartes graphiques peuvent implémenter ces algorithmes, dans les deux prochains chapitres. {| |- |[[File:Per face lighting.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting.png|vignette|upright=1|Phong Shading]] |- |[[File:Per face lighting example.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting example.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting example.png|vignette|upright=1|Phong Shading]] |} ===Les ''shaders'' : des programmes exécutés sur le GPU=== Maintenant que nous venons de voir les algorithmes d'éclairages, il est temps de voir comment les réaliser sur une carte graphique. Nous venons de voir qu'il y a une différence entre l'éclairage par pixel et par sommet. Intuitivement, l'éclairage par sommet devrait se faire avec les calculs géométriques, alors que l'éclairage par pixel devrait se faire après avoir appliqué les textures. Les toutes premières cartes graphiques ne géraient ni l'éclairage par sommet, ni l'éclairage par pixel. Elles laissaient les calculs géométriques au CPU. Par la suite, la Geforce 256 a intégré '''circuit de ''Transform & Lightning''''', qui s'occupait de tous les calculs géométriques, éclairage par sommet inclus (d'où le L de T&L). Elle gérait alors l'éclairage par sommet, mais un algorithme particulier, qui n'était pas très flexible. Il ne gérait que des ''material'' bien précis (des ''Phong materials''), rien de plus. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Unité de T&L : géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} L'amélioration suivante est venue sur la Geforce 3 : l'unité de T&L est devenue programmable. Au vu le grand nombre d'algorithmes d'éclairages possibles et le grand nombre de ''materials'' possibles, c'était la seule voie possibles. Les programmeurs pouvaient programmer leurs propres algorithmes d'éclairage par sommet, même s'ils devaient aussi programmer les étapes de transformation et de projection. Mais nous détaillerons cela dans un chapitre dédié sur l'historique des GPUs. Ce qui est important est que la Geforce 3 a introduit une fonctionnalité absolument cruciale pour le rendu 3D moderne : les '''''shaders'''''. Il s'agit de programmes informatiques exécutés par la carte graphique, qui servaient initialement à coder des algorithmes d'éclairage. D'où leur nom : ''shader'' pour ''shading'' (éclairage en anglais). Cependant, l'usage modernes des shaders dépasse le cadre des algorithmes d'éclairage. L'avantage est que cela simplifie grandement l'implémentation des algorithmes d'éclairage. Pas besoin de les intégrer dans la carte graphique pour les utiliser, pas besoin d'un circuit distinct pour chaque algorithme. Sans shaders, si la carte graphique ne gère pas un algorithme d'éclairage, on ne peut pas l'utiliser. A la rigueur, il est parfois possible de l'émuler avec des contournements logiciels, mais au prix de performances souvent désastreuses. Avec des shaders, il est possible de programmer l'algorithme d'éclairage de notre choix, pour l'exécuter sur la carte graphique, avec des performances plus que convenables. [[File:Implémentation de l'éclairage sur les cartes graphiques.png|vignette|Implémentation de l'éclairage sur les cartes graphiques]] Il existe plusieurs types de shaders, mais les deux principaux sont les '''''vertex shaders''''' et les '''''pixel shaders'''''. Les pixels shaders s'occupent de l'éclairage par pixel, leur nom est assez parlent. Les vertex shaders s'occupent de l'éclairage par sommet, mais aussi des étapes de transformation/projection. Je parle bien des trois étapes de transformation vues plus haut, qui effectuent des calculs de transformation de coordonnées avec des matrices. La raison à cela est que les calculs de transformation ressemblent beaucoup aux calculs d'éclairage par sommet. Ils impliquent tous deux des calculs vectoriels, comme des produits scalaires et des produits vectoriels, qui agissent sur des sommets/triangles. Si la carte graphique incorpore un processeur de shader capable de faire de tels calculs, alors il peut servir pour les deux. Pour implémenter les shaders, il a fallu ajouter des processeurs à la carte graphique. Les processeurs en question exécutent les shaders, ils peuvent lire ou écrire dans des textures, mais ne font rien d'autres. Les ''vertex shaders'' font tout ce qui a trait à la géométrie, ils remplacent l'unité de T&L. Les pixels shaders sont entre la rastérisation et les ROPs, ils sont très liés à l'unité de texture. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | rowspan="2" class="f_rouge" | ''Vertex shader'' | rowspan="2" | Rastérisation | Placage de textures | rowspan="2" |''Raster Operations Pipeline'' |- | class="f_rouge" | ''Pixel shader'' |} {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage des anciens PC | prevText=Les cartes d'affichage des anciens PC | next=Avant les GPUs : les cartes accélératrices 3D | nextText=Avant les GPUs : les cartes accélératrices 3D }}{{autocat}} 0pjiy8v76dolmenoxfi4use3ieyzxqv 764879 764869 2026-04-24T17:55:26Z Mewtow 31375 /* Les shaders : des programmes exécutés sur le GPU */ 764879 wikitext text/x-wiki Le premier jeu à utiliser de la "vraie 3D" texturée fut le jeu Quake, premier du nom. Et depuis sa sortie, la grande majorité des jeux vidéo utilisent de la 3D, même s'il existe encore quelques jeux en 2D. Face à la prolifération des jeux vidéo en 3D, les fabricants de cartes graphiques ont inventé les cartes accélératrices 3D, des cartes vidéo capables d'accélérer le rendu en 3D. Dans ce chapitre, nous allons voir comment elles fonctionnent et comment elles ont évolué dans le temps. Pour comprendre comment celles-ci fonctionnent, il faut faire quelques rapides rappels sur les bases du rendu 3D. ==Les bases du rendu 3D== Une '''scène 3D''' est composée d'un espace en trois dimensions, dans laquelle le moteur d’un jeu vidéo place des objets et les fait bouger. Cette scène est, en première approche, un simple parallélogramme. Un des coins de ce parallélogramme sert d’origine à un système de coordonnées : il est à la position (0, 0, 0), et les axes partent de ce point en suivant les arêtes. Les objets seront placés à des coordonnées bien précises dans ce parallélogramme. ===Les objets 3D et leur géométrie=== <noinclude>[[File:Dolphin triangle mesh.png|vignette|Illustration d'un dauphin, représenté avec des triangles.]]</noinclude> Dans la quasi-totalité des jeux vidéo actuels, les objets et la scène 3D sont modélisés par un assemblage de triangles collés les uns aux autres, ce qui porte le nom de '''maillage''', (''mesh'' en anglais). Il a été tenté dans le passé d'utiliser des quadrilatères (rendu dit en ''quad'') ou d'autres polygones, mais les contraintes techniques ont fait que ces solutions n'ont pas été retenues. [[File:CG WIKI.jpg|centre|vignette|upright=2|Exemple de modèle 3D.]] Les modèles 3D sont définis par leurs sommets, aussi appelés '''vertices''' dans le domaine du rendu 3D. Chaque sommet possède trois coordonnées, qui indiquent sa position dans la scène 3D : abscisse, ordonnée, profondeur. Les sommets sont regroupés en triangles, qui sont formés en combinant trois sommets entre eux. Les anciennes cartes graphiques géraient aussi d'autres formes géométriques, comme des points, des lignes, ou des quadrilatères. Les quadrilatères étaient appelés des ''quads'', et ce terme reviendra occasionnellement dans ce cours. De telles formes basiques, gérées nativement, sont appelées des '''primitives'''. La représentation exacte d'un objet est donc une liste plus ou moins structurée de sommets. La liste doit préciser les coordonnées de chaque sommet, ainsi que comment les relier pour former des triangles. Pour cela, l'objet est représenté par une structure qui contient la liste des sommets, mais aussi de quoi savoir quels sont les sommets reliés entre eux par un segment. Nous en dirons plus dans le chapitre sur le rendu de la géométrie. ===La caméra : le point de vue depuis l'écran=== Outre les objets proprement dit, on trouve une '''caméra''', qui représente les yeux du joueur. Cette caméra est définie au minimum par : * une position ; * par la direction du regard (un vecteur). A la caméra, il faut ajouter tout ce qui permet de déterminer le '''champ de vision'''. Le champ de vision contient tout ce qui est visible à l'écran. Et sa forme dépend de la perspective utilisée. Dans le cas le plus courant dans les jeux vidéos en 3D, il correspond à une '''pyramide de vision''' dont la pointe est la caméra, et dont les faces sont délimitées par les bords de l'écran. A l'intérieur de la pyramide, il y a un rectangle qui représente l'écran du joueur, appelé le '''''viewport'''''. <noinclude>[[File:ViewFrustum.jpg|centre|vignette|upright=2|Caméra.]]</noinclude> [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] La majorité des jeux vidéos ajoutent deux plans : * un ''near plane'' en-deça duquel les objets ne sont pas affichés. Il élimine du champ de vision les objets trop proches. * Un ''far plane'', un '''plan limite''' au-delà duquel on ne voit plus les objets. Il élimine les objets trop lointains. Avec ces deux plans, le champ de vision de la caméra est donc un volume en forme de pyramide tronquée, appelé le '''''view frustum'''''. Le tout est parfois appelée, bien que par abus de langage, la pyramide de vision. Avec d'autres perspectives moins utilisées, le ''view frustum'' est un pavé, mais nous n'en parlerons pas plus dans le cadre de ce cours car elles ne sont presque pas utilisés dans les jeux vidéos actuels. ===Les textures=== Tout objet à rendre en 3D est donc composé d'un assemblage de triangles, et ceux-ci sont éclairés et coloriés par divers algorithmes. Pour rajouter de la couleur, les objets sont recouverts par des '''textures''', des images qui servent de papier peint à un objet. Un objet géométrique est donc recouvert par une ou plusieurs textures qui permettent de le colorier ou de lui appliquer du relief. [[File:Texture+Mapping.jpg|centre|vignette|upright=2|Texture Mapping]] Notons que les textures sont des images comme les autres, codées pixel par pixel. Pour faire la différence entre les pixels de l'écran et les pixels d'une texture, on appelle ces derniers des '''texels'''. Ce terme est assez important, aussi profitez-en pour le mémoriser, nous le réutiliserons dans quelques chapitres. Un autre point lié au fait que les textures sont des images est leur compression, leur format. N'allez pas croire que les textures sont stockées dans un fichier .jpg, .png ou tout autre format de ce genre. Les textures utilisent des formats spécialisés, comme le DXTC1, le S3TC ou d'autres, plus adaptés à leur rôle de texture. Mais qu'il s'agisse d'images normales (.jpg, .png ou autres) ou de textures, toutes sont compressées. Les textures sont compressées pour prendre moins de mémoire. Songez que la compression de texture est terriblement efficace, souvent capable de diviser par 6 la mémoire occupée par une texture. S'en est au point où les textures restent compressées sur le disque dur, mais aussi dans la mémoire vidéo ! Nous en reparlerons dans le chapitre sur la mémoire d'une carte graphique. Plaquer une texture sur un objet peut se faire de deux manières, qui portent les noms de placage de texture inverse et direct. Le placage de texture direct a été utilisé au tout début de la 3D, sur des bornes d'arcade et les consoles de jeu 3DO, PS1, Sega Saturn. De nos jours, on utilise uniquement la technique de placage de texture inverse. Les deux seront décrites dans le détail plus bas. ===La différence entre rastérisation et lancer de rayons=== [[File:Render Types.png|vignette|Même géométrie, plusieurs rendus différents.]] Les techniques de rendu 3D sont nombreuses, mais on peut les classer en deux grands types : le ''lancer de rayons'' et la ''rasterization''. Sans décrire les deux techniques, sachez cependant que le lancer de rayon n'est pas beaucoup utilisé pour les jeux vidéo. Il est surtout utilisé dans la production de films d'animation, d'effets spéciaux, ou d'autres rendu spéciaux. Dans les jeux vidéos, il est surtout utilisé pour quelques effets graphiques, la rasterization restant le mode de rendu principal. La raison principale est que le lancer de rayons demande beaucoup de puissance de calcul. Une autre raison est que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Il a existé des cartes accélératrices permettant d'accélérer le rendu en lancer de rayons, mais elles sont restées confidentielles. Les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, mais ils restent d'un usage marginal et servent de compléments au rendu par rastérization. Un chapitre entier sera dédié aux cartes accélératrices de lancer de rayons et nous verrons pourquoi le lancer de rayons est difficile à implémenter avec des performances convenables, ce qui explique que les jeux vidéo utilisent la ''rasterization''. La rastérisation est structurée autour de trois étapes principales : * Une étape purement logicielle, effectuée par le processeur, où le moteur physique calcule la géométrie de la scène 3D. * Une étape de '''traitement de la géométrie''', qui gère tout ce qui a trait aux sommets et triangles. * Une étape de '''rastérisation''' qui détermine sur quels pixels de l'écran est affiché le triangle. * Une étape de '''traitement des pixels''', qui colorie les pixels et gère les textures. [[File:Graphics pipeline 2 en.svg|centre|vignette|upright=2.5|Pipeline graphique basique.]] Il existe plusieurs rendus différents et la rastérisation ne se fait pas de la même manière selon le rendu utilisé. Il existe des rendus sans textures, d'autres avec, d'autres avec éclairage, d'autres sans, etc. Par contre, l'étape de calcul de la géométrie est la même quel que soit le rendu ! Mieux : le calcul de la géométrie se fait de la même manière entre rastérisation et lancer de rayons, il est le même quelle que soit la technique de rendu 3D utilisée. Les trois étapes précédentes sont réalisées dans des circuits ou processeurs séparés, comme on le verra plus tard. Et cela permet d'utiliser la technique dite du '''pipeline'''. Concrètement, supposons que la carte graphique traite les données par paquets de triangles (en réalité, c'est des paquets de sommets, mais passons). L'étape de traitement de la géométrie peut travailler sur un paquet de triangle, pendant que le paquet précédent est dans l'étape de rastérisation, et que le paquet encore précédent est en train de traiter ses pixels. Cela permet de traiter trois paquets de triangles en même temps, mais à des états d'avancements différents. Mieux que cela : le traitement de la géométrie est lui-même composé d'une succession de sous-étapes, la rasterisation est elle-même découpée en plusieurs sous-étapes, et ainsi de suite. Le nombre d'étapes pour une carte graphique moderne dépasse la dizaine. La rastérisation calcule un rendu 3D avec une suite d'étapes consécutives qui doivent s'enchainer dans un ordre bien précis. L'ensemble de ces étapes est appelé le '''pipeline graphique''', qui sera détaillé dans ce qui suit. ==Le calcul de la géométrie== Le calcul de la géométrie regroupe plusieurs manipulations différentes. La principale demande juste de placer les modèles 3D dans la scène, de placer les objets dans le monde. Puis, il faut centrer la scène 3D sur la caméra. Les deux changements ont pour point commun de demander des changements de repères. Par changement de repères, on veut dire que l'on passe d'un système de coordonnées à un autre. En tout, il existe trois changements de repères distincts qui sont regroupés dans l''''étape de transformation''' : un premier qui place chaque objet 3D dans la scène 3D, un autre qui centre la scène du point de vue de la caméra, et un autre qui corrige la perspective. ===Les trois étapes de transformation=== La première étape place les objets 3D dans la scène 3D. Un modèle 3D est représentée par un ensemble de sommets, qui sont reliés pour former sa surface. Les données du modèle 3D indiquent, pour chaque sommet, sa position par rapport au centre de l'objet qui a les coordonnées (0, 0, 0). La première étape place l'objet 3D à une position dans la scène 3D, déterminée par le moteur physique, qui a des coordonnées (X, Y, Z). Une fois placé dans la scène 3D, le centre de l'objet passe donc des coordonnées (0, 0, 0) aux coordonnées (X, Y, Z) et tous les sommets de l'objet doivent être mis à jour. De plus, l'objet a une certaine orientation : il faut aussi le faire tourner. Enfin, l'objet peut aussi subir une mise à l'échelle : on peut le gonfler ou le faire rapetisser, du moment que cela ne modifie pas sa forme, mais simplement sa taille. En clair, le modèle 3D subit une translation, une rotation et une mise à l'échelle, les trois impliquant une modification des coordonnées des sommets.. [[File:Similarity and congruence transformations.svg|centre|vignette|upright=1.5|Transformations géométriques possibles pour chaque triangle.]] Une fois le placement des différents objets effectué, la carte graphique effectue un changement de coordonnées pour centrer le monde sur la caméra. Au lieu de considérer un des bords de la scène 3D comme étant le point de coordonnées (0, 0, 0), il va passer dans le référentiel de la caméra. Après cette transformation, le point de coordonnées (0, 0, 0) sera la caméra. La direction de la vue du joueur sera alignée avec l'axe de la profondeur (l'axe Z). [[File:View transform.svg|centre|vignette|upright=2|Étape de transformation dans un environnement en deux dimensions : avant et après. On voit que l'on centre le monde sur la position de la caméra et dans sa direction.]] Enfin, il faut aussi corriger la perspective, ce qui est le fait de l'étape de projection, qui modifie la forme du ''view frustum'' sans en modifier le contenu. Différents types de perspective existent et celles-ci ont un impact différent les unes des autres sur le ''view frustum''. Dans le cas qui nous intéresse, le ''view frustum'' passe d’une forme de trapèze tridimensionnel à une forme de pavé dont l'écran est une des faces. ===Les changements de coordonnées se font via des multiplications de matrices=== Les trois étapes précédentes demande de faire des changements de coordonnées, chaque sommet voyant ses coordonnées remplacées par de nouvelles. Or, un changement de coordonnée s'effectue assez simplement, avec des matrices, à savoir des tableaux organisés en lignes et en colonnes avec un nombre dans chaque case. Un changement de coordonnées se fait simplement en multipliant le vecteur (X, Y, Z) des coordonnées d'un sommet par une matrice adéquate. Il existe des matrices pour la translation, la mise à l'échelle, d'autres pour la rotation, une autre pour la transformation de la caméra, une autre pour l'étape de projection, etc. Un changement de coordonnée s'effectue assez simplement en multipliant le vecteur-coordonnées (X, Y, Z) d'un sommet par une matrice adéquate. Un petit problème est que les matrices qui le permettent sont des matrices avec 4 lignes et 4 colonnes. Or, la multiplication demande que le nombre de coordonnées du vecteur soit égal au nombre de colonnes. Pour résoudre ce petit problème, on ajoute une 4éme coordonnée aux sommets, la coordonnée homogène, qui ne sert à rien, et est souvent mise à 1, par défaut. Mais oublions ce détail. Il se trouve que multiplier des matrices amène certaines simplifications. Au lieu de faire plusieurs multiplications de matrices, il est possible de fusionner les matrices en une seule, ce qui permet de simplifier les calculs. Ce qui fait que le placement des objets, changement de repère pour centrer la caméra, et d'autres traitements forts différents sont regroupés ensemble. Le traitement de la géométrie implique, sans surprise, des calculs de géométrie dans l'espace. Et cela implique des opérations mathématiques aux noms barbares : produits scalaires, produits vectoriels, et autres calculs impliquant des vecteurs et/ou des matrices. Et les calculs vectoriels/matriciels impliquent beaucoup d'additions, de soustractions, de multiplications, de division, mais aussi des opérations plus complexes : calculs trigonométriques, racines carrées, inverse d'une racine carrée, etc. Au final, un simple processeur peut faire ce genre de calculs, si on lui fournit le programme adéquat, l'implémentation est assez aisée. Mais on peut aussi implémenter le tout avec un circuit spécialisé, non-programmable. Les deux solutions sont possibles, tant que le circuit dispose d'assez de puissance de calcul. Les cartes graphiques anciennes contenaient un ou plusieurs circuits de multiplication de matrices spécialisés dans l'étape de transformation. Chacun de ces circuits prend un sommet et renvoie le sommet transformé. Ils sont composés d'un gros paquet de multiplieurs et d'additionneurs flottants. Pour plus d'efficacité, les cartes graphiques comportent plusieurs de ces circuits, afin de pouvoir traiter plusieurs sommets en même temps. ==L'élimination des surfaces cachées== Un point important du rendu 3D est que ce que certaines portions de la scène 3D ne sont pas visibles depuis la caméra. Et idéalement, les portions de la scène 3D qui ne sont pas visibles à l'écran ne doivent pas être calculées. A quoi bon calculer des choses qui ne seront pas affichées ? Ce serait gâcher de la puissance de calcul. Et pour cela, de nombreuses optimisations visent à éliminer les calculs inutiles. Elles sont regroupées sous les termes de '''''clipping''''' ou de '''''culling'''''. La différence entre ''culling'' et ''clipping'' n'est pas fixée et la terminologie n'est pas claire. Dans ce qui va suivre, nous n'utiliserons que le terme ''culling''. Les cartes graphiques modernes embarquent diverses méthodes de ''culling'' pour abandonner les calculs quand elles s’aperçoivent que ceux-ci portent sur une partie non-affichée de l'image. Cela fait des économies de puissance de calcul assez appréciables et un gain en performance assez important. Précisons que le ''culling'' peut être plus ou moins précoce suivant le type de rendu 3D utilisé, mais nous verrons cela dans la suite du chapitre. ===Les différentes formes de ''culling''/''clipping''=== La première forme de ''culling'' est le '''''view frustum culling''''', dont le nom indique qu'il s'agit de l'élimination de tout ce qui est situé en-dehors du ''view frustum''. Ce qui est en-dehors du champ de vision de la caméra n'est pas affiché à l'écran n'est pas calculé ou rendu, dans une certaine mesure. Le ''view frustum culling'' est assez trivial : il suffit d'éliminer ce qui n'est pas dans le ''view frustum'' avec quelques calculs de coordonnées assez simples. Quelques subtilités surviennent quand un triangle est partiellement dans le ''view frustrum'', ce qui arrive parfois si le triangle est sur un bord de l'écran. Mais rien d'insurmontable. [[File:View frustum culling.svg|centre|vignette|upright=1|''View frustum culling'' : les parties potentiellement visibles sont en vert, celles invisibles en rouge et celles partiellement visibles en bleu.]] Les autres formes de ''culling'' visent à éliminer ce qui est dans le ''view frustum'', mais qui n'est pas visible depuis la caméra. Pensez à des objets cachés par un autre objet plus proche, par exemple. Ou encore, pensez aux faces à l'arrière d'un objet opaque qui sont cachées par l'avant. Ces deux cas correspondent à deux types de ''culling''. L'élimination des objets masqués par d'autres est appelé l'''occlusion culling''. L'élimination des parties arrières d'un objet est appelé le ''back-face culling''. Dans les deux cas, nous parlerons d''''élimination des surfaces cachées'''. [[File:Occlusion culling example PL.svg|centre|vignette|''Occlusion culling'' : les objets en bleu sont visibles, ceux en rouge sont masqués par les objets en bleu.]] Le lancer de rayons n'a pas besoin d'éliminer les surfaces cachées, il ne calcule que les surfaces visibles. Par contre, la rastérisation demande d'éliminer les surfaces cachées. Sans cela, le rendu est incorrect dans le pire des cas, ou alors le rendu calcule des surfaces invisibles pour rien. Il existe de nombreux algorithmes logiciels pour implémenter l'élimination des surfaces cachées, mais la carte graphique peut aussi s'en charger. L'''occlusion culling'' demande de connaitre la distance à la caméra de chaque triangle. La distance à la caméra est appelée la '''profondeur''' du triangle. Elle est déterminée à l'étape de rastérisation et est calculée à chaque sommet. Lors de la rastérisation, chaque sommet se voit attribuer trois coordonnées : deux coordonnées x et y qui indiquent sa position à l'écran, et une coordonnée de profondeur notée z. ===L'algorithme du peintre=== Pour éliminer les surfaces cachées, la solution la plus simple consiste simplement à rendre les triangles du plus lointain au plus proche. L'idée est que si deux triangles se recouvrent totalement ou partiellement, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Il ne s'agit ni plus ni moins que de l''''algorithme du peintre'''. [[File:Polygons cross.svg|vignette|Polygons cross]] <noinclude>[[File:Painters problem.svg|vignette|Painters problem]]</noinclude> Un problème est que la solution ne marche pas avec certaines configurations particulières, dans le cas où des polygones un peu complexes se chevauchent plusieurs fois. Il se présente rarement dans un rendu 3D normal, mais c'est quand même un cas qu'il faut gérer. Le problème est suffisant pour que cette solution ne soit plus utilisée dans le rendu 3D normal. Un autre problème est que l'algorithme demande de trier les triangles d'une scène 3D selon leur profondeur, du plus profond au moins profond. Et les cartes graphiques n'aiment pas ça, que ce soit les anciennes cartes graphiques comme les modernes. Il s'agit généralement d'une tâche qui est réalisée par le processeur, le CPU, qui est plus efficace que le GPU pour trier des trucs. Aussi, l'algorithme du peintre était utilisé sur d'anciennes cartes graphiques, qui ne géraient pas la géométrie mais seulement les textures et quelques effets de post-processing. Avec ces GPU, les jeux vidéo calculaient la géométrie et la triait sur le CPU, puis effectuaient le reste de la rastérisation sur le GPU. Les anciens jeux en 2.5D comme DOOM ou les DOOM-like, utilisaient une amélioration de l'algorithme du peintre. L'amélioration variait suivant le moteur de jeu utilisé, et donnait soit une technique dite de ''portal rendering'', soit un système de ''Binary Space Partionning'', assez complexes et difficiles à expliquer. Mais il ne s'agissait pas de jeux en 3D, les maps de ces jeux avaient des contraintes qui rendaient cette technique utilisable. Ils n'avaient pas de polygones qui se chevauchent, notamment. ===Le tampon de profondeur=== [[File:Z-buffer no text.jpg|vignette|Z-buffer correspondant à un rendu]] Une autre solution utilise ce qu'on appelle un '''tampon de profondeur''', aussi appelé un ''z-buffer''. Il s'agit d'un tableau, stocké en mémoire vidéo, qui mémorise la coordonnée z de l'objet le plus proche pour chaque pixel. Par défaut, ce tampon de profondeur est initialisé avec la valeur de profondeur maximale, celle du ''far plane'' du ''viewfrustum''. Au fur et à mesure que les objets seront calculés, le tampon de profondeur est mis à jour, conservant ainsi la trace de l'objet le plus proche de la caméra. Si jamais un triangle a une coordonnée z plus grande que celle du tampon de profondeur, cela veut dire qu'il est situé derrière un objet déjà rendu. Il est éliminé (sauf si transparence il y a) et le tampon de profondeur n'a pas à être mis à jour. Dans le cas contraire, l'objet est plus près de la caméra et sa coordonnée z remplace l'ancienne valeur z dans le tampon de profondeur. [[File:Z-buffer.svg|centre|vignette|upright=2.0|Illustration du processus de mise à jour du Z-buffer.]] Il existe des techniques alternatives pour coder la coordonnée de profondeur, qui se distinguent par le fait que la coordonnée z n'est pas proportionnelle à la distance entre le fragment et la caméra. Mais il s'agit là de détails assez mathématiques que je me permets de passer sous silence. Dans la suite de ce cours, nous allons juste parler de profondeur pour regrouper toutes ces techniques, conventionnelles ou alternatives. Toutes les cartes graphiques modernes utilisent un système de ''z-buffer''. C'est la seule solution pour avoir des performances dignes de ce nom. Il faut cependant noter qu'elles utilisent des tampons de profondeur légèrement modifiés, qui ne mémorisent pas la coordonnée de profondeur, mais une valeur dérivée. Pour simplifier, ils ne mémorisent pas la coordonnée de profondeur z, mais son inverse 1/z. Les raisons à cela ne peuvent pas encore être expliquées à ce moment du cours, aussi nous allons simplement dire que c'est une histoire de correction de perspective. Les coordonnées z et 1/z sont codées sur quelques bits, allant de 16 bits pour les anciennes cartes graphiques, à 24/32 bits pour les cartes plus récentes. De nos jours, les Z-buffer de 16 bits sont abandonnés et toutes les cartes graphiques utilisent des coordonnées z de 24 à 32 bits. La raison est que les Z-buffer de 16 bits ont une précision insuffisante, ce qui fait que des artefacts peuvent survenir. Si deux objets sont suffisamment proches, le tampon de profondeur n'a pas la précision suffisante pour discriminer les deux objets. Pour lui, les deux objets sont à la même place. Conséquence : il faut bien choisir un des deux objets et ce choix se fait pixel par pixel, ce qui fait des artefacts visuels apparaissent. On parle alors de '''''z-fighting'''''. Voici ce que cela donne : [[File:Z-fighting.png|centre|vignette|Z-fighting]] Un défaut du tampon de profondeur est qu'il ne gère pas correctement les objets transparents. Dès que de la transparence est présente dans une scène 3D, le tampon de profondeur ne peut pas être utilisé. Une solution pour cela est de rendre une scène 3D en deux phases : une pour les objets opaques, une avec les objets transparents. La où on rend les objets opaques utilise le tampon de profondeur, mais il est désactivé lors de la seconde. ==La rastérisation et les textures== Dans cette section, nous allons voir ensemble l'étape de rastérisation et l'étape de traitement des pixels. La rastérisation est difficile à expliquer, surtout que son rôle exact dépend de la technique de rendu utilisée. Pour simplifier, elle projette un rendu en 3D sur un écran en 2D. Une autre explication tout aussi vague est qu'elle s'occupe la traduction des triangles en un affichage pixelisé à l'écran. Elle détermine à quoi ressemble la scène visible sur l'écran. C'est par exemple lors de cette étape que sont appliquées certaines techniques de ''culling'', qui éliminent les portions non-visibles de l'image, ainsi qu'une correction de la perspective et diverses opérations d'interpolation dont nous parlerons dans plusieurs chapitres. La rastérisation et placage de textures sont deux opérations très liées entre elles. Il existe deux manières principales pour lier les textures à la géométrie : la méthode directe et la méthode inverse (''UV Mapping''). Et les deux font que la rastérisation se fait de manière très différente. Précisons cependant que les rendus les plus simples n'utilisent pas de textures du tout. Ils se contentent de colorier les triangles, voire d'un simple rendu en fil de fer basé sur du tracé de lignes. Dans la suite de cette section, nous allons voir les quatre types de rendu principaux : le rendu en fils de fer, le rendu colorié, et deux rendus utilisant des textures. ===Le rendu en fil de fer=== [[File:Obj lineremoval.png|vignette|Rendu en fil de fer d'un objet 3D.]] Le '''rendu 3D en fils de fer''' est illustré ci-contre. Il s'agit d'un rendu assez ancien, utilisé au tout début de la 3D, sur des machines qu'on aurait du mal à appeler ordinateurs. Il se contente de tracer des lignes à l'écran, lignes qui connectent deux sommets, qui ne sont autres que les arêtes de la géométrie de la scène rendue. Le tout était suffisant pour réaliser quelques jeux vidéos rudimentaires. Les tout premiers jeux vidéos utilisaient ce rendu, l'un d'entre eux étant Maze War, le tout premier FPS. {| |[[File:Maze war.jpg|vignette|Maze war]] |[[File:Maze representation using wireframes 2022-01-10.gif|centre|vignette|Maze representation using wireframes 2022-01-10]] |} Le monde est calculé en 3D, il y a toujours un calcul de la géométrie, la scène est rastérisée normalement, les portions invisbles de l'image sont retirées, mais il n'y a pas d'application de textures après rastérisation. A la place, un algorithme de tracé de ligne trace les lignes à l'écran. Quand un triangle passe l'étape de rastérisation, l'étape de rastérisation fournit la position des trois sommets sur l'écran. En clair, elle fournit les coordonnées de trois pixels, un par sommet. A la suite, un algorithme de tracé de ligne trace trois lignes, une par paire de sommet. L'implémentation demande juste d'avoir une unité de calcul géométrique, une unité de rastérisation, et un VDC qui supporte le tracé de lignes. Elle est donc assez simple et ne demande pas de circuits de gestion des textures ni de ROP. Le VDC écrit directement dans le ''framebuffer'' les lignes à tracer. Il a existé des proto-cartes graphiques spécialisées dans ce genre de rendu, comme le '''''Line Drawing System-1''''' de l'entreprise Eans & Sutherland. Nous détaillerons son fonctionnement dans quelques chapitres. ===Le rendu à primitives colorées=== [[File:MiniFighter.png|vignette|upright=1|Exemple de rendu pouvant être obtenu avec des sommets colorés.]] Une amélioration du rendu précédent utilise des triangles/''quads'' coloriés. Chaque triangle ou ''quad'' est associé à une couleur, et cette couleur est dessinée sur le triangle/''quad''après la rastérisation. Le rendu est une amélioration du rendu en fils de fer. L'idée est que chaque triangle/''quad'' est associé à une couleur, qui est dessinée sur le triangle/''quad'' après la rastérisation. La technique est nommée ''colored vertices'' en anglais, nous parlerons de '''rendu à maillage coloré'''. [[File:Malla irregular de triángulos modelizando una superficie convexa.png|centre|vignette|upright=2|Maillage coloré.]] La couleur est propagée lors des calculs géométriques et de la rastérisation, sans subir de modifications. Une fois un rendu en fils de fer effectué, la couleur du triangle est récupérée. Le triangle/''quad'' rendu correspond à un triangle/''quad'' à l'écran. Et l'intérieur de ce triangle/''quad'' est colorié avec la couleur transmise. Pour cela, on utilise encore une fois une fonction du VDC : celle du remplissage de figure géométrique. Nous l’avions vu en parlant des VDC à accélération 2D, mais elle est souvent prise en charge par les ''blitters''. Ils peuvent remplir une figure géométrique avec une couleur unique, on réutilise cette fonction pour colorier le triangle/''quad''. L'étape de rastérisation fournit les coordonnées des sommets de la figure géométrique, le ''blitter'' les utilise pour colorier la figure géométrique. Niveau matériel, quelques bornes d'arcade ont utilisé ce rendu. La toute première borne d'arcade utilisant le rendu à maillage coloré est celle du jeu I Robot, d'Atari, sorti en 1983. Par la suite, dès 1988, les cartes d'arcades Namco System 21 et les bornes d'arcades Sega Model 1 utilisaient ce genre de rendu. On peut s'en rendre compte en regardant les graphismes des jeux tournant sur ces bornes d'arcade. Des jeux comme Virtua Racing, Virtua Fighter ou Virtua Formula sont assez parlants à ce niveau. Leurs graphismes sont assez anguleux et on voit qu'ils sont basés sur des triangles uniformément colorés. Pour ceux qui veulent en savoir plus sur la toute première borne d'arcade en rendu à maillage colorée, la borne ''I Robot'' d'Atari, voici une vidéo youtube à ce sujet : * [https://www.youtube.com/watch?v=6miEkPENsT0 I Robot d'Atari, le pionnier de la 3D Flat.] ===Le placage de textures direct=== Les deux rendus précédents sont très simples, mais n'utilisent pas de textures. Et il est temps de voir les deux rendus qui utilisent des textures. Il y en a deux types, appelés rendu avec placage de texture direct et indirect, nous allons voir le '''rendu par placage de texture direct''' en premier. Et nous l'appellerons ''rendu direct'' dans ce qui suit, pour simplifier les explications. L'idée est assez simple et peut utiliser aussi bien des triangles que des ''quads'', mais nous allons partir du principe qu'elle utilise des '''''quads''''', à savoir que les objets 3D sont composés de quadrilatères. Lorsqu'un ''quad'' est rastérisé, sa forme à l'écran est un rectangle déformé par la perspective. On obtient un rectangle si le ''quad'' est vu de face, un trapèze si on le voit de biais. Et le ''sprite'' doit être déformé de la même manière que le ''quad''. L'idée est que tout quad est associé à une texture, à un sprite. La figure géométrique qui correspond à un ''quad'' à l'écran est remplie non pas par une couleur uniforme, mais par un ''sprite'' rectangulaire. Il suffit techniquement de recopier le ''sprite'' à l'écran, c'est à dire dans la figure géométrique, au bon endroit dans le ''framebuffer''. Le rendu direct est en effet un intermédiaire entre rendu 2D à base de ''sprite'' et rendu 3D moderne. La géométrie est rendue en 3D pour générer des ''quads'', mais ces ''quads'' ne servent à guider la copie des sprites/textures dans le ''framebuffer''. [[File:TextureMapping.png|centre|vignette|upright=2|Exemple caricatural de placage de texture sur un ''quad''.]] La subtilité est que le sprite est déformé de manière à rentrer dans un quadrilatère, qui n'est pas forcément un rectangle à l'écran, mais est déformé par la perspective et son orientation en 3D. Le sprite doit être déformé de deux manières : il doit être agrandi/réduit en fonction de la taille de la figure affichée à l'écran, tourné en fonction de l'orientation du ''quad'', déformé pour gérer la perspective. Pour cela, il faut connaitre les coordonnées de profondeur de chaque bord d'un ''quad'', et de faire quelques calculs. N'importe quel VDC incluant un ''blitter'' avec une gestion du zoom/rotation des sprites peut le faire. : Si on veut avoir de beaux graphismes, il vaut mieux appliquer un filtre pour lisser le sprite envoyé dans le trapèze, filtre qui se résume à une opération d'interpolation et n'est pas très différent du filtrage de texture qui lisse les textures à l'écran. Un autre point est que les ''quads'' doivent être rendus du plus lointain au plus proche. Sans cela, on obtient rapidement des erreurs de rendu. L'idée est que si deux quads se chevauchent, on doit dessiner celui qui est derrière, puis celui qui est devant. Le dessin du second va recouvrir le premier. L'écriture du sprite du second quad écrasera les données du premier quad, pour les portions recouvertes, lors de l'écriture du sprite dans le ''framebuffer''. Quelque chose qui devrait vous rappeler le rendu 2D, où les sprites sont rendus du plus lointain au plus proche. Le rendu inverse utilise très souvent des triangles pour la géométrie, alors que le rendu direct a tendance à utiliser des ''quads'', mais il ne s'agit pas d'une différence stricte. L'usage de triangles/''quads'' peut se faire aussi bien avec un rendu direct comme avec un rendu inverse. Cependant, le rendu en ''quad'' se marie très bien au rendu direct, alors que le rendu en triangle colle mieux au rendu inverse. L'avantage de cette technique est qu'on parcourt les textures dans un ordre bien précis. Par exemple, on peut parcourir la texture ligne par ligne, l'exploiter par blocs de 4*4 pixels, etc. Et accéder à une texture de manière prédictible se marie bien avec l'usage de mémoires caches, ce qui est un avantage en matière de performances. Mais un même pixel du ''framebuffer'' est écrit plusieurs fois quand plusieurs quads se superposent, alors que le rendu inverse gère la situation avec une seule écriture (sauf si usage de la transparence). De plus, la gestion de la transparence était compliquée et les jeux devaient ruser en utilisation des solutions logicielles assez complexes. Niveau implémentation matérielle, une carte graphique en rendu direct demande juste trois circuits. Le premier est un circuit de calcul géométrique, qui rend la scène 3D. Le tri des quads est souvent réalisé par le processeur principal, et non pas par un circuit séparé. Toutes les étapes au-delà de l'étape de rastérisation étaient prises en charge par un VDC amélioré, qui écrivait des sprites/textures directement dans le ''framebuffer''. {|class="wikitable" |- ! Géométrie | Processeurs dédiés programmé pour émuler le pipeline graphique |- ! Tri des quads du plus lointain au plus proche | Processeur principal (implémentation logicielle) |- ! Application des textures | ''Blitter'' amélioré, capable de faire tourner et de zoomer sur des ''sprites''. |} L'implémentation était très simple et réutilisait des composants déjà existants : des VDC 2D pour l'application des textures, des processeurs dédiés pour la géométrie. Les unités de calcul de la géométrie étaient généralement implémentées avec un ou plusieurs processeurs dédiés. Vu qu'on savait déjà effectuer le rendu géométrique en logiciel, pas besoin de créer un circuit sur mesure. Il suffisait de dédier un processeur spécialisé rien que pour les calculs géométriques et on lui faisait exécuter un code déjà bien connu à la base. En clair, ils utilisaient un code spécifique pour émuler un circuit fixe. C'était clairement la solution la plus adaptée pour l'époque. Les unités géométriques étaient des processeurs RISC, normalement utilisés dans l'embarqué ou sur des serveurs. Elles utilisaient parfois des DSP. Pour rappel, les DSP des processeurs de traitement de signal assez communs, pas spécialement dédiés aux rendu 3D, mais spécialisé dans le traitement de signal audio, vidéo et autre. Ils avaient un jeu d'instruction assez proche de celui des cartes graphiques actuelles, et supportaient de nombreuses instructions utiles pour le rendu 3D. [[File:Sega ST-V Dynamite Deka PCB 20100324.jpg|vignette|Sega ST-V Dynamite Deka PCB 20100324]] Le rendu direct a été utilisé dans la période de transition entre rendu 2D et rendu 3D, car il était très adapté pour faire cette transition. Coupler un VDC à un processeur pour la géométrie était particulièrement simple à l'époque. Le rendu direct a été utilisé sur des bornes d'arcade dès les années 90. Outre les bornes d'arcade, quelques consoles de 5ème génération utilisaient le rendu direct, avec les mêmes solutions matérielles. La géométrie était calculée sur plusieurs processeurs dédiés. Le reste du pipeline était géré par un VDC 2D qui implémentait le placage de textures. Deux consoles étaient dans ce cas : la 3DO, et la Sega Saturn. Le rendu direct est aujourd'hui abandonné. ===Le placage de textures inverse=== Le rendu précédent, le rendu direct, permet d'appliquer des textures directement dans le ''framebuffer''. Mais comme dit plus haut, il existe une seconde technique pour plaquer des textures, appelé le '''placage de texture inverse''', aussi appelé l'''UV Mapping''. Elle associe une texture complète pour un modèle 3D,contrairement au placage de tecture direct qui associe une texture par ''quad''/triangle. L'idée est que l'on attribue un texel à chaque sommet. Plus précisémment, chaque sommet est associé à des '''coordonnées de texture''', qui précisent quelle texture appliquer, mais aussi où se situe le texel à appliquer dans la texture. Par exemple, la coordonnée de texture peut dire : je veux le pixel qui est à ligne 5, colonne 27 dans cette texture. La correspondance entre texture et géométrie est réalisée lorsque les créateurs de jeu vidéo conçoivent le modèle de l'objet. [[File:Texture Mapping example.png|centre|vignette|upright=2|Exemple de placage de texture.]] Dans les faits, on n'utilise pas de coordonnées entières de ce type, mais deux nombres flottants compris entre 0 et 1. La coordonnée 0,0 correspond au texel en bas à gauche, celui de coordonnée 1,1 est tout en haut à droite. L'avantage est que ces coordonnées sont indépendantes de la résolution de la texture, ce qui aura des avantages pour certaines techniques de rendu, comme le ''mip-mapping''. Les deux coordonnées de texture sont notées u,v avec DirectX, ou encore s,t dans le cas général : u est la coordonnée horizontale, v la verticale. [[File:UVMapping.png|centre|vignette|upright=2|UV Mapping]] Avec le placage de texture inverse, la rastérisation se fait grosso-modo en trois étapes : la rastérisation proprement dite, le placage de textures, et les opérations finales qui écrivent un pixel dans le ''framebuffer''. Au niveau du matériel, ainsi que dans la plupart des API 3D, les trois étapes sont réalisées par des circuits séparés. [[File:01 3D-Rasterung-a.svg|vignette|Illustration du principe de la rasterization. La surface correspondant à l'écran est subdivisée en pixels carrés, de coordonnées x et y. La caméra est placée au point e. Pour chaque pixel, on trace une droite qui part de la caméra et qui passe par le pixel considéré. L'intersection entre une surface et cette droite se fait en un point, appartenant à un triangle.]] Lors de la rasterisation, chaque triangle se voit attribuer un ou plusieurs pixels à l'écran. Pour bien comprendre, imaginez une ligne droite qui part de caméra et qui passe par un pixel sur le plan de l'écran. Cette ligne intersecte 0, 1 ou plusieurs objets dans la scène 3D. Les triangles situés ces intersections entre cette ligne et les objets rencontrés seront associés au pixel correspondant. L'étape de rastérisation prend en entrée un triangle et renvoie la coordonnée x,y du pixel associé. Il s'agit là d'une simplification, car un triangle tend à occuper plusieurs pixels sur l'écran. L'étape de rastérisation fournit la liste de tous les pixels occupés par un triangle, et les traite un par un. Quand un triangle est rastérisé, le rasteriseur détermine la coordonnée x,y du premier pixel, applique une texture dessus, puis passe au suivant, et rebelote jusqu'à ce que tous les pixels occupés par le triangles aient été traités. L'implémentation matérielle du placage de texture inverse est beaucoup plus complexe que pour les autres techniques. Pour être franc, nous allons passer le reste du cours à parler de l'implémentation matérielle du placage de texture inverse, ce qui prendra plus d'une dizaine de chapitres. ==La transparence, les fragments et les ROPs== Dans ce qui suit, nous allons parler uniquement de la rastérisation avec placage de textures inverse. Les autres formes de rastérisation ne seront pas abordées. La raison est que tous les GPUs modernes utilisent cette forme de rastérisation, les exceptions étant rares. De même, ils utilisent un tampon de profondeur, pour l'élimination des surfaces cachées. La rastérisation effectue donc des calculs géométriques, suivis d'une étape de rastérisation, puis de placage des textures. Ces trois étapes sont réalisées par une unité géométrique, une unité de rastérisation, et un circuit de placage de textures. Du moins sur le principe, car les cartes graphiques modernes ont fortement optimisé l'implémentation et n'ont pas hésité à fusionner certains circuits. Mais nous verrons cela en temps voulu, nous n'allons pas résumer plusieurs décennies d'innovation technologique en quelques paragraphes. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures |} Mais où mettre le tampon de profondeur ? Intuitivement, on se dit qu'il vaut mieux faire l'élimination des surfaces cachées le plus tôt possible, dès que la coordonnée de profondeur est connue. Et elle est connu à l'étape de rastérisation, une fois les sommets transformés. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Tampon de profondeur | Placage de textures |} En réalité, la profondeur des fragments est gérée par un circuit appelé le '''''Raster Operations Pipeline''''' (ROP), situé à la toute fin du pipeline graphique. Dans ce qui suit, nous utiliserons l'abréviation ROP pour simplifier les explications. Le ROP effectue quelques traitements sur les fragments, avant d'enregistrer l'image finale dans la mémoire vidéo. Il est placé à la fin du pipeline pour gérer correctement la transparence. Et nous allons voir pourquoi la transparence est gérée à la fin du pipeline. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} ===Le mélange ''alpha''=== La transparence se manifeste quand plusieurs objets sont l'un derrière l'autre. Histoire de simplifier les explications, nous allons d'abord voir le cas où un objet semi-transparent est devant un objet opaque. La couleur perçue est alors un mélange de la couleur de l'objet opaque et celle de l'objet semi-transparent. Le mélange dépend d'à quel point l'objet semi-transparent est transparent. Avec un objet parfaitement transparent, seul l'objet opaque est visible. Avec un objet à moitié transparent, la couleur finale sera pour moitié celle de l'objet opaque, pour moitié celle de l'objet semi-transparent. Et c'est pareil pour les cas intermédiaires entre un objet totalement transparent et un objet totalement opaque. La transparence d'un objet/pixel est définie par un nombre, appelé la '''composante ''alpha'''''. Plus la composante alpha est élevée, plus le pixel est opaque. Elle vaut 0 pour un objet opaque et 1 pour un objet transparent. Elle est ajoutée aux composantes RGB, ce qui fait que tout fragment contient une "couleur de transparence" en plus des couleurs RGB. Elle agit comme un coefficient qui dit comment mélanger la couleur d'un objet transparent et d'un objet opaque. Le calcul de la transparence est une moyenne pondérée par la composante alpha. On parle alors d''''''alpha blending'''''. : <math>\text{Couleur finale} = \alpha \times \text{Couleur de l'objet transparent} + (1 - \alpha) \times \text{Couleur de l'objet opaque}</math> [[File:Texture splatting.png|centre|vignette|upright=2.0|Calcul de transparence. La première ligne montre le produit pour l'objet transparent, la seconde ligne est celle de l'objet opaque. La troisième ligne est celle de l'addition finale.]] Maintenant, qu'en est-il du cas où plusieurs objets sont superposés ? Si vous tracez une demi-droite dont l'origine est la caméra et qui passe par le pixel, il arrive qu'elle intersecte la géométrie en plusieurs points, un point par objet sur la ligne du regarde. Sans transparence, l'objet le plus proche cache tous les autres et c'est donc lui qui décide de la couleur du pixel. Mais avec un objet transparent, la couleur finale est un mélange de la couleur de plusieurs points d'intersection. Il faut donc calculer un pseudo-pixel pour chaque point d'intersection, auquel on donne le nom de '''fragment'''. Un fragment possède une position à l'écran, une coordonnée de profondeur, une couleur, ainsi que quelques autres informations potentiellement utiles. Les fragments attribués à un même pixel, qui sont à la même position sur l'écran, sont combinés pour obtenir la couleur finale de ce pixel. Il est possible d'utiliser le mélange ''alpha'' pour cela. Il suffit de faire le mélange ''alpha'' entre le fragment qui vient d'être calculé, et le pixel dans le ''framebuffer''. Pour cela, le fragment a une composante ''alpha'', qui est ajouté aux trois couleurs RGB. Le pixel déjà dans le ''framebuffer'' est un résultat temporaire, né du mélange ''alpha'' de tous les fragments précédents. Un défaut de cette méthode est qu'elle fonctionne assez mal avec un tampon de profondeur. Si le tampon de profondeur est activé, le mélange ''alpha'' ne fonctionne que si les objets sont rendus du plus lointain au plus proche. Et procéder dans cet ordre a un défaut : on dessine des objets dans le ''framebuffer'', pour qu'ensuite les objets devant écrasent ce qui a déjà été dessiné. Un même pixel peut donc être dessiné plusieurs fois, dont une seule sera pertinente. Et ces écritures utilisent de la bande passante mémoire, qui est une ressource précieuse sur un GPU moderne. Il s'agit d'un phénomène appelé '''''overdraw''''', ou sur-dessinage en français. Quelques optimisations permettent d'éliminer l'''overdraw'' en rendant les objets du plus proche au plus lointain, d'autres permettent de dessiner des objets dans un ordre arbitraire, mais nous ne pouvons pas en parler ici. Beaucoup de moteurs 3D rendent séparément les objets opaques et transparents. Une première passe rend les objets opaques, puis les objets transparents sont rendus dans une seconde passe. Les objets opaques sont rendus dans le désordre, ce qui fait qu'on n'a pas à les trier, alors que les objets transparents doivent être triés selon leur distance. un autre avantage est que le mélange ''alpha'' est désactivé lors de la première passe, alors que c'est la mise à jour du tampon de profondeur qui est désactivé lors de la seconde passe, ce qui augmente un peu les performances dans les deux cas. ===Le test ''alpha''=== Le test ''alpha'' est une technique qui permet d'annuler le rendu d'un fragment en fonction de sa transparence. Si la composante alpha est en-dessous ou au-dessus d'un seuil, le fragment est simplement abandonné. Le seuil en question est configurable, de même que la comparaison utilisée : on peut éliminer le fragment si sa transparence est au-dessus d'un certain seuil, en-dessous, égal, différent, etc. Il s'agit d'une optimisation qui est utile dans certains scénarios spécifiques. Par exemple, si l'objet a une transparence très élevée, du genre 95%, autant le compter comme complétement transparent, afin d'éviter des opérations de mélange ''alpha''. En effet, les opérations de mélange ''alpha'' sont très lentes, car elles demandent de faire des opérations de lecture-écriture en mémoire vidéo : on lit un pixel dans le ''framebuffer'', on applique le mélange ''alpha'' et on écrit le résultat en mémoire vidéo. L'''alpha test'' permet donc de gagner en performance au prix d'une baisse de la qualité d'image. Il y a cependant des cas où l'usage du test ''alpha'' est primordial, au-delà d'une question de performances. Un exemple classique est celui du rendu du feuillage dans un jeu 3D. Un feuillage est composé en assemblant plusieurs images de feuilles. Chaque feuille est un carré sur lequel on place une texture de feuille, qui est opaque pour la partie verte des feuilles, transparente pour le reste. Les carrés ne sont cependant pas superposés, mais s'intersectent fortement, ce qui fait que le mélange ''alpha'' ne donne pas de bons résultats. L'usage du test ''alpha'' permet d'obtenir un rendu correct. Pour d'informations via ce lien : * [https://bgolus.medium.com/anti-aliased-alpha-test-the-esoteric-alpha-to-coverage-8b177335ae4f Anti-aliased Alpha Test: The Esoteric Alpha To Coverage]. ===Les effets de brouillard=== Les '''effets de brouillard''' sont nécessaires dans certains jeux vidéo pour l'ambiance (pensez à des jeux d'horreur comme Silent Hill), mais ils ont surtout été utilisés pour économiser des calculs. L'idée est de ne pas calculer les graphismes au-delà d'une certaine distance, sans que cela se voie. Le ''view frustum'' utilise alors un plan limite, au-delà duquel on ne voit pas les objets. Mais ce plan limite donne une cassure inesthétique dans le rendu. Pour masquer cette cassure, les programmeurs ajoutaient un effet de brouillard. Les objets au-delà du plan limite étaient totalement dans le brouillard, puis ce brouillard se réduisait progressivement en se rapprochant de la caméra, avant de s'annuler à partir d'une certaine distance. Pour calculer le brouillard, on effectue un mélange ''alpha'' entre la couleur du pixel et une ''couleur de brouillard''. La différence est que l'on n'utilise pas la transparence pour faire le mélange, mais un '''coefficient de brouillard''', noté <math>\text{fog}(z)</math>. : <math>\text{Couleur finale} = \text{fog}(z) \times \text{Couleur de brouillard} + [ 1 - \text{fog}(z) ] \times \text{Couleur du pixel}</math> Le coefficient de brouillard dépend de la coordonnée de profondeur, de la distance du pixel par rapport à la caméra. Le brouillard démarre à une distance <math>z_{fog-start}</math>, et masque totalement les objets à partir d'une distance <math>z_{fog-end}</math>. Entre les deux, le coefficient de brouillard dépend de la distance. OpenGL autorise trois formules de calcul suivantes : : <math>\text{fog}(z) = \frac{z_{fog-end} - z}{z_{fog-end} - z_{fog-start}}</math> : <math>\text{fog}(z) = e^{- k \times z}</math> : <math>\text{fog}(z) = e^{- (k \times z)^2}</math> ==L'éclairage d'une scène 3D== L'éclairage d'une scène 3D calcule les ombres, mais aussi la luminosité de chaque pixel, ainsi que bien d'autres effets graphiques. Les algorithmes d'éclairage ont longtemps été implémentés directement en matériel, les cartes graphiques géraient l'éclairage dans des circuits spécialisés. Aussi, il est important de voir ces algorithmes d'éclairage. Il est possible d'implémenter l'éclairage à deux endroits différents du pipeline : juste avant la rastérisation, et après la rastérisation. ===Les sources de lumière et les couleurs associées=== L'éclairage d'une scène 3D provient de sources de lumières, comme des lampes, des torches, le soleil, etc. Il existe de nombreux types de sources de lumière, et nous n'allons parler que des principales. Elles sont au nombre de quatre et elles sont illustrées ci-dessous. [[File:3udUJ.gif|centre|vignette|upright=2|Types de sources de lumière.]] [[File:Graphics lightmodel directional.png|vignette|upright=1.0|Source de lumière directionnelle.]] Les '''sources directionnelles''' servent à modéliser des sources de lumière très éloignées, comme le soleil ou la lune. Elles sont simplement définies par un vecteur qui indique la direction de la lumière, rien de plus. Les '''sources ponctuelles''' sont des points, qui émettent de la lumière dans toutes les directions. Elles sont définies par une position, et une intensité lumineuse, éventuellement la couleur de la lumière émise. Il existe deyux types de sources de lumière ponctuelles. * Le premières émettent de manière égale dans toutes les directions. Elles sont appelées des ''point light'' dans le schéma du dessus. * Les secondes émettent de la lumière dans une '''direction privilégiée'''. L'exemple le plus parlant est celui d'une lampe-torche : elle émet de la lumière "tout droit", dans la direction où la lampe est orientée. Elles sont appelées des ''sport light'' dans le schéma du dessus. La direction privilégiée est un vecteur, notée v dans le schéma du dessous. [[File:Graphics lightmodel ambient.png|vignette|upright=1.0|Lumière ambiante.]] En théorie, la lumière rebondit sur les surfaces et a tendance à se disperser un peu partout à force de rebondir. C'est ce qui explique qu'on arrive à voir à l'intérieur d'une pièce si une fenêtre est ouverte. Il en résulte un certain '''éclairage ambiant''', qui est assez difficile à représenter dans un moteur de rendu 3D. Auparavant, l'éclairage ambiant était simulé par une lumière égale en tout point de la scène 3D, appelée simplement la '''lumière ambiante'''. Précisément, on suppose que la lumière ambiante en un point vient de toutes les directions et a une intensité constante, identique dans toutes les directions. Le tout est illustré ci-contre. C'est assez irréaliste, mais ça donne une bonne approximation de la lumière ambiante. ===La lumière incidente : le terme géométrique=== Pour simplifier, nous allons supposer que l'éclairage est calculé pour chaque sommet, pas par triangle. C'est de loin le cas le plus courant, aussi ce n'est pas une simplification abusive. La lumière qui arrive sur un sommet est appelée la '''lumière incidente'''. La couleur d'un sommet dépend de deux choses : la lumière incidente directe, comment il réfléchit cette lumière. Mathématiquement, il est possible de résumer cela avec le produit de deux termes : l'intensité de la lumière incidente, une fonction qui indique comment la surface réfléchit la lumière incidente. La fonction en question est appelée la '''réflectivité bidirectionnelle'''. Le terme anglais est ''bidirectional reflectance distribution function'', abrévié en BRDF, et nous utiliserons cette abréviation dans ce qui suit. : <math>\text{Couleur finale} = \text{Lumière incidente} \times BRDF(...)</math> La lumière incidente vient soit directement des sources de lumière, soit de la lumière qui a rebondit sur d'autres objets proches. La première est appelée la lumière directe, celle qui vient des rebonds s'appelle la lumière indirecte. Pour simplifier, la lumière indirecte est gérée par la lumière ambiante, nous passons sous silence les techniques d'illumination globale. En clair : nous allons nous limiter au cas où la lumière incidente vient directement d'une source de lumière, pas d'un rebond. Intuitivement, la lumière incidente est simplement égale à l'intensité de la source de lumière. Sauf que ce n'est qu'une approximation, et une assez mauvaise. En réalité, l'approximation est bonne si la lumière arrive proche de la verticale, mais elle est d'autant plus mauvaise que la lumière arrive penchée, voire rasante. La raison : la lumière incidente sera étalée sur une surface plus grande, si elle arrive penchée. Si vous vous souvenez de vos cours de collège, c'est le même principe qui explique les saisons. La lumière du soleil est proche de la verticale en été, mais est de plus en plus penché quand on s'avance vers l'Hiver. La lumière solaire est donc étalée sur une surface plus grande, ce qui fait qu'un point de la surface recevra moins de lumière, celle-ci étant diluée, étalée. [[File:Radiación solar.png|centre|vignette|upright=2|Exemple avec la lumière solaire.]] [[File:Angle of incidence.svg|vignette|upright=1|Angle d'incidence.]] En clair, tout dépend de l''''angle d'incidence''' de la lumière. Reste à voir comment calculer cet angle. La lumière incidente est définie par un vecteur, qui part de la source de lumière et atterrit sur le sommet considéré. Imaginez simplement que ce vecteur suit un rayon lumineux provenant de la source de lumière. Le vecteur pour la lumière incidente sera noté L. L'angle d'incidence est l'angle que fait ce vecteur avec la verticale de la surface, au niveau du sommet considéré. [[File:Graphics lightmodel ptsource.png|vignette|Normale de la surface.]] Pour cela, les calculs d'éclairage ont besoin de connaitre la verticale d'un sommet. Un sommet est donc associé à un vecteur, appelé la '''normale''', qui indique la verticale en ce point. Deux sommets différents peuvent avoir deux normales différentes, même s'ils sont proches. Elles sont d'autant plus différentes que la surface est rugueuse, non-lisse. La normale est prédéterminée lors de la création du modèle 3D, il n'y a pas besoin de le calculer. Par contre, elle est modifiée lors de l'étape de transformation, quand on place le modèle 3D dans la scène 3D. Les deux autres vecteurs sont à calculer à chaque image, car ils changent quand on bouge le sommet. La lumière qui arrive sur la surface dépend de l'angle entre la normale et le vecteur L. Précisément, elle dépend du cosinus de cet angle. En multipliant ce cosinus avec l'intensité de la lumière, on a la lumière arrivante. La couleur finale d'un pixel est donc : : <math>\text{Couleur finale} = I \times \cos{(N, L)} \times BRDF(...)</math> Le terme <math>I \times \cos{N, L}</math> ne dépend pas de la surface considérée. Juste de la position de la source de lumière, de la position du sommet et de son orientation par rapport à la lumière. Aussi, il est parfois appelé le '''terme géométrique''', en opposition aux propriétés de la surface. Les propriétés de la surface sont définies par un '''''material''''', qui indique comment il réfléchit la lumière, ainsi que sa texture. ===Le produit scalaire de deux vecteurs=== Calculer le terme géométrique demande de calculer le cosinus d'un angle. Et il n'est pas le seul : les autres calculs d'éclairage que nous allons voir demandent de calculer des cosinus. Or, les calculs trigonométriques sont très gourmands pour le GPU. Pour éviter le calcul d'un cosinus, les GPU utilisent une opération mathématique appelée le ''produit scalaire''. Le produit scalaire agit sur deux vecteurs, que l'on notera A et B. Un produit scalaire prend : la longueur des deux vecteurs, et l'angle entre les deux vecteurs noté <math>\omega</math>. Le produit scalaire est équivalent à la formule suivante : : <math>\text{Produit scalaire de deux vecteurs A et B} = \vec{A} \cdot \vec{B} = A \times B \times \cos{(\omega)}</math>, avec A et B la longueur des deux vecteurs A et B. L'avantage est que le produit scalaire se calcule simplement avec des additions, soustractions et multiplications, des opérations que les cartes graphiques savent faire très facilement. Le produit scalaire de deux vecteurs de coordonnées x,y,z est le suivant : : <math>\vec{A} \cdot \vec{B} = x_A \times x_B + y_A \times y_B + z_A \times z_B</math> En clair, on multiplie les coordonnées identiques, et on additionne les résultats. Rien de compliqué. Un avantage est que tous les vecteurs vus précédemment sont normalisés, à savoir qu'ils ont une longueur qui vaut 1. Ainsi, le calcul du produit scalaire devient équivalent au calcul du produit scalaire. ===La réflexion de la lumière sur la surface=== [[File:Ray Diagram 2.svg|vignette|Reflection de la lumière sur une surface parfaitement lisse.]] Maintenant que nous venons de voir le terme géométrique, voyons le BRDF, qui définit comment la surface de l'objet 3D réfléchit la lumière. Vos cours de collège vous ont sans doute appris que la lumière est réfléchie avec le même angle d'arrivée. L'angle d'incidence et l'angle de réflexion sont égaux, comme illustré ci-contre. On parle alors de '''réflexion parfaite'''. Mais cela ne vaut que pour une surface parfaitement lisse, comme un miroir parfait. Dans la réalité, une surface a tendance à renvoyer des rayons dans toutes les directions. La raison est qu'une surface réelle est rugueuse, avec de petites aspérités et des micro-reliefs, qui renvoient la lumière dans des directions "aléatoires". La lumière « rebondit » sur la surface de l'objet et une partie s'éparpille dans un peu toutes les directions. On parle alors de '''réflexion diffuse'''. {| |- |[[File:Dioptre reflexion diffuse speculaire refraction.svg|vignette|upright=1.4|Différence entre réflexion diffuse et spéculaire.]] |[[File:Diffuse reflection.svg|vignette|upright=1|Réflexion diffuse.]] |} Maintenant, imaginons que la surface n'ait qu'une réflexion diffuse, pas d'autres formes de réflexion. Et imaginons aussi que cette réflexion diffuse soit parfaite, à savoir que la lumière réfléchie soit renvoyée à l'identique dans toutes les directions, sans aucune direction privilégiée. On a alors le ''material'' le plus simple qui soit, appelé un '''''diffuse material'''''. Vu que la lumière est réfléchie à l'identique dans toutes les directions, elle sera identique peu importe où on place la caméra. La lumière finale ne dépend donc que des propriété de la surface, que de sa couleur. En clair, il suffit de donner une '''couleur diffuse''' à chaque sommet. La couleur diffuse est simplement multipliée par le terme géométrique, pour obtenir la lumière réfléchie finale. Rien de plus, rien de moins. Cela donne l'équation suivante, avec les termes suivants : * L est le vecteur pour la lumière incidente ; * N est la normale du sommet ; * I est l'intensité de la source de lumière ; * <math>C_d</math> est la couleur diffuse. : <math>\text{Illumination diffuse} = C_d \times \left[ I \times (\vec{N} \cdot \vec{L}) \right]</math> Rajoutons maintenant l'effet de la lumière ambiante à un ''material'' de ce genre. Pour rappel, la lumière ambiante vient de toutes les directions à part égale, ce qui fait que son angle d'incidence n'a donc pas d'effet. L'intensité de la lumière ambiante est déterminée lors de la création de la scène 3D, c'est une constante qui n'a pas à être calculée. Pour obtenir l'effet de la lumière ambiante sur un objet, il suffit de multiplier sa couleur diffuse par l'intensité de la lumière ambiante. Cependant, de nombreux moteurs de jeux ajoutent une '''couleur ambiante''', différente de la couleur diffuse. : <math>\text{Illumination ambiante} = C_a \times I_a</math> avec <math>C_a</math> la couleur ambiante du point de surface et <math>I_a</math> l'intensité de la lumière ambiante. En plus de la réflexion diffuse parfaite, de nombreux matériaux ajoutent une '''réflexion spéculaire''', qui n'est pas exactement la réflexion parfaite, en est très proche. Les rayons réfléchis sont très proches de la direction de réflexion parfaite, et s'atténuent très vite en s'en éloignant. Le résultat ressemble à une sorte de petit "point blanc", très lumineux, orienté vers la source de lumière, appelé le '''''specular highlight'''''. La réflexion diffuse est prédominante pour les matériaux rugueux, alors que la réflexion spéculaire est dominante sur les matériaux métalliques ou très lisses. [[File:Phong components version 4.png|centre|vignette|upright=3.0|Couleurs utilisées dans l'algorithme de Phong.]] [[File:Phong Vectors.svg|vignette|Vecteurs utilisés dans l'algorithme de Phong (et dans le calcul de l'éclairage, de manière générale).]] Pour calculer la réflexion spéculaire, il faut d'abord connaitre le vecteur pour la réflexion parfaite, que nous noterons R dans ce qui suit. Le vecteur R peut se calculer avec la formule ci-dessous : : <math>\vec{R} = 2 (\vec{L} \cdot \vec{N}) \times \vec{N} - \vec{L} </math> La réflexion spéculaire dépend de l'angle entre la direction du regard et la normale : plus celui-ci est proche de l'angle de réflexion parfaite, plus la réflexion spéculaire sera intense. Le vecteur pour la direction du regard sera noté V, pour vue ou vision. La réflexion spéculaire est une fonction qui dépend de l'angle entre les vecteurs R et V. Le calcul de la réflexion spéculaire utilise une '''couleur spéculaire''', qui est l'équivalent de la couleur diffuse pour la réflexion spéculaire. : <math>\text{BRDF spéculaire} = C_s \times f(\vec{R} \cdot \vec{V}) </math> La fonction varie grandement d'un modèle de calcul spéculaire à l'autre. Aussi, je ne rentre pas dans le détail. L'essentiel est que vous compreniez que le calcul de l'éclairage utilise de nombreux calculs géométriques, réalisés avec des produits scalaires. Les calculs géométriques utilisent la couleur d'un sommet, la normale du sommet, et le vecteur de la lumière incidente. Les autres informations sont calculées à l'exécution. ===Les algorithmes d'éclairage basiques : par triangle, par sommet et par pixel=== Dans tout ce qui a été dit précédemment, l'éclairage est calculé pour chaque sommet. Il attribue une illumination/couleur à chaque sommet de la scène 3D, ce qui fait qu'on parle d''''éclairage par sommet''', ou ''vertex lighting''. Il est assez rudimentaire et donne un éclairage très brut, mais il peut être réalisé avant l'étape de rastérisation. Mais une fois qu'on a obtenu la couleur des sommets, reste à colorier les triangles. Et pour cela, il y a deux manières de faire, qui sont appelées l'éclairage plat et l'éclairage de Gouraud. [[File:D3D Shading Triangles.png|vignette|Dans ce dessin, le triangle a un sommet de couleur bleu foncé, un autre de couleur rouge et un autre de couleur bleu clair. L’interpolation plate et de Gouraud donnent des résultats bien différents.]] L''''éclairage plat''' calcule l'éclairage triangle par triangle. Il y a plusieurs manières de faire pour ça, mais la plus simple colorie un triangle avec la couleur moyenne des trois sommets. Une autre possibilité fait les calculs d'éclairage triangle par triangle, en utilisant une normale par triangle et non par sommet, idem pour les couleurs ambiante/spéculaire/diffuse. Mais c'est plus rare car cela demande de placer la normale quelque part dans le triangle, ce qui rajoute des informations. L''''éclairage de Gouraud''' effectue lui aussi une moyenne de la couleur de chaque sommet, sauf que celle-ci est pondérée par la distance du sommet avec le pixel. Plus le pixel est loin d'un sommet, plus son coefficient est petit. Typiquement, le coefficient varie entre 0 et 1 : de 1 si le pixel est sur le sommet, à 0 si le pixel est sur un des sommets adjacents. La moyenne effectuée est généralement une interpolation bilinéaire, mais n'importe quel algorithme d'interpolation peut marcher, qu'il soit simplement linéaire, bilinéaire, cubique, hyperbolique. L'étape d'interpolation est prise en charge par l'étape de rastérisation, qui effectue cette moyenne automatiquement. L'éclairage par sommet a eu son heure de gloire, mais il est maintenant remplacé par l''''éclairage par pixel''' (''per-pixel lighting''), qui calcule l'éclairage pixel par pixel. En clair, l’éclairage est finalisé après l'étape de rastérisation, il ne se fait pas qu'au niveau de la géométrie. Il existe plusieurs types d'éclairage par pixel, mais on peut les classer en deux grands types : l'éclairage de Phong et le ''bump/normal mapping''. L''''éclairage de Phong''' calcule l'éclairage pixel par pixel. Avec cet algorithme, la géométrie n'est pas éclairée : les couleurs des sommets ne sont pas calculées. A la place, les normales sont envoyées à l'étape de rastérisation, qui effectue une opération d'interpolation, qui renvoie une normale pour chaque pixel. Les calculs d'éclairage utilisent alors ces normales pour faire les calculs d'éclairage pour chaque pixel. La technique du '''''normal mapping''''' est assez simple à expliquer, sans compter que plusieurs cartes graphiques l'ont implémentée directement dans leurs circuits. Là où l'éclairage de Phong interpole les normales pour chaque pixel, le ''normal-mapping'' précalcule les normales d'une surface dans une texture, appelée la ''normal-map''. Lors des calculs d'éclairage, la carte graphique lit les normales adéquates directement depuis cette texture, puis fait les calculs d'éclairage avec. [[File:WallSimpleAndNormalMapping.png|centre|vignette|upright=2|Différence sans et avec ''normal-mapping''.]] Avec cette technique, l'éclairage n'est pas géré par pixel, mais par texel, ce qui fait qu'il a une qualité de rendu un peu inférieure à un vrai éclairage de Phong, mais bien supérieure à un éclairage par sommet. Par contre, les techniques de ''normal mapping'' permettent d'ajouter du relief et des détails sur des surfaces planes en jouant sur l'éclairage. Elles permettent ainsi de simplifier grandement la géométrie rendue, tout en utilisant l'éclairage pour compenser. [[File:Bump mapping.png|centre|vignette|upright=2|Bump mapping]] L'éclairage par pixel a une qualité d'éclairage supérieure aux techniques d'éclairage par sommet, mais il est aussi plus gourmand. L'éclairage par pixel est utilisé dans presque tous les jeux vidéo depuis DOOM 3, en raison de sa meilleure qualité, mais cela n'aurait pas été possible si le matériel n'avait pas évolué de manière à incorporer des algorithmes d'éclairage matériel assez puissants, avant de basculer sur un éclairage programmable. La différence entre l'éclairage par pixel et par sommet se voit assez facilement à l'écran. L'éclairage plat donne un éclairage assez carré, avec des frontières assez nettes. L'éclairage de Gouraud donne des ombres plus lisses, dans une certaine mesure, mais pèche à rendre correctement les reflets spéculaires. L'éclairage de Phong est de meilleure qualité, surtout pour les reflets spéculaires. es trois algorithmes peuvent être implémentés soit dans la carte graphique, soit en logiciel. Nous verrons comment les cartes graphiques peuvent implémenter ces algorithmes, dans les deux prochains chapitres. {| |- |[[File:Per face lighting.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting.png|vignette|upright=1|Phong Shading]] |- |[[File:Per face lighting example.png|vignette|upright=1|Flat shading]] |[[File:Per vertex lighting example.png|vignette|upright=1|Gouraud Shading]] |[[File:Per fragment lighting example.png|vignette|upright=1|Phong Shading]] |} ===Les ''shaders'' : des programmes exécutés sur le GPU=== Maintenant que nous venons de voir les algorithmes d'éclairages, il est temps de voir comment les réaliser sur une carte graphique. Nous venons de voir qu'il y a une différence entre l'éclairage par pixel et par sommet. Intuitivement, l'éclairage par sommet devrait se faire avec les calculs géométriques, alors que l'éclairage par pixel devrait se faire après avoir appliqué les textures. Les toutes premières cartes graphiques ne géraient ni l'éclairage par sommet, ni l'éclairage par pixel. Elles laissaient les calculs géométriques au CPU. Par la suite, la Geforce 256 a intégré '''circuit de ''Transform & Lightning''''', qui s'occupait de tous les calculs géométriques, éclairage par sommet inclus (d'où le L de T&L). Elle gérait alors l'éclairage par sommet, mais un algorithme particulier, qui n'était pas très flexible. Il ne gérait que des ''material'' bien précis (des ''Phong materials''), rien de plus. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | Unité de T&L : géométrie | Rastérisation | Placage de textures | ''Raster Operations Pipeline'' |} L'amélioration suivante est venue sur la Geforce 3 : l'unité de T&L est devenue programmable. Au vu le grand nombre d'algorithmes d'éclairages possibles et le grand nombre de ''materials'' possibles, c'était la seule voie possibles. Les programmeurs pouvaient programmer leurs propres algorithmes d'éclairage par sommet, même s'ils devaient aussi programmer les étapes de transformation et de projection. Mais nous détaillerons cela dans un chapitre dédié sur l'historique des GPUs. Ce qui est important est que la Geforce 3 a introduit une fonctionnalité absolument cruciale pour le rendu 3D moderne : les '''''shaders'''''. Il s'agit de programmes informatiques exécutés par la carte graphique, qui servaient initialement à coder des algorithmes d'éclairage. D'où leur nom : ''shader'' pour ''shading'' (éclairage en anglais). Cependant, l'usage modernes des shaders dépasse le cadre des algorithmes d'éclairage. L'avantage est que cela simplifie grandement l'implémentation des algorithmes d'éclairage. Pas besoin de les intégrer dans la carte graphique pour les utiliser, pas besoin d'un circuit distinct pour chaque algorithme. Sans shaders, si la carte graphique ne gère pas un algorithme d'éclairage, on ne peut pas l'utiliser. A la rigueur, il est parfois possible de l'émuler avec des contournements logiciels, mais au prix de performances souvent désastreuses. Avec des shaders, il est possible de programmer l'algorithme d'éclairage de notre choix, pour l'exécuter sur la carte graphique, avec des performances plus que convenables. [[File:Implémentation de l'éclairage sur les cartes graphiques.png|vignette|Implémentation de l'éclairage sur les cartes graphiques]] Il existe plusieurs types de shaders, mais les deux principaux sont les '''''vertex shaders''''' et les '''''pixel shaders'''''. Les pixels shaders s'occupent de l'éclairage par pixel, leur nom est assez parlent. Les vertex shaders s'occupent de l'éclairage par sommet, mais aussi des étapes de transformation/projection. Je parle bien des trois étapes de transformation vues plus haut, qui effectuent des calculs de transformation de coordonnées avec des matrices. La raison à cela est que les calculs de transformation ressemblent beaucoup aux calculs d'éclairage par sommet. Ils impliquent tous deux des calculs vectoriels, comme des produits scalaires et des produits vectoriels, qui agissent sur des sommets/triangles. Si la carte graphique incorpore un processeur de shader capable de faire de tels calculs, alors il peut servir pour les deux. Pour implémenter les shaders, il a fallu ajouter des processeurs à la carte graphique. Les processeurs en question exécutent les shaders, ils peuvent lire ou écrire dans des textures, mais ne font rien d'autres. Les ''vertex shaders'' font tout ce qui a trait à la géométrie, ils remplacent l'unité de T&L. Les pixels shaders sont entre la rastérisation et les ROPs, ils sont très liés à l'unité de texture. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | rowspan="2" class="f_rouge" | ''Vertex shader'' | rowspan="2" | Rastérisation | Placage de textures | rowspan="2" |''Raster Operations Pipeline'' |- | class="f_rouge" | ''Pixel shader'' |} <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les cartes d'affichage des anciens PC | prevText=Les cartes d'affichage des anciens PC | next=Avant les GPUs : les cartes accélératrices 3D | nextText=Avant les GPUs : les cartes accélératrices 3D }}{{autocat}} </noinclude> p73mx1wiasjgtchxr53a4awxulpsr55 Les cartes graphiques/Le pipeline géométrique d'un GPU 0 79241 764874 763812 2026-04-24T17:51:43Z Mewtow 31375 /* Les mesh shaders */ 764874 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu qu'il y a une différence entre le pipeline géométrique des anciennes stations de travail et des ordinateurs personnels. Les premiers tendaient à utiliser des processeurs flottants, programmés avec un ''firmware/microcode'' non-modifiable. Les ordinateurs personnels ont eu commencé avec des circuits géométriques fixe, pour les rendre de plus en plus programmables. Dans ce chapitre, nous allons étudier les circuits géométriques d'un GPU d'ordinateur personnel, et voir comment ils ont évolués dans le temps. ==Le ''vertex pipeline''== Les premières cartes graphiques ne traitaient que des sommets, les primitives n'apparaissaient qu'à l'étape de rastérisation. Leur pipeline a progressivement évolué pour pouvoir exécuter des ''shaders'' sur des primitives, mais ce n'est apparu qu'avec DirectX 10. Avant, les unités géométriques ne géraient que des sommets. Nous allons voir de telles unités géométriques ici. Elles sont composées de trois circuits : l'''input assembly'', l'unité géométrique proprement dit, et l'assemblage des primitives. {|class="wikitable" |- ! colspan="4" | Cartes accélératrices PC, avant l'arrivée des ''shaders'' |- | rowspan="2" class="f_rouge" | ''Input assembly'' | ''Transform & Lighting'' | rowspan="2" class="f_rouge" | ''Primitive assembly'' |- | ''Vertex shader'' |} Pour comprendre à quoi servent l'''input assembler'' et l'assemblage de primitives, il faut parler de certaines optimisations présentes sur les cartes graphiques de l'époque. ===Les représentations des maillages : les optimisations=== Les optimisations visaient à réduire la mémoire prise pour les objets 3D. Pour rappel, les objets géométriques et la scène 3D sont mémorisés dans la mémoire vidéo, avec un assemblage de triangles collés les uns aux autres, l'ensemble formant un '''maillage'''. Pour mémoriser un maillage, il suffit d'utiliser une liste de triangles, chaque triangle étant définit par trois sommets consécutifs. Cependant, utiliser cette représentation gaspille beaucoup de mémoire ! [[File:Représentation naive d'un maillage 3D.png|centre|vignette|upright=2|Représentation naive d'un maillage 3D]] [[File:Cube colored.png|vignette|Cube en 3D]] Pour comprendre pourquoi, il faut savoir qu'un sommet est très souvent partagé par plusieurs triangles. Pour comprendre pourquoi, prenons l'exemple du cube de l'image ci-contre. Le sommet rouge du cube appartient aux 3 faces grise, jaune et bleue, et sera présent en trois exemplaires dans le tampon de sommets : un pour la face bleue, un pour la jaune, et un pour la grise. Et si vous croyez que l'exemple du cube n'est pas réaliste, voici un chiffre obtenu empiriquement, par analyse de maillages utilisés dans un JV : en moyenne, un sommet est dupliqué en 6 exemplaires. Pour éviter ce gâchis, les concepteurs d'API et de cartes graphiques ont inventé des représentations pour les maillages, qui visent éliminer cette redondance. Nous les appellerons des '''représentations compressées''', bien que ce terme soit un peu trompeur. Mais dans les faits, il s'agit bien d'une forme de compression de données, bien que très différente de celle utilisée pour compresser un fichier, de la vidéo, du texte ou de l'audio. La liste de triangle est en quelque sorte compressée lors de la création du maillage, puis décompressée par le matériel. Les représentations compressées n'utilisent pas une liste de triangles, mais une liste de sommets. La liste de sommets est mémorisée en mémoire vidéo, et s'appelle le '''tampon de sommets'''. Ainsi, un sommet présent dans plusieurs triangles n'est mémorisé qu'une seule fois, ou presque. Reste à reconstituer les triangles à partir de cette liste de sommets. Et c'est le travail de l'''input assembler'' et l'assemblage de primitive, justement. Mais avant de comprendre ce qu'ils font, nous devons voir les représentations compressées utilisées sur les cartes graphiques de l'époque. Les premières versions d'Open GL et Direct X implémentaient deux représentations compressées : les ''triangle fans'' et celle des ''triangle strips''. Elles ont été remplacées par la représentation indicée, apparue avec Direct X 7 et les versions équivalentes d'Open GL. Nous allons voir cette dernière en premier, car elle est plus simple. La '''représentation indicée''' stocke les triangles et les sommets séparément, avec une liste de triangle séparée de la liste de sommets. Dit comme cela, on ne voit pas vraiment où se trouve le gain en mémoire. Mais il y a une astuce, qui tient à ce qu'on met dans la liste de triangles. Les sommets sont numérotés, le numéro indiquant leur place dans la liste de sommets. Dans la liste de triangles, un triangle est mémorisé non pas par trois sommets consécutifs, mais par trois numéros de sommets. Le numéro est aussi appelé l'indice du sommet, et la liste de triangles est appelée le ''tampon d'indices''. : Le terme '"indice" devrait rappeler quelques chose à ceux qui savent ce qu'est un tableau en programmation. Le résultat est que les sommets ne sont pas dupliqués, mais on doit ajouter un tampon d'indice pour compenser. L'astuce est que l'économie en termes de sommets dépasse largement l'ajout du tampon d'indice. En effet, un indice prend moins de place qu'un sommet. Un sommet demande trois coordonnées, une couleur de sommet, des coordonnées de texture, une normale et bien d'autres attributs de sommets. En comparaison, un indice est un simple numéro, un nombre entier. En moyenne, un sommet prend 10 fois plus de place qu'un indice. Si on fait le compte, au lieu d'avoir N copies d'un sommet, on a juste une seule copie et N indices. L'économie liée à la taille des indices l'emporte. : On pourrait remplacer les indices par des pointeurs, ce qui donnerait un cas particulier d'une structure de données connue sous le nom de vecteur de Liffe. Mais ce n'est pas très pratique et n'est pas utilisé dans le domaine du rendu 3D. Un numéro entier est plus court qu'un pointeur complet. [[File:Représentation indicée d'un maillage 3D.png|centre|vignette|upright=2|Représentation indicée d'un maillage 3D]] Les premières versions d'Open GL et Direct X implémentaient deux représentations compressées : les ''triangle fans'' et celle des ''triangle strips''. Elles sont plus complexes, mais permettent une économie de mémoire encore plus importante. La technique des '''triangles fan''' était la moins utilisée des deux, mais elle est plus simple à expliquer, ce qui fait que je commence avec elle. Elle permet de dessiner des triangles qui partagent un sommet unique, ce qui donne une forme soit circulaire, soit en forme d'éventail. Les ''triangles fans'' sont utiles pour créer des figures comme des cercles, des halos de lumière, etc. Un triangle est définit par le sommet partagé, puis deux sommets. Le sommet partagé n'est présent qu'en un seul exemplaire, et une autre optimisation permet d'optimiser les deux autres sommets. [[File:Triangle fan.png|centre|vignette|upright=2.0|Triangle fan]] Avec cette représentation, le tampon de sommets contient une liste de sommets, qui est interprétée sommet par sommet. Le premier sommet est le sommet partagé par tous les triangles du ''triangle fan''. Le premier triangle est définit par le sommet partagé et deux nouveaux sommets. Les triangles suivants sont eux définit par un seul sommet, pas deux. En effet, deux triangles consécutifs partagent une arête, définie par le sommet partagé et un des deux sommets. Sur les deux sommets, le dernier sommet est celui de l'arête partagée. En faisant ainsi, un triangle est définit par un nouveau sommet, le sommet précédent dans le tampon de sommet, et le sommet partagé. {|class="wikitable" |- ! Tampon de sommet !! Triangle 1 !! Triangle 2 !! Triangle 3 !! Triangle 4 !! Triangle 5 !! Triangle 6 !! Triangle 7 !! ... |- | Sommet 1 || X || X || X || X || X || X || X || X |- | Sommet 2 || X || || || || || || |- | Sommet 3 || X || X || || || || || |- | Sommet 4 || || X || X || || || || |- | Sommet 5 || || || X || X || || || |- | Sommet 6 || || || || X || X || || |- | Sommet 7 || || || || || X || X || |- | Sommet 8 || || || || || || X || X |} La technique des '''triangles strip''' optimise le rendu de triangles placés en série, comme illustré dans le schéma ci-dessous. Notez que deux consécutifs ont deux sommets en commun. L'idée est alors que quand on passe au triangle suivant, on ne précise que le sommet restant, pas les deux sommets en commun. [[File:Triangle strip.svg|centre|vignette|upright=2|Triangle strip]] L'implémentation est assez simple : dans le tampon de sommets, trois sommets consécutifs forment un triangle. Et pour passer d'un triangle au suivant, on ne saute pas de trois sommets, on passe d'un sommet au suivant. {|class="wikitable" |- ! Tampon de sommet !! Triangle 1 !! Triangle 2 !! Triangle 3 !! Triangle 4 !! Triangle 5 !! Triangle 6 !! ... |- | Sommet 1 || X || || || || || |- | Sommet 2 || X || X || || || || |- | Sommet 3 || X || X || X || || || |- | Sommet 4 || || X || X || X || || |- | Sommet 5 || || || X || X || X || |- | Sommet 6 || || || || X || X || X |- | Sommet 7 || || || || || X || X |- | Sommet 8 || || || || || || X |} Les ''triangle fan'' et ''triangle strip'' permettent une économie de mémoire conséquente, comparé à la représentation non-compressée. Au lieu de trois sommets pour chaque triangle, on se retrouve avec un sommet pour chaque triangle, plus les deux premiers sommets. La comparaison avec l'usage d'un tampon d'indice dépend de la taille des indices, mais ''triangle fan'' et ''triangle strip'' sont plus économes niveau mémoire vidéo. Un problème est que les ''triangle strip'' ne permettent pas de représenter tous les modèles 3D, certains ne sont simplement pas compatibles avec cette représentation. Et pour les ''triangle fan'', c'est encore pire ! Cependant, il est souvent possible de ruser, ce qui permet de faire rentrer des modèles non-coopératifs dans un ''triangle strip'', mais quelques sommets sont alors redondants. ===L'''input assembler'' et le tampon d'indice=== Les représentations précédentes ont une influence importante sur le pipeline géométrique. Pour les gérer, il a fallu non seulement modifier l'assemblage de primitives, mais aussi rajouter un circuit juste avant l'unité géométrique : l'''input assembler''. Il charge les sommets depuis la mémoire vidéo, pour les injecter dans le reste du pipeline. [[File:Input assembler.png|centre|vignette|upright=2.0|Input assembler]] Pour faire son travail, il a besoin de l'adresse des données géométriques en mémoire, leur taille et éventuellement du type des données qu'on lui envoie (sommets codées sur 32 bits, 64, 128, etc). En clair, il doit connaitre l'adresse du tampon de sommet et éventuellement celle du tampon d'indice. Et en général, c'est une unité d'accès mémoire un peu particulière, qui contient des circuits assez classiques pour ce genre de circuits : des circuits de calcul d'adresse, des circuits pour commander la mémoire VRAM, un contrôleur mémoire, diverses mémoires tampons, etc. Il procède différemment suivant la représentation utilisée. Il peut lire trois sommets consécutifs avec une représentation non-compressée, il peut lire un tampon d'indice et l'utiliser pour charger les sommets adéquats, il peut lire un sommet à la fois avec les ''triangle fan/strip'', etc. Tout dépend de comment l'unité est configurée. Dans ce qui suit, nous allons étudier un ''input assembler'' qui gère la représentation indicée. Il peut être adapté pour gérer les autres représentations assez simplement. L'idée est que l'''input assembler'' est composé de trois circuits principaux : un qui lit le tampon d'indice, un autre qui lit le tampon de sommets, un dernier qui package les sommets. Le premier lit les indices depuis la mémoire vidéo. Le second récupère l'indice chargé par le premier, et lit le sommet associé dans le tampon de sommets. Ils sont respectivement appelés avec les noms : ''index fetch'' et ''vertex fetch''. Le dernier circuit se contente de formater les sommets pour qu'ils soient compréhensibles par les unités géométriques. [[File:Implémentation matérielle de l'input assembler.png|centre|vignette|upright=2|Implémentation matérielle de l'input assembler.]] Pour les représentations autres qu'indicée, seul le ''vertex fetch'' est utilisé. Il se contente alors de balayer le tampon de sommets dans l'ordre, du premier sommet au dernier. Un vulgaire compteur d'adresse suffit pour cela. Avec la représentation indicée, le circuit d'''index fetch'' est utilisé. Il balaye un tableau d'indices du début à la fin, ce qui fait que le calcul d'adresse est réalisé par un simple compteur d'adresse. Le circuit de ''vertex fetch'' fait des calculs d'adresse un chouilla moins simples, mais qui se contentent de combiner l'adresse du tampon de sommets avec l'indice. Les unités de ''index fetch'' et de ''vertex fetch'' font donc des calculs d'adresse et des accès mémoire. Par contre, les deux circuits peuvent implémenter des mémoires caches, pour améliorer les performances. Vous remarquerez que l’''input assembler'' fait surtout des calculs d'adresse, des lectures en mémoire, et des conversions de format de données. Un processeur de ''vertex shader'' peut faire la même chose, ce qui fait qu'il est possible d'émuler l'''input assembler'' avec un ''vertex shader''. La seule condition, absolument nécessaire, est que le ''vertex shader'' puisse lire des données en mémoire vidéo. Et pas seulement lire des textures, comme le permettent les techniques de ''vertex texturing'', mais de vraies lectures arbitraires, pour lire les tampons de sommet/indice. Cette possibilité est arrivée avec Direct X 10, ce qui fait que l’''input assembler'' peut être émulé par les ''vertex shaders'' à partir de cette version de Direct X. De nos jours, tous les GPUs font à leur sauce. Certains émulent l’''input assembler'' avec des ''shaders'', d'autres non. Ceux qui le font le font en modifiant les ''vertex shaders''. Le ''driver'' du GPU injecte du code dans les ''vertex shaders'', code qui émule l'''input assembler''. ===Les caches de sommets : une optimisation du tampon d'indice=== Idéalement, le ''vertex shader'' doit être exécuté une seule fois par sommet (idem pour son équivalent avec une unité de T&L). Mais quand des sommets sont dupliqués, ce n'est pas le cas. Le problème se comprend bien si on prend une représentation non-compressée, où les sommets sont dupliqués si nécessaires. Le résultat est que les copies d'un même sommet sont toutes lues depuis la mémoire, transformées, éclairées, puis envoyées à l'unité d'assemblage de primitives. En clair : un sommet est lu en VRAM plusieurs fois, et subit des calculs géométriques redondants. Ce qui est un problème. Les représentations compressées permettent de grandement réduire cette redondance. Les ''triangle strip'' et ''triangle fan'' sont de loin les plus efficaces, de ce point de vue : un sommet n'est chargé qu'une seule fois, et n'est traité qu'une seule fois. Du moins, si tout se passe bien. En effet, pour convertir un modèle 3D en ''triangle strip/fan'', il faut parfois ruser, ce qui fait que des sommets sont redondants. Avec la représentation indicée, l'''input assembler'' doit détecter quand un sommet dupliqué a déjà été rencontré. Si un tel sommet dupliqué est détecté, on récupère le sommet déjà calculé, plutôt que de refaire les calculs. Mais cela demande d'ajouter une mémoire cache pour mémoriser les sommets transformés/éclairés. Elle est appelée le '''''Post Transform Cache''''' et il est crucial pour éviter les calculs redondants. L'idée est la suivante : en sortie de l’''index fetch'', un circuit regarde les indices chargés et vérifie s'ils ont déjà été rencontrés. Si l'indice est inconnu, alors on suppose que le sommet associé n'a jamais été rencontré. L'indice est envoyé à l'unité de ''vertex fetch'', le sommet est chargé depuis le tampon de sommet et envoyé à l'unité géométrique. Par contre, si l'indice est reconnu, c'est que le sommet associé a déjà été transformé/éclairé : on lit alors le sommet transformé depuis le ''Post Transform Cache''. Pour détecter un sommet déjà rencontré, rien de plus simple : il suffit de consulter le ''Post Transform Cache''. Une fois un indice chargé, le ''Post Transform Cache'' est consulté pour vérifier s'il a une copie du sommet associé. Le cache répond alors soit en disant qu'il n'a pas le sommet associé, soit il renvoie le sommet transformé. Le ''Post Transform Cache'' est consulté en lui envoyant l'indice du sommet, et potentiellement de quoi identifier le tampon d'indice utilisé. C'est pour ne pas confondre deux sommets appartenant à deux modèles différents mais qui ont le même indice par hasard. Deux solutions pour cela : soit on utilise un identifiant pour le tampon d'indice utilisé (pas une adresse), soit on vide le cache entre deux ''draw call''. Il est vraisemblable que tout soit plus compliqué. En, effet, il faut tenir compte du cas où un sommet est en cours de calcul. Pour gérer ce cas, il est probable que l’''input assembler'' réserve de la place dans ce cache à l'avance. Quand un sommet est envoyé aux unités géométriques, l’''input assembler'' doit réserver de la place dans le cache, en mettant l'indice dans le ''tag'' du cache, et en laissant la ligne de cache vide. Le ''Post Transform Cache'' mémorise les N derniers sommets rencontrés. Elle est souvent qualifiée de mémoire FIFO, mais c'est un intermédiaire entre une mémoire cache du point de vue des lectures, et une mémoire FIFO du point de vue des écritures. Il mémorise entre 16 et 64 sommets, pas plus. Aller au-delà ne sert pas à grand chose, vu que des sommets dupliqués sont très souvent proches en mémoire RAM et sont traités dans une fenêtre temporelle assez petite. [[File:Post-transform cache.png|centre|vignette|upright=2|Post-transform cache]] Le ''Post-transform cache'' se trouve donc en sortie de l'unité d’''index fetch''. Mais serait-il possible d'ajouter un second cache, cette fois-ci pour l'unité de ''vertex fetch'' ? Un tel cache existe lui aussi, et s’appelle le '''''pre-transform cache'''''. Il mémorise les sommets chargés, mais pas encore transformés/éclairés. Il se situe entre l'unité de ''vertex fetch'' et l'unité géométrique. Intuitivement, on se dit qu'il évite de charger un sommet plusieurs fois. Mais ce n'est en réalité qu'un intérêt secondaire, bon à prendre, mais pas primordial. En réalité, il permet de profiter du fait que le ''vertex fetch'' charge les sommets par paquets de 32 à 64 sommets, qui sont copiés dans le cache de sommets. Ainsi, quand on charge un sommet, les 32/64 suivants sont chargés avec et sont disponibles pour l'unité de ''vertex shader'' si celle-ci en a besoin dans le futur, ce qui a de très fortes chances d'être le cas. De plus, il est possible de précharger des lignes de cache : quand le ''vertex fetch'' lit un paquet de sommets, le paquet de sommet est copié dans le cache, mais les paquets suivants peuvent aussi être chargés en avance. Une telle technique de '''préchargement'' permet d'améliorer les performances. [[File:Pre- et Post-transform cache.png|centre|vignette|upright=2|Pre- et Post-transform cache]] Pour résumer, l’''input assembler'' contient deux caches, qui sont collectivement appelés des '''caches de sommets'''. Le ''Post Transform Cache'' a disparu dans certains GPU modernes. Je recommande la lecture de l'article "Revisiting The Vertex Cache : Understanding and Optimizing Vertex Processing on the modern GPU" à ce sujet. Quant au ''Pre Transform Cache'', il a été remplacé par des mémoires caches généralistes, qui ne sont pas spécialisées dans les sommets. ===L'assemblage de primitives=== En sortie des unités géométriques, on a des sommets éclairés et colorisés, pas des triangles. Pour recréer des triangles, on doit lire les sommets dans l'ordre adéquat, par paquets de trois pour obtenir des triangles. C'est le rôle de l''''étape d'assemblage de primitives''' (''primitive assembly''), qui regroupe les sommets appartenant au même triangle, à la même primitive. L'assemblage des primitives est réalisée par un circuit fixe, non-programmable, qui utilise le tampon d'indice pour regrouper les sommets en primitives. Un problème pour l'assemblage de primitives est que les sommets n’arrivent pas dans l'ordre. Il arrive que des sommets soit traités plus vite que les autres, et passent devant. Le pipeline ne peut pas se baser sur l'ordre d'arrivée des sommets, pour regrouper les sommets en triangles. Pour gérer ces temps de calcul variable, le pipeline mémorise les triangles en sortie des unités géométriques et attend que tous les sommets d'un triangles soient disponibles. La méthode pour cela dépend de la représentation utilisée. L'assemblage des primitives ne se passe pas pareil avec les ''triangle strip'', ''triangle fan'', représentation indicée et représentation non-compressées. Avec la représentation non-compressée, l'assemblage de primitives regroupe les triangles par paquets de trois, rien de plus. Mais attention, des triangles consécutifs en mémoire ne sortent pas des unités géométriques l'un à la suite de l'autre. Pour gérer ça, l'''input assembler'' associe, un numéro à chaque triangle, qui indique sa place dans le tampon de sommets, qui est un indice. L'assemblage de primitive regarde ces numéros pour regrouper les triangles. Il attend que trois numéros consécutifs soient disponibles pour assembler le prochain triangle. Pour l'adressage indicé, il procède comme la représentation non-compréssée, sauf qu'il regarde le tampon d'indice. Il lit le tampon d'indice en partant du début, et fait des groupes de trois indices consécutifs. Les sommets sont associés avec leur indice, qui les accompagne lors de leur trajet dans le pipeline géométrique. Une fois qu'ils sortent des unités géométriques, ils sont accumulés dans une mémoire juste avant l'unité de primitive, et l'assemblage de primitive attend que les trois sommets avec les trois indices adéquats soient disponibles. Avec les ''triangle strip'', il mémorise les deux derniers sommets chargés, pour les combiner avec le prochain sommet à charger. L'implémentation matérielle est assez simple : un registre pour mémoriser le premier sommet, une mémoire FIFO pour mémoriser les deux sommets les plus récents. Pour générer un triangle, l'étape d'assemblage de primitive lit le registre et la mémoire FIFO, pour récupérer les trois sommets. Avec les ''triangle fan'', il doit mémoriser le sommet partagé, et le dernier sommet chargé, ce qui demande deux registres. ==Les ''geometry shaders''== Les GPU d'avant DirectX 10, qui n'avaient que les ''vertex shaders'' et ne pouvaient manipuler que des sommets. Depuis DirectX 10, le pipeline graphique a intégré des techniques pour gérer nativement des triangles dans les ''shaders''. Dans ce chapitre, nous allons étudier le pipeline graphique de DirectX 10, DirectX 11 et DirectX 12. L'intérêt est que cela permet de faciliter l'implémentation de techniques de tesselation, sans compter que certaines optimisations deviennent plus simples à effectuer. Dans ce chapitre, nous allons étudier le pipeline graphique de DirectX 10, DirectX 11 et DirectX 12. DirectX 10 et OpenGl 3.2 ont introduit les ''geometry shaders'', juste avant l'étape d'assemblage des primitives. Les ''geometry shaders'' peuvent ajouter, supprimer ou altérer des primitives dans une scène 3D. Un ''geometry shader'' prend en entrée un point, une ligne ou un triangle, donc les trois primitives de base supportées sur les GPU modernes. Il émet en sortie : soit un ''triangle strip'', soit une ''line strip'' (c'est à une ligne ce qu'un d'un ''triangle strip'' est à un triangle) ou un point. Ils n'ont pas été très utilisés, leurs utilisations étant assez limitées. Ils peuvent en théorie être utilisés pour la gestion des ''cubemaps'', le ''shadow volume extrusion'', la génération de particules, et quelques autres effets graphiques. Ils pourraient aussi être utilisés pour faire de la tesselation, mais leurs limitations font que ce n'est pas pratique. Rappelons que les ''geometry shaders'' sont optionnels et que beaucoup de jeux vidéos ou de moteurs de rendu 3D n'en utilisent pas. ===La conservation de l'ordre des sommets entrants et sortants=== Les ''geometry shaders'' sont exécutés après l'assemblage de primitive, car ils manipulent les primitives fournies par l'étape d'assemblage des primitives. Les ''geometry shaders'' n'ont jamais eu de processeur de shader dédié, car ils ont été introduits avec DirectX 10 et OpenGl 3.2, en même temps que les processeurs de ''shaders'' ont étés unifiés (rendu capable d’exécuter n'importe quel ''shader''). Leur place dans le pipeline graphique est quelque peu étrange. Un point important est que DirectX 10 impose de conserver l'ordre d'envoi des sommets. Si les sommets arrivent dans un certain ordre, il ressortent du ''geometry shader'' dans ce même ordre. Faire ainsi simplifie grandement les choses pour le programmeur. Mais cela impose des contraintes pour le GPU. Les sommets ont beau être envoyés dans l'ordre aux processeurs, certains peuvent être traités plus vite que les autres. Et quand on distribue des sommets sur pleins de processeurs de shader, cela fait que l'ordre de sortie change. Pour corriger cela, les sommets sortants du ''geometry shader'' doivent être remis en ordre. Une première solution est de les mettre en attente dans un second tampon de primitives, pour les remettre en ordre avant la rastérisation. Les primitives sortent des ''geometry shaders'' dans le désordre, sont ajoutées dans le tampon de primitive dans le désordre, mais la rastérisation les consomme dans l'ordre. [[File:Implémentation matérielle des geometry shaders.png|centre|vignette|upright=2|Implémentation matérielle des geometry shaders]] Au passage, j'ai menti plus haut en disant que les ''geometry shaders'' fournissent en entrée de 0 à plusieurs primitives : la sortie d'un ''geometry shader'' est un ensemble de sommets, souvent complété par un mini-tampon d'indice indiquant comment assembler ces sommets en primitives. Le résultat est que l'assembleur de primitive doit refaire son travail après le passage d'un ''geometry shader''. Heureusement, la sortie d'un ''geometry shader'' est soit un point, soit une ligne, soit un ''triangle strip'', ce qui simplifie la seconde phase d'assemblage des primitives. Avec les ''geometry shaders'', il y a donc deux phases d'assemblage des primitives : une phase avant, décrite dans la section précédente, et une seconde phase simplifiée après les ''geometry shaders''. Il n'y a pas que la phase d'assemblage de primitives qui est dupliquée : le tampon de primitives l'est aussi. On trouve donc un tampon de primitives à l'entrée des ''geometry shaders'' et un autre à la sortie. ===Les complications liées à la sortie des ''geometry shaders''=== J'ai dit plus haut que le GPu incorpore un second tampon de primitives. Mais sur quelques GPU, les résultats d'un ''geometry shader'' ne passent pas directement par un second tampon de primitives. A la place, ils sont mémorisés en mémoire vidéo, avant d'être lu par l'assemblage de primitives. C'était très lent, mais c'est nécessaire pour une raison qu'on va expliquer immédiatement. Un ''geometry shader'' fournit un résultat très variable en fonction de ses entrées. Pour une même entrée, la sortie peut aller d'une simple primitive à plusieurs dizaines. Le ''geometry shader'' précise cependant un nombre limite de sommets qu'il ne peut pas dépasser en sortie. Il peut ainsi préciser qu'il ne sortira pas plus de 16 sommets, par exemple. Et ce nombre maximal est celui qui est utilisé pour savoir comment organiser le tampon de primitive. Par exemple, si jamais on a un tampon de primitive capable de mémoriser 1024 sommets, celui-ci peut être partitionné en 512 blocs de deux sommets, ou 256 blocs de 4 sommets, 128 blocs de 4 sommets, etc. Pour savoir comment subdiviser le tampon de primitives en parts égales, il n'y a qu'une seule solution : diviser le tampon de primitive par des blocs de taille maximale. Ainsi, si le shader dit qu'il aura en sortie entre 0 et 16 sommets maximum, on doit diviser le tampon en parts de 16 sommets, ce qui fait maximum 1024/16 = 128 instances de shaders maximum. En conséquence, le second tampon de primitives sera sous-utilisé en pratique. Et le principe reste le même si on change les chiffres exacts : chaque instance de shader reçoit une certaine portion du tampon de primitive, égale à la taille du tampon de primitives divisée par ce nombre limite. Vous noterez que la répartition n'est pas dynamique, mais statique. C'est la méthode la plus simple niveau matériel et celle qui coute le moins en circuits, malgré sa mauvaise utilisation, du tampon de primitives. Le problème est que le nombre d'instances exécutables en parallèle est rapidement limité. Une solution à cela est la suivante. Quand un ''geometry shader'' a terminé son travail, il regarde s'il y a de la place dans le second tampon de primitives. Si celui-ci est plein, il attend que de la place se libère. On a donc un processeur de shader qui ne fait rien. les primitives calculées sont juste mémorisées dans les registres en attendant d'être transférées au tampon de primitives. Au pire, on peut espérer qu'une autre instance s'exécute dans un autre ''thread'', grâce aux propriétés de ''multithreading'' matériel. Le nombre de ''geometry shader'' pouvant attendre est alors limité par le nombre de registres du processeur, et la taille des ''shaders''. Avoir beaucoup de registres est alors un avantage ([http://www.joshbarczak.com/blog/?p=667 Why Geometry Shaders Are Slow (Unless you’re Intel)]). Une solution alternative est de mémoriser le résultat des ''geometry shaders'' en mémoire RAM, pour ensuite relire le résultat pour l'envoyer à la rastérisation. Pas besoin de second tampon de primitives, les limitations de nombre de shaders exécutés en parallèle disparaissent. Les processeurs de shaders sont utilisés au maximum, mais le cout en bande passante mémoire est assez élevé. les performances ne sont donc pas franchement meilleures. : Il n'y a pas le même problème avec les ''vertex shaders'' car ils ne font que modifier des sommets : pour N sommets en entrées, ils fourniront N sommets en sortie. Ainsi, si on X processeurs de shaders pouvant traiter Y sommets en même temps avec leurs instructions SIMD, on peut prévoir le nombre de sommets en sortie. Le tampon de primitive est conçu pour encaisser ce nombre de sommets sortants, voire beaucoup plus. Il est rarement un point bloquant en termes de performances. ==Les ''mesh shaders''== <noinclude>[[File:D3D11 Pipeline.svg|vignette|upright=1|Pipeline graphique de Direct x 11.]]</noinclude> Avec l'introduction des ''geometry shaders'' et de la tesselation, le pipeline graphique est devenu très complexe. Plusieurs étages en plus sont ajoutés à sa portion géométrique : un pour les ''geometry shaders'', trois pour la tesselation, et ce en plus des ''vertex shaders'' existants et des étages non-programmables. Le pipeline en question est celui d'Open GL 4 et de DirectX 11. Mais Direct X 12 a simplifié le tout, sous l'impulsion de technologies introduites par AMD et de NVIDIA. AMD a introduit les ''primitive shaders'', NVIDIA a introduit les ''mesh shaders'''' ont été introduit par NVIDIA. Les derniers ont été gardés pour DirectX 12, simplifiant grandement le pipeline. ===Les primitive/mesh shaders=== Les deux solutions de AMD et NVIDIA partent du même principe : elles fusionnent certaines étapes du pipeline. Les ''primitive/mesh shaders'' font disparaitre les étapes d{{'}}''input assembly'' et d'assemblage de primitives, qui sont maintenant gérées par les ''primitive/mesh shaders''. Les ''primitive/mesh shaders'' lisent directement le tampon d'indice et lisent les sommets depuis la VRAM, sans passer par une étape non-programmable. Ils assemblent les primitives eux-mêmes et les envoient directement au rastériseur. Le tout permet des optimisations très intéressantes, comme un ''culling'' précoce. Les ''mesh shaders'' sont des ''shaders'' généralistes, semblables aux ''compute shaders''. Pour rappel, un ''compute shader'' peut lire des données en RAM, exécuter des traitements dessus, et enregistrer les résultats en RAM. Il peut lire ou écrire à des adresses arbitraires, sans limitations. Il n'est pas limité à lire des données consécutives, peut sauter d'une donnée à une autre donnée distante en RAM. Les ''mesh shaders'' sont des variantes des ''compute shaders'', qui n'écrivent pas leur résultat en RAM, mais envoient celui-ci au rastériseur. Plus précisément, ils écrivent leur résultat dans le tampon de primitives. Les ''mesh shaders'' peuvent contourner l'étape d{{'}}''input assembly'' et la remplacer par leur propre code. Pour rappel, l'étape d{{'}}''input assembly'' était non-programmable et gérait des tampons de vertices et d'indices très normés. Les sommets étaient lus soit un par un, soit par paquets de N sommets consécutifs, ce qui était assez rigide. Il n'y avait pas d'accès arbitraire en mémoire RAM comme peuvent le faire les ''compute shaders''. Par contre, un ''mesh shader'' peut accéder aux sommets de la manière qu'il souhaite, ce qui permet d'émuler un ''input assembler'' normal et plus encore. Une autre différence avec les ''vertex shaders'' est qu'ils ne traitent pas forcément des sommets, mais peuvent aussi envoyer des primitives au rastériseur directement. En clair, ils n'ont pas besoin d'une étape de ''primitive assembly'', qu'ils peuvent émuler directement dans le ''shader'' lui-même. Le ''culling'' est lui aussi réalisé par le ''primitive shader'', pas par une unité fixe. Et cela permet de contourner un problème fondamental des ''vertex shaders'' : il fallait que les primitives soient assemblées pour qu'on puisse déterminer si elles sont ou non invisibles. A l'opposé, les ''primitive/mesh shaders'' assemblent les primitives de manière précoce dans le ''primitive/mesh shader'', ce qui permet d'éliminer les primitives invisibles le plus tôt possible. Pour cela, les opérations permettant de déterminer si une primitive est visible sont exécutés en priorité, les autres opérations sont retardées et effectuées le plus tard possible. Ainsi, les calculs pour colorier ou orienter un sommet ne sont pas exécutés si le sommet est invisible. Il y a des différences entre ''primitive'' et ''mesh shaders''. Les ''primitive shaders'' permettent de lire un sommet à la fois, alors que les ''mesh shaders'' permettent de lire des ''batchs'' de plusieurs primitives d'un coup. Ces ''batchs'' de plusieurs primitives sont appelés des meshlets. La différence n'est pas fondamentale : le hardware des cartes AMD, qui gère des ''primitive shaders'', peut regrouper dynamiquement plusieurs instances de ''primitive shaders'' en un seul ''mesh shader'', via les technique de SIMT (une instance de ''primitive shader'' effectue des opérations scalaires, qui peuvent être regroupées en une seule instance SIMD en traitant plusieurs sommets en parallèle). La seule différence est que les ''mesh shaders'' exposent ce comportement au niveau du jeu d'instruction des ''shaders'', les programmeurs en ont conscience. ===Le pipeline géométrique avec les ''primitive/mesh shaders''=== Avec les ''primitive shaders'', l'implémentation exacte dépend de si la tesselation est activée ou non. Si la tesselation n'est pas activée, le ''vertex shader'' et le ''geométry shader'' sont fusionnés en un seul ''primitive shader''. {|class="wikitable" |+ Comparaison entre les pipelines géométriques de DirectX 11 et 12, sans tesselation |- ! DirectX 11 | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |- | colspan="4" | |- ! DirectX 12 | colspan="4" | ''Primitive shader'' (AMD) |} Avec la tesselation activée, les ''geometry shaders'' et les ''domain shaders'' en un seul ''shader''. De même, les ''vertex shaders'' et les ''hull shaders'' sont fusionnés en un seul ''shader'', nommé l{{'}}''amplification shader''. Ainsi, le pipeline graphique est grandement simplifié, avec seulement deux ''shaders'' et un étage fixe, au lieu de quatre ''shaders'' différents. {|class="wikitable" |+ Comparaison entre les pipelines géométriques de DirectX 11 et 12, avec tesselation |- ! DirectX 11 | class="f_rouge" | ''Input assembly'' | ''Vertex shader'' | ''Hull shader'' | class="f_rouge" | Tesselation | ''Domain shader'' | ''Geometry shader'' | class="f_rouge" | ''Primitive assembly'' |- | colspan="7" | |- ! DirectX 12 | colspan="3" | * ''Amplification shader'' (AMD) | class="f_rouge" | Tesselation | colspan="3" | * ''Primitive shader'' (AMD) |} <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le pipeline géométrique : évolution | prevText=Le pipeline géométrique : évolution | next=Le rasterizeur | nextText=Le rasterizeur }}{{autocat}} </noinclude> fmdqsfpkafl7hmajzvj9im2grzp4o7z Les cartes graphiques/La répartition du travail sur les unités de shaders 0 79263 764888 763817 2026-04-24T17:57:29Z Mewtow 31375 /* Sources extérieures */ 764888 wikitext text/x-wiki Un GPU plusieurs processeurs de shaders, chacun traitant plusieurs sommets/pixels à la fois. La répartition du travail sur plusieurs processeurs de ''shaders'' est un vrai défi sur les cartes graphiques actuelles. La répartition du travail sur plusieurs processeurs de ''shaders'' est le fait du '''processeur de commande''', un circuit de la carte graphique. Ce n'est pas son seul rôle, mais c'est clairement une fonctionnalité très importante que prend en charge le processeur de commande. ==La répartition du travail pour le GPGPU== Avant de voir ce qu'il en est pour le rendu 3D, nous allons faire un détour par les fonctionnalités dites de GPGPU. Outre le rendu 3D, les cartes graphiques modernes sont utilisées pour accélérer des calculs scientifiques, tout ce qui implique des réseaux de neurones, de l'imagerie médicale, etc. De manière générale, tout calcul faisant usage d'un grand nombre de calculs sur des matrices ou des vecteurs est concerné.. L'usage d'une carte graphique pour autre chose que le rendu 3D porte le nom de '''GPGPU''' (''General Processing GPU''). En soi, le GPGPU est assez logique : les processeurs de shaders, bien que conçus avec le rendu 3D en tête, n'en restent pas moins des processeurs multicœurs SIMD/VLIW assez puissants. Si nous voyons le GPGPU avant le rendu 3D, c'est pour une raison simple : la répartition du travail sur les processeurs de shaders est alors nettement plus simple. En GPGPU, les shaders font des calculs génériques, à savoir qu'ils ne travaillent pas sur des pixels ou des vertices. Ils n'ont donc pas à communiquer avec le rastériseur ou l'''input assembler'', ils ne lisent même pas de textures dans la RAM. Les processeurs de shaders communiquent seulement avec la mémoire vidéo, mais pas avec le moindre circuit fixe. La répartition du travail en GPGPU est donc beaucoup plus simple qu'en mode graphique, le processeur de commande a nettement moins de travail. ===La répartition du travail en GPGPU n'est pas celle du mode graphique=== Du point de vue du GPGPU, l'architecture d'une carte graphique récente est illustrée ci-dessous. Les processeurs/cœurs sont les rectangles en bleu/rouge, le bleu et le rouge correspondant à des circuits de calcul différents. La hiérarchie mémoire est indiquée en vert. Le tout est alimenté par un processeur de commande, en jaune, ici appelé le ''Thread Execution Control Unit''. [[File:NVIDIA GPU Accelerator Block Diagram.png|centre|vignette|upright=2.5|Ce schéma illustre l'architecture d'un GPU en utilisant la terminologie NVIDIA. Comme on le voit, la carte graphique contient plusieurs cœurs de processeur distincts, ayant chacun plusieurs unités de calcul appelées malencontreusement "processeurs de threads". Ces cœurs sont alimentés en instructions par le processeur de commandes, ici appelé ''Thread Execution Control Unit'', qui répartit les différents shaders sur chaque cœur. Enfin, on voit que chaque cœur a accès à une mémoire locale dédiée, en plus d'une mémoire vidéo partagée entre tous les cœurs.]] En GPGPU, un ''shader'' s'exécute sur des regroupements de données bien connus des programmeurs : des tableaux. Pour rappel, un tableau est un ensemble d'entiers ou de flottants qui sont consécutifs en mémoire RAM. Les tableaux peuvent être de simples tableaux, des matrices, peu importe. Le processeur envoie à la carte graphique un ''shader'' à exécuter et les tableaux à manipuler. Les tableaux ont une taille variable, mais sont presque toujours de très grande taille, au moins un millier d’éléments, parfois un bon million, si ce n'est plus. Le processus de répartition du travail est globalement le suivant. Le processeur de commande reçoit une '''commande de calcul GPGPU''', qui précise quel ''shader'' exécuter, et fournit l'adresse de plusieurs tableaux, ainsi que des informations sur le format des données (entières, flottantes, tableau en une ou deux dimensions, autres). Le processeur de commande découpe les tableaux en vecteurs de taille fixe, qu'un processeur de shader peut gérer. Par exemple, si un processeur SIMD gère des vecteurs de 32 entiers/flottants, alors le tableau est découpé en morceaux de 32 entiers/flottants, et chaque processeur exécute une instance du ''shader'' sur des morceaux de cette taille. Cependant, il faut tenir compte que les processeurs de shader sont multithréadés. Ils peuvent gérer plusieurs ''threads'', qui sont exécutés selon les besoins. Si un ''thread'' est bloqué par un accès mémoire, un autre ''thread'' prend la relève. Un processeur de shader permet d'exécuter "en même temps" entre 8 et 64 ''threads''. La conséquence que l'on peut envoyer plusieurs morceaux de tableau sur un processeur de shader. Chaque morceau de tableau est combiné avec un shader pour former un ''thread'', et l'on envoie 8 à 64 de ces ''threads'' sur un même processeur de shader. Pour résumer, on découpe le travail en morceaux de taille identique, qu'on envoie à chaque processeur de shader. Un GPU moderne est une sorte de processeur multicœurs amélioré, qui gère des tableaux/vecteurs de taille variable, mais les découpe en vecteurs de taille fixe à l'exécution et répartit le tout sur des processeurs SIMD. : Il faut préciser que la terminologie du GPGPU est quelque peu trompeuse. Dans la terminologie GPGPU, un ''thread'' correspond à l'exécution d'un ''shader'' sur une seule donnée scalaire, un seul entier/flottant provenant du tableau. Beaucoup de monde s'imagine que les processeurs de ''shader'' exécutent des ''threads'', qui sont regroupés à l'exécution en ''warps'' par le matériel, mais ce n'est certainement pas ce qui se passe. ===La répartition du travail telle que définie par CUDA=== Pour les GPU NVIDIA, le processus de découpage n'est pas très bien connu. Mais on peut en avoir une idée en regardant l'interface logicielle utilisée pour le GPGPU. Chez NVIDIA, celle-ci s'appelle CUDA et ses versions donnent une idée de comment le découpage s'effectue. Premièrement, les ''shaders'' sont appelés des '''''kernels'''''. Les tableaux de taille variable sont appelés des '''''grids'''''. Les données individuelles sont appelées, de manière extrêmement trompeuse, des ''threads''. Aussi, pour éviter toute confusion, je vais renommer les ''threads CUDA'' en '''scalaires'''. Les ''grids'' sont eux-même découpés en '''''thread blocks''''', qui contiennent entre 512 et 1024 données entières ou flottantes, 512 et 1024 scalaires. La taille, 512 ou 1024, dépend de la version de CUDA utilisée, elle-même liée au modèle de carte graphique utilisé. Plutôt que d'utiliser le terme ''thread blocks'', je vais parler de '''bloc de scalaires'''. Le bloc de scalaire est une portion d'un tableau, un bloc de mémoire, une suite d'adresse consécutives. Il a donc une adresse de départ. Chaque scalaire d'un bloc de scalaire a un indice qui permet de déterminer sa position dans le tableau, qui est calculé par le processeur de commande. Le calcul de l'indice peut se faire de différentes manières, suivant que le tableau soit un tableau unidimensionnel (une suite de nombre) ou bidimensionnel (une matrice). CUDA gère les deux cas et les dernières cartes graphiques gèrent aussi des tableaux à trois dimensions. Le calcul de l'adresse d'un scalaire se fait en prenant l'adresse de départ du bloc de scalaire, et la combinant avec les indices. [[File:Block-thread.svg|centre|vignette|upright=2|Découpage des tableaux avec CUDA.]] Les processeurs de ''shader'' sont appelés des '''''streaming multiprocessor''''', terme encore une fois trompeur. Une fois lancé sur un processeur de ''shader'', le shader lit un bloc de scalaire et l'utilise pour faire ses calculs. Il y reste définitivement : il ne peut pas migrer sur un autre processeur en cours d'exécution. Un processeur de ''shader'' peut exécuter plusieurs instances de ''shaders'' travaillant sur des bloc de scalaires différents. Dans le meilleur des cas, il peut traiter en parallèle environ 8 à 16 bloc de scalaires différents en même temps. [[File:Software-Perspective for thread block.jpg|centre|vignette|upright=2|Exécution des ''thread blocks'' sur les processeurs de ''shaders''.]] Le bloc de scalaires est découpé en vecteurs d'environ 32 entiers/flottants, appelés des '''''warps''''' dans la terminologie NVIDIA/CUDA, des '''''wavefronts''''' dans la terminologie AMD. Avec 512/1024 éléments par bloc de scalaire, découpé en ''warps'' de 32, cela donne 16 à 32 ''warps'' suivant la version de CUDA utilisée. Le découpage en ''warps'' est encore une fois le fait du processeur de commande. Le terme ''warp'' est aussi utilisé pour décrire l'instance du ''shader'' qui fait des calculs avec un ''warp''. Un ''warp''/''wavefront'' est donc en réalité un ''thread'', un programme, une instance de ''shader'', qui manipule des vecteurs SIMD de 32 éléments. Les 16 à 32 ''warps'' sont exécutés en même temps sur le processeur de ''shader'', via ''multithreading'' matériel, à savoir que le processeur les exécute à tour de rôle. Un ''warp'' exécute des instructions SIMD sur des vecteurs de 32 éléments, donc de taille fixe. Pour résumer, plus un GPU contient de processeurs de ''shaders'', plus le nombre de blocs de scalaires qu'il peut traiter en même temps est important. Par contre, la taille des ''warps'' ne change pas trop et reste la même d'une génération sur l'autre. Cela ne signifie pas que la taille des vecteurs reste la même, mais elle est assez contrainte. ===La répartition avec une file de ''threads''=== Pour résumer, les tableaux sont découpés en morceaux et chaque morceau est combiné avec un shader pour former un ''thread''. reste à répartir ces ''threads'' sur les processeurs de shaders. La répartition la plus simple est la suivante : le premier morceau va dans le premier processeur de shader, le second morceau va dans le second processeur de shader, etc. En clair, un simple algorithme du tourniquet. Si elle été utilisée sur les anciens GPU, notamment sur les cartes graphiques SGI des années 80-90, ce n'est pas celle qui est utilisée aujourd'hui. A la place, la répartition demande une coopération entre le processeur de commande et les processeurs de shaders. Les GPU modernes incorporent une '''file de ''threads''''', entre le processeur de commande et les processeurs de shaders, qui sert de file d'attente. Le processeur de commande découpe les tableaux en ''threads'', qui sont ajoutés dans cette file d'attente. Les processeurs de shader récupèrent ensuite les ''threads'' disponibles dans cette file d'attente. Le processeur de commande remplit la file de ''thread'' tant que celle-ci n'est pas pleine. Et la file de ''thread'' se vide quand un processeur de shader est libre, qu'il a finit de calculer le ''thread'' précédent. La répartition est alors dynamique et exploite au mieux les processeurs de shader. Prenons l'exemple d'un GPU avec une file de ''thread'' capable de mémoriser 32 ''threads'', et 16 processeurs de shader. Soumettons un tableau de 24 éléments. Le processeur de commande remplit la file de ''thread'' avec 16 ''threads''. Les processeurs de shader lisent alors chacun un ''thread'', ce qui fait que la file d'attente se vide de 16 ''threads'', il n'en reste que 8. Une fois qu'un shader a finit son travail, il lit un ''thread'' dans la file d'attente, ce qui fait qu'elle se vide un ''thread'' après l'autre. ===L'exécution simultanée des commandes=== Maintenant, regardons ce qui se passe quand on envoie deux commandes successives. Prenons deux commandes de 24 ''threads'' chacune, avec 16 processeurs de shaders. Pour simplifier, les processeurs de shader vont d'abord exécuter les 16 ''threads'' de la première commande, et on va supposer qu'ils vont tous se terminer quasiment en même temps. Le processeur de commande remplit alors la file de commande : en plus des 8 ''threads'' restants, il rajoute 8 ''threads'' provenant de la commande suivante. Les processeurs de shader exécutent alors les 16 commandes dans la file : la moitié vient de la première commande, l'autre vient de la seconde commande. En clair, la file de ''thread'' permet une forme de "pipeline", un terme connu de ceux qui ont déjà lu un cours d'architecture des ordinateurs. L'idée est que l'on peut lancer une nouvelle commande alors que la précédente n'est pas terminée. Il s'agit de l'idée générale, mais les détails peuvent être assez surprenants. Par exemple, si on veut exécuter pleins de commandes très petites, elles peuvent s'exécuter en parallèle dans des processeurs de shader séparés. Par exemple, avec 32 processeurs de shader, vous pouvez exécuter 16 commandes de un ''thread'' chacune. Ou encore, une commande lancée récemment peut se terminer avant une commande plus ancienne. Bref : la file de ''thread'' permet de lancer plusieurs commandes l'une après l'autre, mais elles peuvent s’exécuter en même temps et se terminer dans le désordre. Tout fonctionne à la perfection tant que les commandes de calcul sont indépendantes. Mais il arrive qu'une commande prenne en entrée le résultat d'une commande précédente. Dans ce cas, lancer les deux commandes en même temps peut poser problème. La seconde commande peut alors tenter de lire un résultat qui n'a pas encore été calculé. Et il ne s'agit là que d'un cas particulier, mais de nombreuses dépendances assez complexes entre commandes existent. De telles dépendances imposent que la première soit intégralement terminée avant que la seconde démarre. On parle alors de ''partial pipeline flush''. Pour gérer cela, le processeur de commande supporte des '''commandes de synchronisation'''. Les plus simples, les commandes ''FLUSH'' empêchent le démarrage d'une commande tant que les précédentes sont en cours. Elles empêchent le processeur de commande d'ajouter des ''threads'' dans la file de ''thread'', du moins tant que celle-ci n'est pas entièrement vide, et aussi tant que les processeurs de shader sont occupés. Ces commandes de synchronisation sont aussi appelées des '''barrières GPU'''. le terme indique bien qu'elle séparent le flux de commandes en deux. Les barrières GPU ont un cout en performance, car elles empêchent d'exécuter plusieurs commandes en même temps. Mais elles sont nécessaires. Par exemple, reprenons l'exemple de deux commandes de 24 ''threads'' chacune, séparées par une barrière GPU, toujours avec 16 processeurs de shader. Le GPU va d'abord exécuter les 16 premiers ''threads''. Puis, il va exécuter les 8 ''threads'' restants de la première commande, mais pas plus. La barrière GPU l'empeche d'exécuter les ''threads'' de la commande suivante. C'est seulement ensuite qu'il lancera les 16 ''threads'' de la seconde commande, puis les 8 restants. Cela a pris plus de temps que d'exécuter les deux commandes en même temps. D'autres barrières GPU sont plus précises. Elles empêchent le démarrage d'une nouvelle commande tant que la commande précédente n'a pas atteint un certain stade de son exécution. Elles permettent de gagner en performance en démarrant la commande suivante au plus tôt. De telles commandes sont des commandes du style "attend que le registre de statut numéro N contienne la valeur adéquate avant de démarrer la commande suivante". Une alternative réserve une adresse mémoire, dans laquelle la commande précédente écrit une valeur prédéterminée pour dire qu'elle a finit. ==La répartition du travail pour le rendu graphique== Après avoir vu le cas du GPGPU, nous allons voir le cas du rendu 3D. La différence est que les commandes GPGPU sont remplacées par des commandes 3D, qui demande d'afficher un objet. Du point de vue de l'API 3D, elles correspondent grossièrement soit à un ''draw call'', soit à un changement de ''render state''. Aussi, nous ferrons parfois la confusion entre les deux, bien que ce soit techniquement une grosse simplification, plus proche de l'erreur ou de la confusion que de l'abus de langage. Les commandes graphiques sont différentes des commandes de calcul, mais elles fonctionnent sur le même principe. La différence est qu'une commande graphique demande d'afficher un objet 3D, les ''draw call'' affichant une image objet par objet. Une commande graphique contient bien un tableau de données : un tableau de triangle qui correspond à l'objet à afficher. Cependant, elle contient aussi une liste de texture et une liste de shaders. Le tableau de triangles est découpé en ''threads'' qui sont envoyés aux processeurs de shaders. Il est possible d'imaginer un GPU qui attend qu'une commande soit terminée avant de démarrer la suivante. Il s'agit d'une technique simple, mais tellement peu performante qu'il n'est pas certain qu'elle ait été utilisée en pratique. En pratique, tous les GPUs exécutent plusieurs commandes graphiques consécutives en même temps, comme pour les commandes de calcul. Par exemple, si une commande simple n'utilise que 3 processeurs de shaders sur 8, la commande suivante peut être lancée pour occuper les 5 processeurs de shader restants. Un point important est que ce n'est possible que si les circuits fixes ne sont pas un facteur limitant. Si la première commande sature les circuits fixe, le lancement de la seconde commande sera empêché. Concrètement, du point de vue de l'API graphique, le GPU peut exécuter plusieurs ''draw call'' en même temps. Pire que ça, un ''draw call'' lancé après un autre peut finir avant ! Et la conséquence, c'est que les problèmes de dépendances vus plus haut reviennent. Par exemple, imaginez qu'un jeu écrive une ''shadowmap'' dans une texture, puis l'utilise dans un algorithme d'éclairage. Une première commande calcule la ''shadowmap'', une seconde commande exécute l'algorithme d'éclairage. Il est interdit de démarrer la seconde commande tant que la première commande n'a pas calculé son résultat, car la ''shadowmap'' n'est pas encore prête. Une barrière GPU est alors nécessaire. Elle est ajoutée par le ''driver'', ou par le programmeur s'il utilise une API 3D récente (DirectX 12, Vulkan). Un autre exemple survient quand deux ''draw calls'' consécutifs utilisent des ''render state'' différents. Dans ce cas, le GPU voit deux commandes de rendu, avec une commande de changement d'état entre les deux. La commande de changement d'état fait alors deux choses : le changement d'état, mais aussi une barrière GPU. Concrètement, le processeur de commande ne démarre le second ''draw call'' que quand le changement d'état est terminé. Tout cela est géré par le processeur de commande, qui détermine dans quel ordre lancer les commandes, quand émettre des barrières, etc. On retrouve aussi des files de ''threads'', ou du moins leur équivalent pour le rendu graphique. Pour le moment, on ne voit pas de différence avec le calcul GPGPU : le processeur de commande et la file de ''thread'' sont là, elles sont exploitées de manière à exécuter des commandes graphiques en parallèle sur des processeurs de shaders, etc. Une grosse différence est qu'il y a plusieurs files de ''threads'', dont le nombre exact dépend du GPU considéré. Une autre différence est la présence de circuits fixes, à savoir un rastériseur, un ''input assembler'' et des ROPs. Voyons cela en détail. ===Les GPU avec une seule unité géométrique=== Avant de poursuivre, faisons une première remarque : un triangle est affiché sur un ou plusieurs pixels lors de l'étape de rastérisation. Un triangle peut donner quelques pixels lors de l'étape de rastérisation, alors qu'un autre va couvrir 10 fois de pixels, un autre seulement trois fois plus, un autre seulement un pixel, etc. La conséquence est qu'il y a plus de travail à faire sur les pixels que sur les sommets. C'est un phénomène d''''amplification''', qui explique qu'il y a plus de processeurs pour les ''pixel shaders'' que pour les ''vertex shaders''. Et il impact grandement la répartition du travail sur les processeurs de shaders. Le cas le plus simple est celui des GPU avec une unité géométrique, qui alimente un rastériseur, qui lui-même alimente plusieurs unités de pixel/texture. L'''input assembler'' envoie des sommets à l'unité géométrique, dès que celle-ci est inoccupée, prête à accepter une nouvelle tâche à faire. De son côté, le rastériseur distribue les pixels aux unités de pixel/texture. Les GPU de ce genre sont assez rares, et surtout assez anciens. Les premières cartes graphique de l'entreprise SGI était de ce type, la Geforce 256 de NVIDIA l'était aussi. [[File:Architecture d'un GPU tenant compte de l'amplification des pixels.png|centre|vignette|upright=2.5|Architecture d'un GPU tenant compte de l'amplification des pixels]] La seule difficulté est de gérer l'amplification des pixels, la répartition des pixels sur les unités de pixel, et c'est le rastériseur qui s'en charge. Pour cela, le rastériseur utilise une '''file de pixels''', similaire à celle utilisé pour les commandes GPGPU, à la différence qu'elle mémorise des pixels à texturer/éclairer, sans compter qu'elle est placée plus loin dans le pipeline. Le rastériseur accumule les pixels qu'il génère dans cette file de pixel, les unités de pixel piochent le travail à faire dedans. La file de pixels est techniquement une mémoire FIFO dite multiport, à savoir qu'on peut lire plusieurs pixels en une seule fois. Pour être précis, la file de pixel est gérée par un circuit de répartition (''dispatcher''), qui répartit les pixels sur les unités de pixel libres. Le circuit de répartition peut regrouper les pixels générés en paquets de 43 à 64 pixels, pour tenir compte du caractère SIMD des processeurs de shaders. Les paquets générés sont techniquement des ''threads'', similaire aux ''threads'' GPGPU, sauf qu'ils ne contiennent que des pixels, avec tout ce qu'il faut pour les texturer ou les éclairer. [[File:Dispatch des shaders sur plusieurs processeurs de shaders.png|centre|vignette|upright=2|Dispatch des shaders sur plusieurs processeurs de shaders]] Il arrive que l'unité géométrique doive attendre que le rastériseur soit disponible. Par exemple, imaginons que le rastériseur traite un gros triangle, qui occupe une centaine de pixels à l'écran. Supposons que le GPU a 4 processeurs de shaders basiques, ce qui fait qu'il traite les 100 pixels générés à la rastérisation par paquets de 4. Traiter les 100 pixels prend 25 passes en tout. Pendant ce temps, l'unité géométrique a tout le temps pour calculer plusieurs triangles. Et gérer la situation peut se faire de deux manières. La première est la moins performante : l'unité géométrique est bloquée quand le rastériseur est occupé sur de gros triangles. Elle ne peut pas recevoir de nouveaux sommets à traiter, l'''input assembler'' est lui aussi en pause. Une solution alternative met en attente les triangles générés par l'unité géométrique, dans une mémoire FIFO dédiée. Ainsi, l'unité géométrique peut accumuler des triangles dans la mémoire FIFO, préparer du travail en avance pour le rastériseur. Le rastériseur consulte la FIFO quand il est libre. La FIFO se remplit tant que l'unité de rastérisation est occupée sur des gros triangles, puis elle est vidée progressivement quand elle traite des triangles plus petits. La mémoire FIFO en question est appelée la '''file de sommets transformés'''. : Notons que si la FIFO est pleine, on n'a pas le choix : l'unité géométrique est bloquée, elle n'accepte plus de nouveau triangles. [[File:GPU basique avec FIFO avant le rastériseur.png|centre|vignette|upright=2.5|GPU basique avec FIFO avant le rastériseur]] La présence d'une FIFO permet aussi d'implémenter facilement l'assemblage de primitives. Pour rappel, les unités géométriques calculent des sommets, alors que le rastériseur prend en entrée des triangles. Les sommets doivent donc être regroupés en triangles, lors d'une étape d'assemblage des primitives, qui précède la rastérisation. Il est possible d'ajouter une seconde mémoire FIFO entre l'assemblage de primitive et les rastériseur. La FIFO en question est appelée le '''tampon de primitive''', ou encore la file de primitives. [[File:GPU basique avec FIFO avant le rastériseur - prise en compte de l'assemblage de primitives.png|centre|vignette|upright=2.5|GPU basique avec FIFO avant le rastériseur - prise en compte de l'assemblage de primitives]] Pour résumer, l’implémentation demande deux choses : * l'ajout d'une file de sommets transformés entre l'unité géométrique et le rastériseur ; * l'ajout d'une file de pixels et d'une unité de distribution en sortie du rastériseur. Ces deux modifications seront conservées dans les GPU ultérieurs, avec quelques modifications mineures. Il faut dire qu'ajouter des mémoires FIFOs a des avantages certains. La présence des mémoires FIFO désynchronise deux étapes consécutives du pipeline, tout en gardant une exécution des étapes dans l'ordre. Une étape écrit ses résultats dans la mémoire FIFO, l'étape suivante lit ce tampon quand elle démarre de nouveaux calculs, la première étape n'a pas à attendre que la seconde soit disponible pour lui envoyer des données. Sauf si la mémoire FIFO est pleine, car elle ne peut plus accepter de nouveaux sommets/pixels, évidemment. ===Les GPU avec des processeurs séparés pour les ''vertex'' et ''pixel shaders''=== Maintenant, regardons ce qui se passe si l'on ajoute plusieurs unités géométriques. Les GPU de ce type commencent avec la Geforce 2 de NVIDIA et se terminent tout de même avec la Geforce 6/7. Soit une bonne décennie de GPU de ce type. De tels GPUs sont plus simples pour plusieurs raisons, la principale étant qu'il n'ont qu'un seul circuit rastériseur. La répartition du travail avec plusieurs rastériseurs est en effet beaucoup plus compliquée qu'avec un seul. [[File:Parallélisme dans une carte 3D.png|centre|vignette|upright=3|Parallélisme dans une carte 3D]] Notons que cette séparation marche ausis pour les GPU qui ont des processeurs de shaders. De tels GPUs ont des processeurs séparés pour les ''vertex shaders'' et les ''pixel shaders''. La raison est que DirectX 9.0 et OpenGL avaient des jeux d'instruction différents pour les ''vertex'' et ''pixel shaders''. Par exemple, les ''pixels shaders'' de l'époque pouvaient accéder aux textures, pas les ''vertex shaders''. Les GPU de ce type ont beaucoup plus de processeurs de ''pixel shaders'' que de processeurs de ''vertex shaders'', en raison du phénomène d'amplification de pixels mentionné plus haut. Pour donner un exemple, la Geforce 6800 avait 16 processeurs pour les ''pixel shaders'' et 6 processeurs pour les ''vertex shaders''. Un problème de ces GPU est que la répartition entre puissance entre ''vertex'' et ''pixel shaders'' est fixe. Mais tous les jeux vidéos n'ont pas les mêmes besoins : certains sont plus lourds au niveau géométrie que d'autres, certains ont des ''pixels shaders'' très gourmands avec des ''vertex shaders'' très ''light'', d'autres font l'inverse, etc. La répartition idéale est variable d'un jeu vidéo à l'autre, voire d'un niveau de JV à l'autre, et ces GPU en étaient loin. [[File:Architecture de base d'une carte 3D - 5.png|centre|vignette|upright=1.5|Carte 3D avec pixels et vertex shaders non-unifiés.]] Ceci étant dit, voyons comment la répartition du travail se fait sur de tels GPUs. La présence de plusieurs unités géométriques a deux conséquences : il faut alimenter plusieurs unités géométriques en triangles/sommets, il faut gérer l'envoi des triangles au rastériseur. Les deux demandent des solutions distinctes. La répartition sur les processeurs de ''vertex shader'' utilise encore une fois une file dédiée, sur le même modèle que la file de ''threads'' GPGPU. La file en question est appelée la '''file de sommets non-transformés''', pour la distinguer de celle située avant l'étape de rastérisation. Les deux mémorisent des sommets, mais la première se situe avant le ''vertex shader'', l'autre après. La gestion de cette file de sommets non-transformés est le fait de l'''input assembler''. Pour remplir la file, l'''input assembler'' lit le tampon de sommets en mémoire vidéo, ainsi que le tampon d'indice. Il crée alors des paquets de sommets, qui sont envoyés aux processeurs de shaders (remplacer par les unités de T&L sur les anciens GPU). Typiquement, il utilise des paquets de 32/64 sommets. Le fait de regrouper les sommets en paquets permet de profiter de la nature SIMD des processeurs de shaders, à savoir qu'un paquet est traité en bloc par une instance de shader. Voyons maintenant ce qui se passe après les ''vertex shaders''. Les unités géométriques envoient des sommets à un rastériseur unique, qui est donc un point de convergence, où plusieurs unités géométriques envoient leurs résultats. Pour gérer cette convergence, les GPU modifient la file de sommets transformés, celle située juste avant le rastériseur. L'idée est qu'elle est connectée à tous les processeurs de ''vertex shaders'', et qu'elle peut recevoir plusieurs triangles à la fois. Rien de compliqué à cela, ce n'est pas si compliqué de créer des mémoires RAM usuelle capables de supporter plusieurs écritures simultanées. Il suffit d'ajouter des ports d'écritures à la mémoire FIFO et le tour est joué. Pour résumer, l'implémentation demande d'ajouter une file de ''thread'' en amont de l'''input assembler'', et de modifier la mémoire FIFO en amont du rastériseur. La FIFO devient une mémoire multiport et est connectée à tous les processeurs de ''vertex shader''. Encore une fois, ces deux détails vont se retrouver dans les GPU qui vont suivre, avec quelques modifications mineures. ===Les GPU avec des shaders unifiés=== Il est maintenant temps de passer aux processeurs avec des processeurs de shaders unifiés. Depuis DirectX 10, le jeu d'instruction des ''vertex shaders'' et des ''pixels shaders'' a été unifié : il n'y a plus de différences entre les deux. En conséquence, il n'y a plus de distinction entre processeurs de ''vertex shaders'' et de ''pixels shaders'', chaque processeur pouvant traiter indifféremment l'un ou l'autre. L'usage de '''''shaders'' unifiés''' permet d'adapter la répartition entre ''vertex shaders'' et ''pixels shaders'' suivant les besoins de l'application, là où la séparation entre unités de vertex et de pixel ne le permettait pas. [[File:Architecture de base d'une carte 3D - 6.png|centre|vignette|upright=1.5|Carte 3D avec ''pixels'' et ''vertex shaders'' unfifiés.]] Une implémentation simple utilise toujours un rastériseur unique et un ''input assembler''. On retrouve encore une fois une file de pixel, une file de sommets transformées et une file de sommets non-transformés. Et le tout est connecté aux processeurs de shaders. Le rastériseur est connecté en entrée comme en sortie sur tous les processeurs de shaders, l’''input assembler'' envoie des triangles à tous les processeurs de shaders, etc. Pour cela, les deux files de sommets sont connectées à tous les processeurs de ''shader'', et il en est de même pour la file de pixels. Les processeurs de shaders lisent dans ces files pour récupérer du travail à faire. Un premier problème est qu'il faut éviter qu'ils se marchent sur les pieds. Par se marcher sur les pieds, on veut dire que le rastériseur et l’''input assembler'' ne doivent pas envoyer du travail à un même processeur de shader en même temps. Si l'''input assembler'' démarre un ''vertex shader'' sur un processeur de shader, le rastériseur ne peut pas démarrer un ''pixel shader'' dessus. Une solution serait de privilégier la file de pixel sur la files de sommets non-transformés. Les processeurs de shader exécutent donc des pixels shaders en priorité sur les ''vertex shaders''. Un second problème est que l'implémentation demande beaucoup d'interconnexions. Elle marche encore quand on a peu de processeurs de shader, moins d'une trentaine. Mais au-delà, connecter un rastériseur à 30 processeurs de shader devient un véritable défi technique. Les interconnexions sont complexes à câbler, déplacer des données dedans demande beaucoup de courant, ça chauffe, la longueur des fils rend les transferts de données assez lents, la fréquence du GPU en souffre. La seule solution est d'utiliser plusieurs rastériseurs, chacun connecté à un nombre limité de processeurs de shaders. Maintenant, imaginez que le GPU incorpore plusieurs rastériseurs, afin de rastériser plus de triangles et d'améliorer les performances. Le câblage serait encore plus abominable avec des processeurs de shaders unifiés. Du moins, ce serait le cas si on souhaite connecter chaque rastériseur à tous les processeurs de shaders. Mais en réalité, il y a moyen d'utiliser plusieurs rastériseurs intelligemment. L'idée est que chaque rastériseur est connecté à un petit nombre de processeurs de shaders, pas à tous les processeurs. Par exemple, avec 35 processeurs de shaders, on peut avoir 7 rastériseurs, chacun connecté à 5 processeurs de shaders. Les interconnexions sont alors grandement simplifiées. ===Le cas des ROPs=== Nous venons de voir comment le GPU répartit le travail pour ce qui est de la rastérisation et des processeurs de shaders. Mais nous n'avons pas parlé des ROPs. Les ROPs sont techniquement des circuits fixes, qui s'occupent de la gestion du tampon de profondeur, mais aussi de certaines fonctionnalités comme l'''alpha blending''. Un GPU contient plusieurs ROPs, à l'exception de quelques GPU grand public des années 90. Et il faut connecter ces ROPs aux processeurs de shaders. Et là encore, il y a une différence entre les GPU avec des processeurs shaders unifiés et les autres. Avec des processeurs séparés pour les ''vertex shaders'' et les ''pixel shaders'', les ROPs sont connectés aux processeurs de pixels shaders. Pour cela, il y a deux possibilités. Avec la première, chaque ROP est connecté à une unité de pixel, rien d'autre. Elle a été utilisée sur de vielles cartes graphiques, dans les années 90 et avant. La seconde solution utilise des interconnexions complètes, à savoir que chaque ROP est connecté à toutes les unités de pixel. La Geforce 6800 utilisait cette solution, comme le montre le schéma précédent. Le ''fragment crossbar'' entre les processeurs de ''pixel shader'' et les ROPs est un réseau d'interconnexion, qui connecte les 16 processeurs de ''pixel shader'' aux 16 ROPs. [[File:GeForce 6800.png|centre|vignette|upright=3|GeForce 6800]] Avec les shaders unifiés, il faut connecter tous les ROPS à tous les processeurs de shaders. Le réseau d'interconnexion est juste plus complexe, car on ne connecte plus les ROPs seulement aux processeurs de pixel shader, mais à tous les processeurs de shaders. Le nombre d'interconnexion augmente donc. Et de nos jours, le nombre de ROPs et de processeurs de shaders est trop élevé pour que cette solution soit valable. La solution actuellement retenue est la même qu'avec les rastériseurs : on ne relie un ROP qu'à un nombre limité de processeurs de shaders. Et les interconnexions retenues sont les mêmes que celles utilisés pour le rastériseur. Un GPU moderne est organisé en plusieurs ''Graphic Processing Units'' (terminologie NVIDIA), que nous abrégerons en GPC. Ils regroupent chacun : plusieurs processeurs de shaders, un rastériseur et un ROP. Les processeurs de shaders envoient leurs résultats au ROP et au rasteriseur dans le GPC, pas à ceux dans un autre GPC. [[File:Graphic card architecture with unified shaders.png|centre|vignette|upright=2.5|Graphic card architecture with unified shaders]] Le fait de regrouper ainsi un rastériseur avec un ROP s'explique par le fait que les deux sont reliés entre eux. En effet, l'élimination des pixels cachés peut se faire de manière précoce, à savoir juste après la rastérisation. Les deux circuits s'enchainent alors l'un à la suite, ce qui fait qu'il vaut mieux vaut les relier ensemble. ==L'exécution de commandes différentes : graphiques et GPGPU== Les GPU modernes disposent de plusieurs processeurs de commandes, et donc de plusieurs files de commande. Et les chiffres peuvent monter assez haut. Par exemple, les GPU AMD utilisent un processeur de commande graphique, accompagné de plusieurs processeurs de commande dédiés au GPGPU. Les processeurs de commande spécifique au GPGPU étaient appelés des ACE, et il y en avait 8, 16 ou 32 selon l'architecture, le nombre ayant augmenté au cours du temps. Et chacun gérait plusieurs files de commandes séparées ! Par exemple, les GPU AMD d'architecture GCN ont 8 processeurs de commande GPGPU pour 64 files de commandes GPGPU, auxquels il faut ajouter le processeur pour les commandes graphiques en plus ! Les GPU NVIDIA d'architecture Pascal disposent eux de 32 files de commande matérielles, mais dont 31 sont réservées aux GPGPU. [[File:GCN command processing.svg|centre|vignette|upright=2|GCN command processing]] Mais quelle est l'intérêt ? Pour le dire vite : remplir des processeurs de shader inutilisés. Il arrive que des processeurs de shaders soient inutilisés, soit parce que la commande en cours d'exécution n'en a pas besoin. Il est théoriquement possible de les remplir avec des ''threads'' provenant de la commande suivante. Cependant, ce n'est pas toujours possible. Par exemple, il se peut que la commande suivante soit une barrière GPU, qui bloque l'avancée des commandes suivantes. Ou encore, que la file de commande soit vide, car les commandes suivantes ne sont pas encore arrivées. Une solution serait alors de chercher des commandes ailleurs, et de préférence des commandes capables de remplir des processeurs de shader. Mais où les trouver ? ===L'exécution simultanée de plusieurs applications sur le GPU=== La solution la plus simple est assez évidente, quand on se rappelle du chapitre sur les API 3D, et notamment de la section de fin sur le partage du GPU entre plusieurs applications. Un GPU est aujourd'hui sollicité par plusieurs logiciels en même temps : il est possible de lancer un jeu vidéo en fenêtré, pendant que OBS ou un logiciel de ''Streaming'' capture l'écran, avec Firefox et Discord et un programme de ''cloud computing'' de type ''Folding@Home'' qui tournent en arrière-plan. Et toutes ces applications sont accélérées par le GPU. Des situations de ce genre, où on doit partager le GPU entre plusieurs applications, sont assez courantes. Et c'est soit le pilote qui s'en charge, soit le GPU lui-même. * L''''arbitrage logiciel''' est la méthode la plus simple : tout est fait en logiciel. Concrètement, le système d'exploitation et/ou le pilote de la carte graphique se chargent du partage du GPU. Dans les deux cas, tout est fait en logiciel. * L''''arbitrage matériel''' délègue ce partage au GPU. Du moins en partie, car le système d'exploitation détermine quelle application a la priorité. L'avantage est que cela décharge le processeur d'une tâche assez lourde en calcul, pour la déporter sur le GPU. Sans compter que les mécanismes matériels d'arbitrage sont plus efficaces. Sur Windows, avant l'arrivée du modèle de driver dit ''Windows Display Driver Model'', il n'y avait pas d'arbitrage entre les applications. Il y avait une file de commande unique et les commandes étaient exécutées en mode "premier entré, premier sorti". Et ce n'était pas un problème car les seules applications qui utilisaient le GPU étaient des jeux vidéos fonctionnant en mode plein écran. Avec le modèle de driver ''Windows Display Driver Model'' (WDDM), l'arbitrage logiciel est apparu. Depuis 2020, avec l'arrivée de la ''Windows 10 May 2020 update'', Windows supporte l'arbitrage matériel. L'arbitrage matériel est implémenté grâce à la présence de plusieurs processeurs de commandes. L'idée est d'attribuer des priorités à chaque processeurs de commande. Et plus un processeur de commande est prioritaire, plus le GPU lui réserve de processeurs de shaders. Prenons l'exemple avec deux processeurs de commande, et donc deux files de ''thread'', et 16 processeurs de shaders. Si la première file de ''thread'' a la priorité, le GPU lui réserve 14 processeurs de shaders sur 16, contre seulement 2 pour l'autre file. Un point important est qu'en général, une seule application effectue un rendu 3D, typiquement un jeu vidéo en plein écran ou en fenêtré. Les autres applications utilisent plutôt le GPGPU ou des commandes de rendu 2D, qui utilisent uniquement les processeurs de shaders. En conséquence, pas besoin d'avoir plusieurs processeurs de commande généralistes. L'idéal est de n'avoir qu'un seul processeur de commandes graphiques, accompagné de pleins de processeurs de commandes dédiés au GPGPU. Cela permet d'exécuter des commandes graphiques et GPGPU en parallèle. Les priorités étaient autrefois statiques, à savoir que certaines processeurs de commande avaient toujours la priorité sur tous les autres. En théorie, le processeur de commande graphique devrait avoir la priorité sur les autres. Mais il y a des exceptions. Par exemple, sur les cartes graphiques avant l'architecture AMD RDNA 1, c'était l'inverse : les tâches de GPGPU avaient la priorité sur le rendu graphique. Maintenant, les GPU récents ont un système de priorité plus complexe, dynamique, qui choisit les priorité en fonction des besoins. ===L'usage de plusieurs processeurs de commande pour le rendu 3D=== Utiliser plusieurs applications est une première solution pour utiliser plusieurs files de commande. Mais avec un peu d'huile de coude, il est possible d'extraire plusieurs files de commande par application. le rendu 3D permet ce genre de choses, car de nombreux ''draw calls'' sont indépendants. Pour comprendre en quoi traiter plusieurs commandes peut être utile, je vais reprendre l'exemple décris sur cet [https://therealmjp.github.io/posts/breaking-down-barriers-part-3-multiple-command-processors/ article de blog], les liens sur l'ensemble des posts sur le sujet sont à la fin de ce chapitre. En rendu 3D, il est fréquent que des ''draw call'' consécutifs soient dépendants, qu'ils doivent s'exécuter l'un après l'autre, sans recouvrement possible. Un exemple est celui des filtres de post-traitement comme le Bloom ou la profondeur de champ. Ces deux filtres se font en plusieurs étapes, qui se traduisent en plusieurs ''draw call'' consécutifs. Les ''draw calls'' d'un filtre sont dépendants, à savoir que chaque étape lit le résultat de l'étape précédente. Ils sont donc séparés par des barrières GPU, ce qui ruine rapidement les performances. De plus, leurs ''draw calls'' n'utilisent pas tous les processeurs de shaders. Un filtre de bloom basique laisse des processeurs de shaders libre, qui pourraient être utilisés pour exécuter un autre filtre de post-traitement en parallèle, comme un filtre de profondeur de champ. Le problème est que la file de commande est séquentielle par nature. Une solution serait pour le moteur graphique de mélanger les ''draw call'' pour le filtre de bloom et ceux du filtre de profondeur de champ, mais ce serait assez compliqué pour les programmeurs. Une autre solution délègue le problème au matériel et à l'API. L'idée est d'avoir deux files de ''thread'' : une pour le filtre de Bloom, une autre pour le filtre de profondeur de champ. Les processeurs de shaders peuvent prendre des commandes dans les deux files. S'il y a assez de processeurs de shaders de libre, ils peuvent piocher des commandes dans la seconde file de commande. Les deux files accumulent des commandes, séparées par des barrières GPU. Mais les barrières GPU se limitent à l'intérieur d'une file de commande, elles n'ont pas d'impact sur l'autre file de commande. Mais qui dit deux files de commande dit : deux processeurs de commande et files de commandes ! Les deux processeurs de commande alimentent les deux files de ''thread'', en piochant chacun dans une file de commande dédiée. Et la même logique vaut pour N processeurs de commandes : tant qu'il y a autant de files de ''thread'' et de files de commande, la logique fonctionne à l'identique. La seule contrainte est d'alimenter plusieurs files de commande, ce qui est le job du pilote du GPU. De plus, il faut ajouter des ''commandes de synchronisation entre files de commandes'', qui permettent de synchroniser les deux files de commande. La plus simple force à attendre que les deux files de commandes soient vidées avant de démarrer une nouvelle commande. ===Le support dans les API graphiques modernes=== Avant l'apparition des API modernes Vulkan et DirectX 12, l'usage de plusieurs files de commande était peu fréquent. En effet, les applications ne voyaient pas de file de commande, les API graphiques avaient juste des ''draw calls'' et les commandes graphiques étaient envoyées au pilote une par une. C'est ce dernier qui remplissait la file de commande avec des commandes matérielles. En pratique, le pilote pouvait utiliser une file de commande par application, guère plus. Il n'y avait aucun moyen d'utiliser plusieurs files de commande par application. Pire que ça : un moteur graphique ne pouvait pas utiliser plusieurs cœurs. Les API graphiques de l'époque étaient séquentielles par nature, elles exécutaient les ''draw calls'' l'un après l'autre, et il ne pouvait y avoir qu'une seule instance par application. DirectX 11 a bien tenté d'ajouter des mécanismes pour multi-threader les moteurs graphiques, mais ils étaient difficiles à utiliser. Les jeux vidéo de l'époque étaient capables d'utiliser plusieurs cœurs, mais le moteur graphique n'en utilisait qu'un seul. Typiquement, le rendu du son était réalisé sur un cœur CPU, le reste sur un autre. Parfois, on séparait le moteur physique et le moteur graphique sur deux cœurs séparés, mais pas plus. Pour aider les programmeurs, les API modernes Vulkan et DirectX 12, gèrent nativement plusieurs files de commandes, qui sont exposées au programmeur. Ce qui était autrefois le domaine du pilote du GPU a été déporté dans les API graphiques. Les commandes remplacent les ''draw calls'' mais fonctionnent plus ou moins de la même manière. Le programmeur a accès à une fonction pour créer une file de commande, une autre pour ajouter une commande dedans, et une pour envoyer la file de commande au pilote de GPU. Le programmeur peut remplir ces files de commande comme il le souhaite, tant que les commandes dans des files séparées sont indépendantes. Il faut noter que ce sont des files de ''commandes graphiques'', pas des files de ''commande matérielles''. En clair, les files de commandes sont envoyées au pilote du GPU, qui les traduit en commandes matérielles. Et le GPU gère ses propres files de commandes matérielles. Il peut envoyer ses files de commandes séparément dans des processeurs de commande séparés, mais il peut décider d'accumuler toutes les commandes dans une seule file de commande matérielle si le GPU n'a qu'un seul processeur de commande, ou n'utiliser qu'une seule file de commande par application. En théorie, ce système permet de réduire l'usage du processeur. Au lieu d'appeler le pilote de GPU à chaque ''draw call'', il peut accumuler plein de ''draw call'' dans une file de commande et envoyer le tout en une seule fois au pilote. Il est donc possible de lancer un grand nombre de ''draw calls'' sans trop surcharger le CPU. Du moins en théorie, car le problème des ''draw call'' très petits que le GPU exécute trop vite reste présent. Mieux que ça, ce système permet de couper le moteur graphique en plusieurs ''threads'', afin de l'exécuter sur plusieurs cœurs. Par exemple, deux ''threads'' peuvent créer deux files de commandes différentes qui sont exécutées en parallèle (si elles ne sont pas sérialisées par le pilote de GPU). Tout complexifie la tâche du programmeur, vu qu'il doit faire le travail autrefois pris en charge par le pilote de GPU. L'intérêt est que cela permet au programmeur d'optimiser. Il peut utiliser plusieurs processeurs de commande par application, peut exécuter des commandes en parallèle pour remplir tous les processeurs de shaders, etc. Et surtout, il peut insérer des barrières GPU seulement quand elles sont nécessaires. Avec DirectX 11, le pilote de GPU avait tendance à être prudent. Il insérait des barrières GPU très souvent, et n'avait pas moyen de savoir lesquelles étaient réellement nécessaires et celles qui étaient juste inutiles. Il n'avait pas accès aux algorithmes des programmeurs, pour optimiser le tout. Les programmeurs ont la possibilité d'être plus efficaces, du moins s'ils sont assez compétents et qu'on leur laisse le temps. Il faut impérativement que les files puissent exécuter des commandes séparément sans que cela pose problème. Il y a bien des barrières GPU inter-files, mais laissons cela de côté. Toujours est-il que les files de commandes en question accumulent des commandes graphiques, pas des commandes matérielles. Mais le pilote de la carte graphique reçoit ces files de commande graphique et les accumule dans ses propres files de commandes matérielles. Avec DirectX 12, trois types différents de files de commande sont nativement supportés : GRAPHIC, COMPUTE et COPY. COPY correspond aux transferts DMA ou à des copies de données en VRAM, COMPUTE mémorise des commandes GPGPU, GRAPHIC est une file de commande de rendu 2D/3D. Du moins, c'est l'explication simplifiée. Car en réalité, les commandes GPGPU sont capables de faire tout ce que COPY permet, et les commandes GRAPHIC supportent tout ce que les commandes COMPUTE supportent. Les relations entre les trois sont inclusives : COPY est inclus dans COMPUTE, qui est lui-même inclus dans GRAPHIC. Les applications envoient des files de commande COPY, COMPUTE et GRAPHIC au pilote de GPU, qui décide quoi en faire. Si le GPU le supporte, il envoie les commandes GRAPHIC au processeur de commandé généraliste, les commandes COMPUTE à ceux dédiés au GPGPU, les commandes COPY au contrôleur DMA. Mais il peut aussi envoyer transformer des commandes COMPUTE en commandes GRAPHICS ou des commandes CPY en COMPUTE ou GRAPHIC, si le besoin s'en fait sentir. Si le GPU n'a qu'un seul processeur de commande, les commandes sont simplement remises en série et envoyées au seul processeur de commande. C'est le cas sur les GPU Intel intégrés : ils ont un simple processeur de commande qui fait tout. Ils ne gèrent pas les transferts DMA, car ils sont reliés à la RAM système (mémoire unifiée). Vulkan utilise un système différent. Vulkan permet de demander à la carte graphique combien elle a de processeurs de commande et quelles commandes ils supportent. Si un GPU n'a qu'un seul processeur de commande, Vulkan n'en verra qu'un et le code devra être adapté pour. En clair, la gestion des processeurs de commande est totalement délégué au programmeur. Il n'y a pas d'abstraction comme avec DirectX 12, mais une gestion fine du matériel. <noinclude> Pour compléter la lecture de ce chapitre, vous pouvez lire les 6 articles de blog suivants : * [https://therealmjp.github.io/posts/breaking-down-barriers-part-1-whats-a-barrier/ What's a barrier]. * [https://therealmjp.github.io/posts/breaking-down-barriers-part-2-synchronizing-gpu-threads/ Synchronizing GPU Threads]. * [https://therealmjp.github.io/posts/breaking-down-barriers-part-3-multiple-command-processors/ Multiple Command Processorsr]. * [https://therealmjp.github.io/posts/breaking-down-barriers-part-4-gpu-preemption/ GPU Preemption]. * [https://therealmjp.github.io/posts/breaking-down-barriers-part-5-back-to-the-real-world/ Back To The Real World]. * [https://therealmjp.github.io/posts/breaking-down-barriers-part-6-experimenting-with-overlap-and-preemption/ Experimenting With Overlap and Preemption]. </noinclude> <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le processeur de commandes | prevText=Le processeur de commandes | next=Le pipeline géométrique : évolution | nextText=Le pipeline géométrique : évolution }}{{autocat}} </noinclude> jggr1j54qpwmx6wmkb71hivc4gz9ram Discussion catégorie:Philosophie 15 79400 765006 691904 2026-04-25T08:13:20Z PandaMystique 119061 Page blanchie 765006 wikitext text/x-wiki phoiac9h4m842xq45sp7s6u21eteeq1 Les cartes graphiques/La mémoire unifiée et la mémoire vidéo dédiée 0 80571 764885 762754 2026-04-24T17:56:37Z Mewtow 31375 /* Le contrôleur DMA et l'IO-MMU des GPU dédiés */ 764885 wikitext text/x-wiki Pour rappel, il existe deux types de cartes graphiques : les cartes dédiées et les cartes intégrées. Les '''cartes graphiques dédiées''' sont des cartes graphiques branchées sur des connecteurs/ports de la carte mère. A l'opposé, tous les processeurs modernes intègrent une carte graphique, appelée '''carte graphique intégrée''', ou encore '''IGP''' (''Integrated Graphic Processor''). En somme, les cartes dédiées sont opposées à celles intégrées dans les processeurs modernes. Les cartes graphiques dédiées ont de la mémoire vidéo intégrée à la carte graphique, sauf pour quelques exceptions dont on parlera plus tard. Par contre, les IGP n'ont pas de mémoire vidéo dédiée, vu qu'on ne peut pas intégrer beaucoup de mémoire dans un processeur. Et cela permet de classer les cartes graphiques en deux types : * Les cartes graphiques à '''mémoire vidéo dédiée''', à savoir que la carte graphique dispose de sa propre mémoire rien qu'à elle, séparée de la mémoire RAM de l'ordinateur. On fait alors la distinction entre ''RAM système'' et ''RAM vidéo''. * Les cartes graphiques à '''mémoire unifiée''', où la mémoire RAM est partagée entre le processeur et la carte graphique. Le terme "unifiée" sous-entend que l'on a unifié la mémoire vidéo et la mémoire système (la RAM). [[File:Répartition de la mémoire entre RAM système et carte graphique.png|centre|vignette|upright=2.5|Répartition de la mémoire entre RAM système et carte graphique]] La distinction "mémoire dédiée versus unifiée" correspond de très près à la distinction "GPU dédié versus IGP". Dans la grosse majorité des cas, les cartes vidéos dédiées ont une mémoire dédiée, alors que les IGP utilisent la mémoire unifiée. Mais il existe de rares exceptions où une carte vidéo dédiée utilise la mémoire unifiée. Par exemple, la toute première carte graphique AGP, l'Intel 740, ne possédait pas de mémoire vidéo proprement dite, juste un simple ''framebuffer''. Tout le reste, texture comme géométrie, était placé en mémoire système ! Les performances étaient ridicules, mais les cartes étaient peu chères du fait de l’absence de VRAM, ce qui explique que l'Intel 740 a eu un petit succès sur les ordinateurs d'entrée de gamme. Une autre exception est celle des GPU soudés sur la carte mère, utilisées sur certaines consoles de jeu, ainsi que certains PC portables puissants destinés aux ''gamers''. Pour ces dernières, il est possible d'utiliser aussi bien de la mémoire dédiée que de la mémoire unifiée. Si la plupart des consoles récents utilisent de la VRAM dédiées, d'anciennes consoles de jeu avec un GPU soudé utilisaient une mémoire unifiée, comme la Nintendo 64, pour ne citer qu'elle. {|class="wikitable" |- ! ! Mémoire unifiée ! Mémoire dédiée |- ! GPU dédié | Quelques rares GPU d'entrée de gamme || Tous les GPU, sauf de rares exceptions |- ! GPU intégré | Systématique || |- ! GPU soudé | Anciennes consoles de jeu || Ordinateurs portables modernes |} ==La mémoire vidéo dédiée== La mémoire dédiée est nécessaire pour stocker l'image à afficher à l'écran, mais aussi pour mémoriser temporairement des informations importantes. Dans le cas le plus simple, elle sert simplement de ''Framebuffer'' : elle stocke l'image à afficher à l'écran. Au fil du temps, elle s'est vu ajouter d'autres fonctions, comme stocker les textures et les sommets de l'image à calculer, ainsi que divers résultats temporaires. : Dans ce qui suit, la mémoire vidéo des cartes graphiques dédiées sera appelée la VRAM. ===Les mémoires GDDR et autres VRAM=== La VRAM ressemble aux barrettes de RAM qu'on trouve dans nos PC, à quelques différences près. Le point le plus important est qu'elle n'est pas présente sous la forme de barrettes de mémoire. À la place, les puces de mémoire sont soudées sur la carte graphique, sur son PCB vert. La conséquence est que l'on ne peut pas upgrader la VRAM d'une carte vidéo. Le fait que la VRAM est soudée simplifie la conception de la carte graphique, mais a aussi des avantages au niveau électrique et donc en termes de performance. Les cartes graphiques des années 90-2000, utilisaient la même mémoire que celle des barrettes de RAM, à savoir des DRAM de type FPM, EDO, ou SDRAM (''Synchronous DRAM''). De nos jours, les barrettes de RAM utilisent de la mémoire dite DDR (''Double Data Rate''), alors que les VRAM sont des RAM dites GDDR (''Graphic Double Data Rate''). Les deux se ressemblent beaucoup, mais il y a de petites différences techniques qui sont trop complexes pour être expliquées ici. : Quelques cartes graphiques ont utilisé de la mémoire non-DDR, comme les GPU ''Laguna'' de ''Cirrus Logic'', qui utilisaient de la RDRAM de feu Rambus, une mémoire RAM qui a utilisée comme RAM système sur certains PC et sur la Nintendo 64. Citons aussi les cartes graphiques ''Matrox Millennium'' et ''ATI 3D Rage Pro'', qui utilisaient de la ''Window DRAM'' (WRAM). Idem avec Niveau performance, la GDDR se distingue de la DDR simple par une bande passante élevée, proche de la centaine de gigaoctets par secondes sur les GPU modernes. Mais il y a une contrepartie : un temps d'accès très long, de plusieurs centaines de cycles d'horloge. Concrètement, si je veux lire une texture, entre le moment où j'envoie une demande de lecture à la mémoire vidéo, et le moment celle-ci me renvoie les premiers texels, il va se passer entre 200 à 1000 cycles d'horloge GPU. Par contre, une fois les premiers texels reçus, les texels suivants sont disponibles au cycle suivant, et ainsi de suite. En clair, les données lues mettent du temps avant d'arriver, mais elles arrivent par gros paquets. Les GPU récents sont des monstres de bande passante et ce n'est pas qu'à cause de la GDDR. Une puce mémoire de DDR/GDDR peut lire/écrire 64 bits par cycle d'horloge. Mais les GPU connectent la GDDR de manière à additionner la bande passante de plusieurs puces. Cela implique que chaque puce de RAM a sa propre connexion au GPU, ce qui permet d’accéder à plusieurs puces en parallèle, en même temps. Les GPU actuels sont capables de lire/écrire 192, 256, 384, voire 512 bits par cycle d'horloge. Les techniques de ''dual channel'' permettent de faire la même chose avec la RAM système, mais n’atteignent que 128 bits par cycle - 192/256 bits avec des techniques de ''triple/quad channel''. En clair, le bus mémoire de la GDDR permet de lire/écrire plus de données par cycle d'horloge qu'une RAM système, de 2 à 8 fois plus. [[File:Puces mémories d'un GPU et d'une barrette de mémoire.png|centre|vignette|upright=2|Puces mémoires d'un GPU et d'une barrette de mémoire.]] La différence entre débit et temps d'accès est primordiale sur les GPU modernes comme anciens. Toute l'architecture de la carte graphique est conçue de manière à prendre en compte ce temps d'attente. Les techniques employées sont multiples, et ne sont pas inconnues à ceux qui ont déjà lu un cours d'architecture des ordinateurs : mémoire caches, hiérarchie de caches, ''multithreading'' matériel au niveau du processeur, optimisations des accès mémoire comme des ''Load-Store Queues'' larges, des ''coalesing write buffers'', etc. Mais toutes ces techniques sont techniquement incorporées dans les processeurs de ''shaders'' et dans les circuits fixes. Aussi nous ne pouvons pas en parler dans ce chapitre. À une exception près : l'usage de caches et de ''local stores''. ===Les transferts ''Direct Memory Access''=== Pour échanger des données entre la RAM et la mémoire vidéo, les GPU utilisent la technologie ''Direct Memory Access'', aussi appelée DMA. Elle permet à un périphérique de lire/écrire un bloc de mémoire RAM, sans intervention du processeur, par l'intermédiaire du bus PCI Express. Pour cela, le GPU intègre un circuit dédié à la gestion des transferts DMA, appelé le '''contrôleur DMA''', qui lit des données en RAM système pour les copier en RAM vidéo (ou inversement, mais c'est plus rare). Précisément, le contrôleur DMA copie un bloc de mémoire, de données consécutives en mémoire, par exemple un bloc de 128 mégaoctets, un bloc de 64 kiloctets, ou autre. Le processeur configure le contrôleur DMA en lui indiquant l'adresse de départ du bloc de mémoire, sa taille, et quelques informations annexes. Le contrôleur DMA lit alors les données une par une, et les écrit dans la mémoire vidéo. ===La mémoire vidéo est mappée dans l'espace d'adressage du CPU=== Les GPU doivent souvent échanger des données avec le processeur. Des données doivent être copiées de la mémoire RAM vers la VRAM. De plus, le CPU peut aussi adresser directement la VRAM. Pour cela, une partie de l'espace d'adressage peut être détourné pour communiquer avec les périphériques, grâce à la technique des '''entrées-sorties mappées en mémoire'''. Et c'est ce qui est fait pour le GPU : une partie des adresses est détournée vers le GPU. Typiquement un bloc d'adresse de la même taille que la mémoire vidéo est détournée : elles n'adressent plus de la RAM, mais la directement la mémoire vidéo de la carte graphique. En clair, le processeur voit la mémoire vidéo et peut lire ou écrire dedans directement. [[File:Espace d'adressage classique avec entrées-sorties mappées en mémoire.png|centre|vignette|upright=2|Espace d'adressage classique avec entrées-sorties mappées en mémoire]] Intuitivement, on se dit que toute la mémoire vidéo est visible par le CPU, mais le bus PCI, AGP ou PCI Express ont leur mot à dire. Le bus PCI permettait au CPU d'adresser une fenêtre de 256 mégaoctets de VRAM maximum, en raison d’une sombre histoire de configuration des ''Base Address Registers'' (BARs). Les registres BAR étaient utilisés pour gérer les transferts DMA, mais aussi pour l'adressage direct. Le PCI Express était aussi dans ce cas avant 2008. La gestion de la mémoire vidéo était alors difficile, mais on pouvait adresser plus de 256 mégaoctets, en déplaçant la fenêtre de 256 mégaoctets dans la mémoire vidéo. Après 2008, la spécification du PCI-Express ajouta un support de la technologie ''resizable bar'', qui permet au processeur d’accéder directement à plus de 256 mégaoctets de mémoire vidéo, voire à la totalité de la mémoire vidéo. ==La mémoire unifiée== Avec la mémoire unifiée, une partie de la RAM système est détournée pour servir de mémoire vidéo. La quantité d'adresses détournées est généralement réglable avec un réglage dans le BIOS. On peut ainsi choisir d'allouer 64, 128 ou 256 mégaoctets de mémoire système pour la carte vidéo, sur un ordinateur avec 4 gigaoctets de RAM. Les GPU modernes sont plus souples et fournissent deux réglages : une quantité de RAM vidéo minimale et une quantité de RAM maximale que le GPU ne peut pas dépasser. Par exemple, il est possible de régler le GPU de manière à ce qu'il ait 64 mégaoctets rien que pour lui, mais qu'il puisse avoir accès à maximum 1 gigaoctet s'il en a besoin. Cela fait au total 960 mégaoctets (1024-64) qui peut être alloués au choix à la carte graphique ou au reste des programmes en cours d’exécution, selon les besoins. [[File:Partage de la mémoire unifiée entre CPU et GPU.png|centre|vignette|upright=2|Répartition de la mémoire entre RAM système et carte graphique]] ===Les GPU dédiés avec mémoire unifiée=== Il existe des cartes dédiées qui utilisent pourtant la mémoire unifiée, par exemple l'Intel 740. Pour lire en mémoire RAM, elles doivent passer par l'intermédiaire du bus AGP, PCI ou PCI-Express. Et ce bus est très lent, bien plus que ne le serait une mémoire vidéo normale. Aussi, les performances sont exécrables. J'insiste sur le fait que l'on parle des cartes graphiques dédiées, mais pas des cartes graphiques soudées des consoles de jeu. D'ailleurs, de telles cartes dédiées incorporent un ''framebuffer'' directement dans la carte graphique. Il n'y a pas le choix, le VDC de la carte graphique doit accéder à une mémoire suffisamment rapide pour alimenter l'écran. Ils ne peuvent pas prendre le risque d'aller lire la RAM, dont le temps de latence est élevé, et qui peut potentiellement être réservée par le processeur pendant l’affichage d'une image à l'écran. ===Les GPU intégrés=== Les GPU intégrés ou soudés passent par le bus AGP ou PCI Express pour lire des données en RAM système. Mais leur accès à la RAM passe par les mêmes voies que le CPU. Les GPU et le processeur sont reliés à la RAM par un bus dédié appelé le '''bus mémoire'''. Il existe même sans GPU intégré : tous les processeurs sont reliés à la RAM par un tel bus. Si le CPU intègre un IGPU, il greffe l'IGPU sur ce bus mémoire existant. Un défaut de cette approche est que le débit du bus système est partagé entre le GPU et le processeur. En clair, si le bus mémoire peut transférer 20 gigas de données par secondes, il faudra partager ces 20 gigas/seconde entre CPU et GPU. Par exemple, le CPU aura droit à 15 gigas par secondes, le GPU seulement 5 gigas. Divers circuits d'arbitrage s'occupent de répartir équitablement le bus système, selon les besoins, mais ça reste un compromis imparfait. [[File:Echanges de données entre CPU et GPU avec une mémoire unifiée.png|centre|vignette|upright=2|Connexion du bus mémoire au CPU et à un GPU soudé sur la carte mère.]] N'allez cependant pas croire que les GPU intégrés n'ont que des désavantages. Ils disposent d'un avantage bien spécifique : la '''''zero-overhead copy''''', terme barbare mais qui cache une réalité très simple. Avec une mémoire dédiée, le processeur doit copier des données de la RAM système dans la RAM vidéo. Les copies en question se font souvent avant de démarrer le rendu 3D, par exemple lors du chargement d'un niveau dans un jeu vidéo. Elles peuvent aussi se faire lors du rendu, bien que ce soit plus rare. Et ces copies ont un cout en performance. Par contre, avec la mémoire unifié, pas besoin de faire de copie d'une mémoire à l'autre. Le processeur envoie juste une commande du GPU, qui indique l'adresse des données en RAM, leur position dans la RAM. Le processeur et le GPU intègrent des mémoires caches, afin de réduire l'usage du bus mémoire. Et l'intégration des caches avec un GPU intégré est assez intéressante. Le CPU et l'IGPU peuvent partager certains caches. Par exemple, les processeurs Skylake et Sandy Bridge d'Intel, le CPU et GPU avaient leurs propres caches L2 et L1, mais ils partageaient le cache L3. En général, le partage ne touche que le cache de dernier niveau, le cache le plus gros et le plus proche de la mémoire, à savoir le cache L3 ou L4. Sur les processeurs modernes, le CPU et le GPU ont leur propre cache L3/L4, afin avoir des caches plus spécialisés. Les caches L3/L4 sont plus gros pour le processeur que pour le GPU, ils vont à des fréquences différentes, sont alimentés par des tensions différentes, etc. De plus, le cache du CPU est optimisé pour un temps d'accès faible, alors que celui du GPU est optimisé pour un fort débit mémoire. Utiliser des caches séparés entraine des problèmes de cohérence des caches, qui ont été vus dans le chapitre sur les caches des processeurs de shaders. [[File:Caches sur un iGPU.png|centre|vignette|upright=2.5|Caches sur un iGPU]] ===Les GPU des consoles=== Les consoles de jeu utilisent souvent la mémoire unifiée, même les consoles récentes. Pour les consoles de salon, les consoles Nintendo ont été les pionnières de la mémoire unifiée, XBOX l'a adopté dès le début, et les Playstation ont été les dernières à l'utiliser. * Pour les consoles de 5ème génération, Nintendo 64 utilisait déjà la mémoire unifiée, alors que les autres consoles de l'époque faisaient avec une mémoire vidéo dédiée. * Pour la 6ème génération, la Gamecube et la Xbox utilisaient la mémoire unifiée, pas la Playstation 2. A partir de la génération suivante, la mémoire unifiée est devenue la solution dominante. * Pour la 7ème génération, seule la Playstation 3 n'utilisait pas la mémoire unifiée, mais XBOX et la Wii le faisait. * A partir de la 8ème génération, toutes les consoles utilisent la mémoire unifiée. Il faut noter que la mémoire utilisée sur ces consoles est une mémoire GDDR, soit le type de mémoire utilisé pour les mémoires vidéo dédiées ! Ce ne sont pas des mémoires DDR normales, optimisées pour fonctionner avec des CPU. Faire ainsi pose plus de problèmes pour le CPU que le GPU, mais ce n'est pas un problème sur une console. Les jeux vidéos sont plus gourmands pour le GFPU que pour le CPU, ce qui fait qu'il vaut mieux privilégier le GPU niveau performance. Ainsi, il vaut mieux utiliser de la mémoire GDDR, qui a une meilleure bande passante et des latences pas terribles. Le GPU sera donc avec une mémoire adaptée, quitte à détériorer les performances du CPU qui préfère les faibles latences. Les GPU des consoles doivent s'adapter à cette mémoire unifiée, histoire de conserver de bonnes performances. Les limitations de bande passante se manifestent les GPU des consoles sont adaptés pour limiter la casse. Aussi, les GPU des consoles ne sont pas exactement les mêmes que ceux des PC, et qu'il existe des toutes petites différences. Par exemple, le GPU de la XBOX est une Geforce 3 légèrement modifiée, en partie pour s'adapter à la mémoire unifiée. Une adaptation possible est simplement d'ajouter des mémoires caches, ou d'agrandir les mémoires caches existantes. Par exemple, il est possible de doubler le cache de textures ou le cache de sommets. Les GPU des consoles ne s'en sont pas privé, leurs caches sont généralement plus importants que les GPU dédiés équivalents. Une seconde adaptation a été utilisée sur la Xbox 360, la Xbox One, la Gamecube, la Wii, la WiiU. L'idée était d'utiliser une mémoire dédiée pour le ''framebuffer'' et le tampon de profondeur (ainsi que le tampon de stencil, que nous n'avons pas encore abordé). Mettre à jour le ''framebuffer'' pendant le rendu est responsable d'une grande quantité d'accès mémoire, et c'est encore pire pour le tampon de profondeur. Si on met les deux dans une mémoire dédiée, on économise beaucoup de bande passante. : Vous aurez peut-être fait le rapprochement avec les GPU à rendu en ''tile'', qui suivent une logique similaire, sauf qu'ils rendent l'image finale morceau par morceau. Ici, pas de système de ''tile''. Les GPU de ce type ont bien une SRAM, mais elle est plus petite et mémorise juste une ''tile'' de petite taille, qui correspond à un morceau de l'image finale, idem pour le ''frambuffer''. La Xbox 360 utilisait une mémoire EDRAM de 10 Mégaoctets, la Xbox One utilisait 32 mégaoctets de mémoire ESRAM. La Gamecube et la Wii utilisaient 3 mégaoctets de mémoire EDRAM, la WiiU utilisait 32 mégaoctets d'EDRAM. Et mine de rien, ce n'est pas beaucoup. Une image en résolution 1920 par 1080 utilise déjà 8 mégaoctets, ce qui rentre tout juste dans l'EDRAM de la Xbox 360, à condition de ne pas utiliser d'antialiasing. Pour des résolutions usuelles à l'époque, comme le 1280 par 720, ca ne rentre pas si on utilise de l'antialiasing. Et c'est sans doute pour cette raison que la technique a été abandonnée par la suite. La mémoire RAM nécessaire pour que la technique fonctionne demanderait une mémoire plus grosse, qui utiliserait plus de transistors. Et ce budget en transistor peut être utilisé pour autre chose, ce qui améliorerait les performances. A quoi bon placer une EDRAM dédiée aux ''render target'', alors qu'on peut avoir du cache en remplacement qui améliorera les performances générales ? Pas étonnant que les GPU modernes préfèrent utiliser des GDDR avec une bande passante énorme, ainsi que des mémoires caches de très grande capacité. ==La mémoire virtuelle des GPUs== Pour commencer, parlons d'un point important, à savoir l'espace d'adressage du GPU. L''''espace d'adressage''' d'un processeur est l'ensemble des adresses utilisables par le processeur. Par exemple, un processeur 16 bits peut adresser 2^16 = 65536 adresses, l'ensemble de ces adresses forme son espace d'adressage. L'espace d'adressage n'est pas toujours égal à la mémoire réellement installée. S'il n'y a pas assez de RAM installée, des adresses seront inoccupées. L'espace d'adressage du CPU est quelque peu particulier. Depuis les années 80-90, les logiciels n'adressent pas la mémoire RAM directement. Tous les processeurs gèrent un système de mémoire virtuelle, qui donne l'illusion aux programmes d'avoir accès à toute la mémoire adressable, tout l'espace d'adressage. Par exemple, sur les systèmes 32 bits, chaque programme a accès à tout l'espace d'adressage de 4 gigaoctets, et il ne voit pas les autres programmes dedans. C'est une illusion qui a de nombreux avantages : les programmes sont isolés les uns des autres, un programme ne peut pas lire dans la mémoire d'un autre, les programmes n'ont pas à se soucier de la quantité de RAM installée dans l'ordinateur, etc. Par contre, cela implique que les adresses manipulées par les programmes sont des adresses fictives, qui doivent être traduites en adresses physiques. Les données situées à une adresse dans l'espace d'adressage ne sont pas à la même adresse en RAM. On fait ainsi la distinction entre adresse physique et logique : les adresses logiques sont les fausses adresses, les adresses physiques sont les vraies adresses en RAM. Rien de tout cela ne devrait vous surprendre si vous avez déjà lu un cours d'architecture des ordinateurs. Maintenant, passons à quelque chose auquel vous n'avez peut-être pas pensé : qu'en est-il du GPU ? La réponse est que non seulement cela dépend de si le GPU est dédié ou intégré, mais que cela dépend aussi de si le GPU est ancien ou non. Les anciens GPU ne géraient pas la mémoire virtuelle, les nouveaux ont leur propre système de mémoire virtuelle séparé du CPU ! ===L'abstraction mémoire des GPU=== Cependant, cela pose un léger problème : la communication avec les programmes et les API graphiques est perturbée. Le pilote de périphérique reçoit des adresses virtuelles de la part des applications, mais il doit gérer la mémoire vidéo en utilisant des adresses physiques. Et cela posait de nombreux problèmes pour les pilotes de GPU. Le cas le plus facile à expliquer est celui des GPU dédiés. Le pilote de GPU alimente la mémoire vidéo avec des transferts DMA et le contrôleur DMA doit être configuré avec des adresses physiques pour faire son travail. Or, les API 3D leur donnaient des adresses virtuelles, pour localiser les textures, ''mesh'', shaders compilés et autres. Et c'est à eux et au système d'exploitation de traduire ces adresses en adresses physiques. Des cas similaires apparaissent sur des GPU intégrés. Sous Windows, du temps de l'ancien ''Windows Display Driver Model'' (WDDM), c'était le système d’exploitation qui gérait cela. Le WDDM déportait une partie de la gestion du GPU dans le noyau de l'OS, dont la gestion de la mémoire vidéo, vu que seul lui pouvait faire la traduction d'adresse (il a accès au tables des pages). Le pilote de GPU envoyait les commandes matérielles au noyau de l'OS, qui les patchait, en remplaçant les adresses virtuelles par des adresses physiques. Le pilote envoyait alors les commandes traduites au GPU. Avec le WDDM 2.0, les GPU supportent maintenant la mémoire virtuelle. Cependant, il faut noter que les GPU utilisent une mémoire virtuelle séparée de celle du CPU. Le processeur et le GPU ont deux espaces d'adressage différents. Concrètement, une adresse virtuelle n'adresse pas la même adresse physique selon qu'elle est utilisée par le GPU. De même, la même adresse physique correspondra à des adresses virtuelles différentes entre CPU et GPU. Aussi, on parle de '''mémoire virtuelle GPU''' pour la distinguer de la mémoire virtuelle du processeur. [[File:Desktop computer bus bandwidths.svg|centre|vignette|upright=2|Séparation de la mémoire virtuelle du CPU et du GPU.]] Même si la mémoire virtuelle du GPU n'est pas celle du CPU, cela simplifie grandement la gestion de la mémoire vidéo. Le pilote de GPU peut travailler directement avec des adresses virtuelles du GPU, et gérer la mémoire vidéo de lui-même, dans avoir à déléguer une partie du travail au noyau de l'OS. Plus besoin de traduire les adresses en adresses physiques, c'est le GPU qui s'en charge de lui-même ! D'ailleurs, cet avantage fait que la mémoire virtuelle GPU est aussi utilisée avec des GPU intégré, qui n'ont pas besoin de faire de copies entre RAM système et RAM vidéo. [[File:Integrated graphics with distinct memory allocation.svg|centre|vignette|upright=2|Séparation de la mémoire virtuelle CPU et GPU, avec un GPU intégré.]] Pour gérer la mémoire virtuelle, les GPU intègrent un circuit appelé la '''''Graphics address remapping table''''', abrévié en GART. La GART est techniquement une une ''Memory Management Unit'' (MMU), à savoir un circuit spécialisé qui s'occupe de traduire les adresses virtuelles en adresses physiques, elle prend en charge la mémoire virtuelle. La dite MMU étant intégrée dans un périphérique d'entrée-sortie (IO), ici la carte graphique, elle est appelée une IO-MMU (''Input Output-MMU''). Toutes les cartes graphiques utilisant les bus AGP ou PCI-Express intégrent une GART/IO-MMU. La GART est configurée par le pilote de GPU, afin de gérer la mémoire virtuelle au mieux. Et cela explique que la mémoire virtuelle du GPU et du CPU soient séparées. Le pilote de GPU coopére avec le système d'exploitation pour configurer la GART, mais cette coopération ne peut pas être parfaite. On ne peut pas permettre au pilote de GPU d'avoir accès à la table des pages ou d'autres structures impliquées dans la traduction d'adresse : le risque de sécurité est trop grand. Avoir deux mémoires virtuelles séparées aide grandement le travail du pilote de GPU. Cependant, quelques technologies permette au CPU et au GPU d'utiliser le même espace d'adressage, de fusionner la mémoire virtuelle du CPU et du GPU. Par exemple, la technologie ''Heterogeneous System Architecture'' permet cela, entre autres fonctionnalités. Elles permettent de synchroniser la MMU du processeur et l'IO-MMU du GPU. {| |[[File:HSA-enabled virtual memory with distinct graphics card.svg|vignette|upright=2|HSA-enabled virtual memory with distinct graphics card]] |[[File:HSA-enabled integrated graphics.svg|vignette|upright=2|HSA-enabled integrated graphics]] |} ===La mémoire virtuelle des GPU dédiés=== Pour rappel, la mémoire virtuelle permet à un CPU d'utiliser plus de RAM qu'il n'y en a d'installée dans l'ordinateur. Par exemple, elle permet au CPU de gérer 4 gigas de RAM sur un ordinateur qui n'en contient que trois, le gigaoctet de trop étant en réalité simulé par un fichier sur le disque dur. La technique est utilisée par tous les processeurs modernes. La mémoire virtuelle des GPUs dédiés fait la même chose, sauf que le surplus d'adresses n'est pas stockés sur le disque dur dans un fichier pagefile, mais est dans la RAM système. Pour le dire autrement, ces cartes dédiées peuvent utiliser la mémoire système si jamais la mémoire vidéo est pleine. Cela permet au GPU d'adresser plus de RAM qu'en a la mémoire vidéo. Par exemple, si la carte vidéo a 2 giga-octets de RAM, la carte graphique peut être capable d'en adresser 8 : 2 gigas en RAM vidéo, et 6 autres gigas en RAM système. Le GPU peut lire directement des données en RAM, sans forcément les copier en mémoire vidéo. [[File:Mémoire virtuelle des cartes graphiques dédiées.png|centre|vignette|upright=2|Mémoire virtuelle des cartes graphiques dédiées]] La technologie s'est démocratisée avec le bus AGP, dont la fonctionnalité dite d'''AGP texturing'' permettait de lire ou écrire directement dans la mémoire RAM, sans passer par le processeur. D'ailleurs, la carte graphique Intel i740 n'avait pas de mémoire vidéo et se débrouillait uniquement avec la mémoire système. C'est l'AGP qui a introduit le GART, la fameuse IO-MMU mentionnée plus haut. L'arrivée du bus PCI-Express ne changea pas la donne, si ce n'est que le bus était plus rapide, ce qui améliorait les performances. Au début, seules les cartes graphiques PCI-Express d'entrée de gamme pouvaient accéder à certaines portions de la mémoire RAM grâce à des technologies adaptées, comme le TurboCache de NVIDIA ou l'HyperMemory d'AMD. Mais la technologie s'est aujourd'hui étendue. De nos jours, toutes les cartes vidéos modernes utilisent la RAM système en plus de la mémoire vidéo, mais seulement en dernier recours, soit quand la mémoire vidéo est quasiment pleine, soit pour faciliter les échanges de données avec le processeur. C'est typiquement le pilote de la carte graphique qui décide ce qui va dans la mémoire vidéo et la mémoire système, et il fait au mieux de manière à avoir les performances optimales. ===Les GPU utilisent la pagination=== Le GPU utilise la technique dite de la pagination, à savoir que la RAM système et la RAM du GPU sont découpées en pages de taille fixe, généralement 4 kilo-octets. Un GPU dédié échange des pages entre RAM système et mémoire vidéo. Lors d'un transfert DMA, la page en RAM système est copiée en mémoire vidéo. S'il n'y a pas assez de place en mémoire vidéo, le GPU rapatrie une page de mémoire vidéo vers la RAM système. La page rapatriée en RAM système est choisie par un algorithme spécialisé. Un GPU intégré n'a pas besoin de copie, il lit directement la page voulue en RAM système. La traduction des adresses virtuelles en adresses physique se fait au niveau de la page. Une adresse est coupée en deux parts : un numéro de page, et la position de la donnée dans la page. La position dans la page ne change pas lors de la traduction d'adresse, mais le numéro de page est lui traduit. Le numéro de page virtuel est remplacé par un numéro de page physique lors de la traduction. Pour remplacer le numéro de page virtuel en numéro physique, il faut utiliser une table de translation, appelée la '''table des pages''', qui associe un numéro de page logique à un numéro de page physique. Le système d'exploitation dispose de sa table des pages, qui n'est pas accesible au GPU. Par contre, le GPU dispose d'une sorte de mini-table des pages, qui contient les associations page virtuelle-physique utiles pour traiter les commandes GPU, et rien d'autre. En clair, une sorte de sous-ensemble de la table des pages de l'OS, mais spécifique au GPU. La mini-table des pages est gérée par le pilote de périphérique, qui remplit la mini-table des pages. La mini-table des pages est mémorisée dans une mémoire intégrée au GPU, et précisément dans la MMU. ===Le contrôleur DMA et l'IO-MMU des GPU dédiés=== Sur les GPU dédiés, le contrôleur DMA est souvent fusionné avec l'IO-MMU. En effet, il s'occupe de la copie des pages entre mémoire vidéo et RAM système. Le contrôleur DMA reçoit des adresses provenant du pilote de périphérique, qui sont des adresses virtuelles. Mais vu qu'il accède à la RAM système, il doit faire la traduction entre adresses virtuelles qu'il reçoit et adresses physiques qu'il émet, ce qui implique qu'il sert d'IO-MMU. Même si la mémoire virtuelle GPU a été intégrée dans Windows assez tard, du temps de l'AGP et du PCI-Express, la technologie existait vraisemblablement sur certaines cartes graphiques au format PCI, même la documentation est assez rare. Seule certitude : la carte graphique NV1 de NVIDIA, leur toute première carte graphique, disposait d'un contrôleur DMA avec une IO-MMU intégrée. Le fonctionnement de cette IOMMU est décrite dans le brevet "US5758182A : DMA controller translates virtual I/O device address received directly from application program command to physical i/o device address of I/O device on device bus", des inventeurs David S. H. Rosenthal et Curtis Priem. [[File:Microarchitecture du GPU NV1 de NVIDIA.png|centre|vignette|upright=2|Microarchitecture du GPU NV1 de NVIDIA]] <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les caches d'un processeur de shader | prevText=Les caches d'un processeur de shader | next=Le rendu d'une scène 3D : l'API graphique | netxText=Le rendu d'une scène 3D : l'API graphique }}{{autocat}} </noinclude> 0d8mj0rfqzui9de7mujw7nmepqyo6yu Les cartes graphiques/Le support matériel du lancer de rayons 0 80578 764876 763816 2026-04-24T17:52:54Z Mewtow 31375 /* Le raytracing récursif */ 764876 wikitext text/x-wiki Les cartes graphiques actuelles utilisent la technique de la rastérisation, qui a été décrite en détail dans le chapitre sur les cartes accélératrices 3D. Mais nous avions dit qu'il existe une seconde technique générale pour le rendu 3D, totalement opposée à la rastérisation, appelée le '''lancer de rayons'''. Cette technique a cependant été peu utilisée dans les jeux vidéo, jusqu'à récemment. La raison est que le lancer de rayons demande beaucoup de puissance de calcul, sans compter que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Mais les choses commencent à changer. Quelques jeux vidéos récents intègrent des techniques de lancer rayons, pour compléter un rendu effectué principalement en rastérisation. De plus, les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, même s'ils restent marginaux des compléments au rendu par rastérisation. S'il a existé des cartes accélératrices totalement dédiées au rendu en lancer de rayons, elles sont restées confidentielles. Aussi, nous allons nous concentrer sur les cartes graphiques récentes, et allons peu parler des cartes accélératrices dédiées au lancer de rayons. ==Le lancer de rayons== Le lancer de rayons et la rastérisation. commencent par générer la géométrie de la scène 3D, en plaçant les objets dans la scène 3D, et en effectuant l'étape de transformation des modèles 3D, et les étapes de transformation suivante. Mais les ressemblances s'arrêtent là. Le lancer de rayons effectue l'étape d'éclairage différemment, sans compter qu'il n'a pas besoin de rastérisation. ===Le ''ray-casting'' : des rayons tirés depuis la caméra=== La forme la plus simple de lancer de rayon s'appelle le '''''ray-casting'''''. Elle émet des lignes droites, des '''rayons''' qui partent de la caméra et qui passent chacun par un pixel de l'écran. Les rayons font alors intersecter les différents objets présents dans la scène 3D, en un point d'intersection. Le moteur du jeu détermine alors quel est le point d'intersection le plus proche, ou plus précisément, le sommet le plus proche de ce point d'intersection. Ce sommet est associé à une coordonnée de textures, ce qui permet d'associer directement un texel au pixel associé au rayon. [[File:Raytrace trace diagram.png|centre|vignette|upright=2|Raycasting, rayon simple.]] En somme, l'étape de lancer de rayon et le calcul des intersections remplacent l'étape de rasterisation, mais les étapes de traitement de la géométrie et des textures existent encore. Après tout, il faut bien placer les objets dans la scène 3D/2D, faire diverses transformations, les éclairer. On peut gérer la transparence des textures assez simplement, si on connait la transparence sur chaque point d'intersection d'un rayon, information présente dans les textures. [[File:Anarch short gameplay.gif|vignette|Exemple de rendu en ray-casting 2D dans un jeu vidéo.]] En soi, cet algorithme est simple, mais il a déjà été utilisé dans pas mal de jeux vidéos. Mais sous une forme simple, en deux dimensions ! Les premiers jeux IdSoftware, dont Wolfenstein 3D et Catacomb, utilisaient cette méthode de rendu, mais dans un univers en deux dimensions. Cet article explique bien cela : [[Les moteurs de rendu des FPS en 2.5 D\Le moteur de Wolfenstein 3D|Le moteur de rendu de Wolfenstein 3D]]. Au passage, si vous faites des recherches sur le ''raycasting'', vous verrez que le terme est souvent utilisé pour désigner la méthode de rendu de ces vieux FPS, alors que ce n'en est qu'un cas particulier. [[File:Simple raycasting with fisheye correction.gif|centre|vignette|upright=2|Simple raycasting with fisheye correction]] ===Le ''raytracing'' proprement dit=== Le lancer de rayon proprement dit est une forme améliorée de ''raycasting'' dans la gestion de l'éclairage et des ombres est modifiée. Le lancer de rayon calcule les ombres assez simplement, sans recourir à des algorithmes compliqués. L'idée est qu'un point d'intersection est dans l'ombre si un objet se trouve entre lui et une source de lumière. Pour déterminer cela, il suffit de tirer un trait entre les deux et de vérifier s'il y a un obstacle/objet sur le trajet. Si c'est le cas, le point d'intersection n'est pas éclairé par la source de lumière et est donc dans l'ombre. Si ce n'est pas le cas, il est éclairé avec un algorithme d'éclairage. Le trait tiré entre la source de lumière et le point d'intersection est en soi facile : c'est rayon, identique aux rayons envoyés depuis la caméra. La différence est que ces rayons servent à calculer les ombres, ils sont utilisés pour une raison différente. Il faut donc faire la différence entre les '''rayons primaires''' qui partent de la caméra et passent par un pixel de l'écran, et les '''rayon d'ombrage''' qui servent pour le calcul des ombres. [[File:Ray trace diagram.svg|centre|vignette|upright=2|Principe du lancer de rayons.]] Les calculs d'éclairage utilisés pour éclairer/ombrer les points d'intersection vous sont déjà connus : la luminosité est calculée à partir de l'algorithme d'éclairage de Phong, vu dans le chapitre "L'éclairage d'une scène 3D : shaders et T&L". Pour cela, il faut juste récupérer la normale du sommet associé au point d'intersection et l'intensité de la source de lumière, et de calculer les informations manquantes (l'angle normale-rayons de lumière, autres). Il détermine alors la couleur de chaque point d'intersection à partir de tout un tas d'informations. ===Le ''raytracing'' récursif=== <noinclude>[[File:Glasses 800 edit.png|vignette|Image rendue avec le lancer de rayons récursif.]]</noinclude> La technique de lancer de rayons précédente ne gère pas les réflexions, les reflets, des miroirs, les effets de spécularité, et quelques autres effets graphiques de ce style. Pourtant, ils peuvent être implémentés facilement en modifiant le ''raycasting'' d'une manière très simple. Il suffit de relancer des rayons à partir du point d'intersection. La direction de ces '''rayons secondaires''' est calculée en utilisant les lois de la réfraction/réflexion vues en physique. De plus, les rayons secondaires peuvent eux-aussi créer des rayons secondaires quand ils sont reflétés/réfractés, etc. La technique est alors appelée du ''lancer de rayons récursif'', qui est souvent simplement appelée "lancer de rayons". [[File:Recursive raytracing.svg|centre|vignette|upright=2|Lancer de rayon récursif.]] ==Les optimisations du lancer de rayons== Les calculs d'intersections sont très gourmands en puissance de calcul. Sans optimisation, on doit tester l'intersection de chaque rayon avec chaque triangle. Mais diverses optimisations permettent d'économiser des calculs. Elles consistent à regrouper plusieurs triangles ensemble pour rejeter des paquets de triangles en une fois. Pour cela, la carte graphique utilise des '''structures d'accélération''', qui mémorisent les regroupements de triangles, et parfois les triangles eux-mêmes. ===Les volumes englobants=== [[File:BoundingBox.jpg|vignette|Objet englobant : la statue est englobée dans un pavé.]] L'idée est d'englober chaque objet par un pavé appelé un ''volume englobant''. Le tout est illustré ci-contre, avec une statue représentée en 3D. La statue est un objet très complexe, contenant plusieurs centaines ou milliers de triangles, ce qui fait que tester l'intersection d'un rayon avec chaque triangle serait très long. Par contre, on peut tester si le rayon intersecte le volume englobant facilement : il suffit de tester les 6 faces du pavé, soit 12 triangles, pas plus. S'il n'y a pas d'intersection, alors on économise plusieurs centaines ou milliers de tests d'intersection. Par contre, s'il y a intersection, on doit vérifier chaque triangle. Vu que les rayons intersectent souvent peu d'objets, le gain est énorme ! L'usage seul de volumes englobant est une optimisation très performante. Au lieu de tester l'intersection avec chaque triangle, on teste l'intersection avec chaque objet, puis l'intersection avec chaque triangle quand on intersecte chaque volume englobant. On divise le nombre de tests par un facteur quasi-constant, mais de très grande valeur. Il faut noter que les calculs d'intersection sont légèrement différents entre un triangle et un volume englobant. Il faut dire que les volumes englobant sont généralement des pavées, ils utilisent des rectangles, etc. Les différences sont cependant minimales. Mais on peut faire encore mieux. L'idée est de regrouper plusieurs volumes englobants en un seul. Si une dizaine d'objets sont proches, leurs volumes englobants seront proches. Il est alors utile d'englober leurs volumes englobants dans un super-volume englobant. L'idée est que l'on teste d'abord le super-volume englobant, au lieu de tester la dizaine de volumes englobants de base. S'il n'y a pas d'intersection, alors on a économisé une dizaine de tests. Mais si intersection, il y a, alors on doit vérifier chaque sous-volume englobant de base, jusqu'à tomber sur une intersection. Vu que les intersections sont rares, on y gagne plus qu'on y perd. Et on peut faire la même chose avec les super-volumes englobants, en les englobant dans des volumes englobants encore plus grands, et ainsi de suite, récursivement. On obtient alors une '''hiérarchie de volumes englobants''', qui part d'un volume englobant qui contient toute la géométrie, hors skybox, qui lui-même regroupe plusieurs volumes englobants, qui eux-mêmes... [[File:Example of bounding volume hierarchy.svg|centre|vignette|upright=2|Hiérarchie de volumes englobants.]] Le nombre de tests d'intersection est alors grandement réduit. On passe d'un nombre de tests proportionnel aux nombres d'objets à un nombre proportionnel à son logarithme. Plus la scène contient d'objets, plus l'économie est importante. La seule difficulté est de générer la hiérarchie de volumes englobants à partir d'une scène 3D. Divers algorithmes assez rapides existent pour cela, ils créent des volumes englobants différents. Les volumes englobants les plus utilisés dans les cartes 3D sont les '''''axis-aligned bounding boxes (AABB)'''''. La hiérarchie est mémorisée en mémoire RAM, dans une structure de données que les programmeurs connaissent sous le nom d'arbre, et précisément un arbre binaire ou du moins d'un arbre similaire (''k-tree''). Traverser cet arbre pour passer d'un objet englobant à un autre plus petit est très simple, mais a un défaut : on saute d'on objet à un autre en mémoire, les deux sont souvent éloignés en mémoire. La traversée de la mémoire est erratique, sautant d'un point à un autre. On n'est donc dans un cas où les caches fonctionnent mal, ou les techniques de préchargement échouent, où la mémoire devient un point bloquant car trop lente. ===La cohérence des rayons=== Les rayons primaires, émis depuis la caméra, sont proches les uns des autres, et vont tous dans le même sens. Mais ce n'est pas le cas pour des rayons secondaires. Les objets d'une scène 3D ont rarement des surfaces planes, mais sont composés d'un tas de triangles qui font un angle entre eux. La conséquence est que deux rayons secondaires émis depuis deux triangles voisins peuvent aller dans des directions très différentes. Ils vont donc intersecter des objets très différents, atterrir sur des sources de lumières différentes, etc. De tels rayons sont dits '''incohérents''', en opposition aux rayons cohérents qui sont des rayons proches qui vont dans la même direction. Les rayons incohérents sont peu fréquents avec le ''rayctracing'' récursif basique, mais deviennent plus courants avec des techniques avancées comme le ''path tracing'' ou les techniques d'illumination globale. En soi, la présende de rayons incohérents n'est pas un problème et est parfaitement normale. Le problème est que le traitement des rayons incohérent est plus lent que pour les rayons cohérents. Le traitement de deux rayons secondaires voisins demande d'accéder à des données différentes, ce qui donne des accès mémoire très différents et très éloignés. On ne peut pas profiter des mémoires caches ou des optimisations de la hiérarchie mémoire, si on les traite consécutivement. Un autre défaut est qu'une même instance de ''pixels shaders'' va traiter plusieurs rayons en même temps, grâce au SIMD. Mais les branchements n'auront pas les mêmes résultats d'un rayon à l'autre, et cette divergence entrainera des opérations de masquage et de branchement très couteuses. Pour éviter cela, les GPU modernes permettent de trier les rayons en fonction de leur direction et de leur origine. Ils traitent les rayons non dans l'ordre usuel, mais essayent de regrouper des rayons proches qui vont dans la même direction, et de les traiter ensemble, en parallèle, ou l'un après l'autre. Cela ne change rien au rendu final, qui traite les rayons en parallèle. Ainsi, les données chargées dans le cache par le premier rayon seront celles utilisées pour les rayons suivants, ce qui donne un gain de performance appréciable. De plus, cela évite d'utiliser des branchements dans les ''pixels shaders''. Les méthodes de '''tri de rayons''' sont nombreuses, aussi en faire une liste exhaustive serait assez long, sans compter qu'on ne sait pas quelles sont celles implémentées en hardware, ni commetn elles le sont. ===Les avantages et désavantages comparé à la rastérisation=== [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] L'avantage principal du lancer de rayons est la détermination des surfaces visibles. La rastérisation a tendance à calculer inutilement des portions non-rendues de la scène 3D, malgré l'usage de techniques de ''culling'' ou de ''clipping'' aussi puissantes qu'imparfaites. De nombreux fragments/pixels sont éliminés à la toute fin du pipeline, grâce au z-buffer, après avoir été calculés et texturés. Le lancer de rayons ne calcule pas les portions invisibles de l'image par construction : pas besoin de ''culling'', de ''clipping'', ni même de z-buffer. D'ailleurs, l'absence de z-buffer réduit grandement le nombre d'accès mémoire. Les réflexions et la réfraction sont gérées naturellement par le lancer de rayon récursif, de même que l'éclairage et les ombres, alors qu'elles demandent des ruses de sioux pour obtenir un résultat correct avec la rastérisation. Avec la rastérisation, cela demande d'utiliser des techniques de rendu au-dessus de la rastérisation de base, comme des ombres volumétriques, des ''lightmaps'', des ''shadowmaps'' ou autres. L'absence de ''shadowmaps'', qui demande de faire du ''render-to-texture'', élimine certaines écritures mémoires et permet aux caches de texture d'être en lecture seule (leurs circuits sont donc assez simples et performants, les problèmes de cohérence des caches disparaissent). Mais tous ces avantages sont compensés par le fait que le lancer de rayons est plus lent sur un paquet d'autres points. Déjà, les calculs d'intersection sont très lourds, ils demandent beaucoup de calculs et d'opérations arithmétiques, plus que pour l'équivalent en rastérisation. Et ils se parallélisent mal. Le moteur de jeu doit d'abord lancer les rayons primaires, puis les rayons secondaires qui en découlent, puis les rayons de la troisième passe, etc. Au final, cela se parallélise assez mal, car il y a un ordre de traitement des rayons (primaires, puis secondaires, puis...), alors que la rastérisation traite chaque triangle/pixel/source de lumière de manière indépendante. Ensuite, le lancer de rayon n'est pas économe niveau accès mémoire. Ce qu'on économise avec l’absence de tampon de profondeur et l'absence de ''shadowmaps'', on le perd au niveau de la BVH et des accès aux textures. La BVH est notamment un énorme problème. Les BVH étant ce que les programmeurs connaissent sous le nom d'arbre (binaire ou k-tree), elles dispersent les données en mémoire, alors que les GPU et CPU modernes préfèrent des données consécutives en RAM. Leur hiérarchie mémoire est beaucoup plus efficace pour accéder à des données proches en mémoire qu'à des données dispersées et il n'y a pas grand chose à faire pour changer la donne. La traversée d'une BVH se fait avec des accès en mémoire vidéo complétement désorganisés, là où le rendu 3D a des accès plus linéaires qui permettent d'utiliser des mémoires caches. ==Le matériel pour accélérer le lancer de rayons== En théorie, il est possible d'utiliser des ''shaders'' pour effectuer du lancer de rayons, mais la technique n'est pas très performante. Il vaut mieux utiliser du hardware dédié. Heureusement, cela ne demande pas beaucoup de changements à un GPU usuel. Le lancer de rayons se différencie peu de la rastérisationla différence principale étant que l'étape de rastérisation est remplacée par une étape de lancer de rayons. Les deux types de rendu ont besoin de calculer la géométrie, d'appliquer des textures et de faire des calculs d'éclairage. Sachant cela, les GPU actuels ont juste besoin d'ajouter des circuits dédiés au lancer de rayons, à savoir des unités de génération des rayons et des unités pour les calculs d'intersection. ===Les circuits spécialisés pour les calculs liés aux rayons=== Toute la subtilité du lancer de rayons est de générer les rayons et de déterminer quels triangles ils intersectent. La seule difficulté est de gérer la transparence, mais aussi et surtout la traversée de la BVH. En soit, générer les rayons et déterminer leurs intersections n'est pas compliqué. Il existe des algorithmes basés sur du calcul vectoriel pour déterminer si intersection il y a et quelles sont ses coordonnées. C'est toute la partie de parcours de la BVH qui est plus compliquée à implémenter : faire du ''pointer chasing'' en hardware n'est pas facile. Et cela se ressent quand on étudie comment les GPU récents gèrent le lancer de rayons. Ils utilisent des shaders dédiés, qui communiquent avec une '''unité de lancer de rayon''' dédiée à la traversée de la BVH. Le terme anglais est ''Ray-tracing Unit'', ce qui fait que nous utiliseront l'abréviation RTU pour la désigner. Les shaders spécialisés sont des '''shaders de lancer de rayon''' et il y en a deux types. * Les '''''shaders'' de génération de rayon''' s'occupent de générer les rayons * Les '''''shaders'' de ''Hit/miss''''' s'occupent de faire tous les calculs une fois qu'une intersection est détectée. Le processus de rendu en lancer de rayon sur ces GPU est le suivant. Les shaders de génération de rayon génèrent les rayons lancés, qu'ils envoient à la RTU. La RTU parcours la BVH et effectue les calculs d'intersection. Si la RTU détecte une intersection, elle lance l'exécution d'un ''shader'' de ''Hit/miss'' sur les processeurs de ''shaders''. Ce dernier finit le travail, mais il peut aussi commander la génération de rayons secondaires ou d'ombrage. Suivant la nature de la surface (opaque, transparente, réfléchissante, mate, autre), ils décident s'il faut ou non émettre un rayon secondaire, et commandent les shaders de génération de rayon si besoin. [[File:Implementation hardware du raytracing.png|centre|vignette|upright=2|Implémentation hardware du raytracing]] ===La RTU : la traversée des structures d'accélérations et des BVH=== Lorsqu'un processeur de shader fait appel à la RTU, il lui envoie un rayon encodé d'une manière ou d'une autre, potentiellement différente d'un GPU à l'autre. Toujours est-il que les informations sur ce rayon sont mémorisées dans des registres à l'intérieur de la RTU. Ce n'est que quand le rayon quitte la RTU que ces registres sont réinitialisés pour laisser la place à un autre rayon. Il y a donc un ou plusieurs '''registres de rayon''' intégrés à la RTU. La RTU contient beaucoup d''''unités de calculs d'intersections''', des circuits de calcul qui font les calculs d'intersection. Il est possible de tester un grand nombre d'intersections de triangles en parallèles, chacun dans une unité de calcul séparée. L'algorithme de lancer de rayons se parallélise donc, au moins un minimum, et la RTU en profite. En soi, les circuits de détection des intersections sont très simples et se résument à un paquet de circuits de calcul (addition, multiplications, division, autres), connectés les uns aux autres. Il y a assez peu à dire dessus. Mais les autres circuits sont très intéressants à étudier. Il y a deux types d'intersections à calculer : les intersections avec les volumes englobants, les intersections avec les triangles. Volumes englobants et triangles ne sont pas encodés de la même manière en mémoire vidéo, ce qui fait que les calculs à faire ne sont pas exactement les mêmes. Et c'est normal : il y a une différence entre un pavé pour le volume englobant et trois sommets/vecteurs pour un triangle. La RTU des GPU Intel, et vraisemblablement celle des autres GPU, utilise des circuits de calcul différents pour les deux. Elle incorpore plus de circuits pour les intersections avec les volumes englobants, que de circuits pour les intersections avec un triangle. Il faut dire que lors de la traversée d'une BVH, il y a une intersection avec un triangle par rayon, mais plusieurs pour les volumes englobants. L'intérieur de la RTU contient aussi de quoi séquencer les accès mémoire nécessaires pour parcourir la BVH. Traverser un BVH demande de tester l'intersection avec un volume englobant, puis de décider s'il faut passer au suivant, et rebelotte. Une fois que la RTU tombe sur un triangle, elle l'envoie aux unités de calcul d'intersection dédiées aux triangles. Les RTU intègrent des '''caches de BVH''', qui mémorisent des portions de la BVH au cas où celles-ci seraient retraversées plusieurs fois de suite par des rayons consécutifs. La taille de ce cache est de l'ordre du kilo-octet ou plus. Pour donner des exemples, les GPU Intel d'architecture Battlemage ont un cache de BVH de 16 Kilo-octets, soit le double comparé aux GPU antérieurs. Le cache de BVH est très fortement lié à la RTU et n'est pas accesible par l'unité de texture, les processeurs de ''shader'' ou autres. [[File:Raytracing Unit.png|centre|vignette|upright=2|Raytracing Unit]] Pour diminuer l’impact sur les performances, les cartes graphiques modernes incorporent des circuits de tri pour regrouper les rayons cohérents, ceux qui vont dans la même direction et proviennent de triangles proches. Ce afin d'implémenter les optimisations vues plus haut. ===La génération des structures d'accélération et BVH=== La plupart des cartes graphiques ne peuvent pas générer les BVH d'elles-mêmes. Pareil pour les autres structures d'accélération. Elles sont calculées par le processeur, stockées en mémoire RAM, puis copiées dans la mémoire vidéo avant le démarrage du rendu 3D. Cependant, quelques rares cartes spécialement dédiées au lancer de rayons incorporent des circuits pour générer les BVH/AS. Elles lisent le tampon de sommet envoyé par le processeur, puis génèrent les BVH complémentaires. L'unité de génération des structures d'accélération est complétement séparée des autres unités. Un exemple d'architecture de ce type est l'architecture Raycore, dont nous parlerons dans les sections suivantes. Cette unité peut aussi modifier les BVH à la volée, si jamais la scène 3D change. Par exemple, si un objet change de place, comme un NPC qui se déplace, il faut reconstruire le BVH. Les cartes graphiques récentes évitent de reconstruire le BVH de zéro, mais se contentent de modifier ce qui a changé dans le BVH. Les performances en sont nettement meilleures. ==Un historique rapide des cartes graphiques dédiées au lancer de rayon== Les premières cartes accélératrices de lancer de rayons sont assez anciennes et datent des années 80-90. Leur évolution a plus ou moins suivi la même évolution que celle des cartes graphiques usuelles, sauf que très peu de cartes pour le lancer de rayons ont été produites. Par même évolution, on veut dire que les cartes graphiques pour le lancer de rayon ont commencé par tester deux solutions évidentes et extrêmes : les cartes basées sur des circuits programmables d'un côté, non programmables de l'autre. La première carte pour le lancer de rayons était la TigerShark, et elle était tout simplement composée de plusieurs processeurs et de la mémoire sur une carte PCI. Elle ne faisait qu'accélérer le calcul des intersections, rien de plus. Les autres cartes effectuaient du rendu 3D par voxel, un type de rendu 3D assez spécial que nous n'avons pas abordé jusqu'à présent, dont l'algorithme de lancer de rayons n'était qu'une petite partie du rendu. Elles étaient destinées au marché scientifique, industriel et médical. On peut notamment citer la VolumePro et la VIZARD et II. Les deux étaient des cartes pour bus PCI qui ne faisaient que du ''raycasting'' et n'utilisaient pas de rayons d'ombrage. Le ''raycasting'' était exécuté sur un processeur dédié sur la VIZARD II, sur un circuit fixe implémenté par un FPGA sur la Volume Pro Voici différents papiers académiques qui décrivent l'architecture de ces cartes accélératrices : * [https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=ccda3712ba0e6575cd08025f3bb920de46201cac The VolumePro Real-Time Ray-Casting System]. * [https://www.researchgate.net/publication/234829060_VIZARD_II_A_reconfigurable_interactive_volume_rendering_system VIZARD II: A reconfigurable interactive volume rendering system] La puce SaarCOR (Saarbrücken's Coherence Optimized Ray Tracer) et bien plus tard par la carte Raycore, étaient deux cartes réelement dédiées au raycasting pur, sans usage de voxels, et étaient basées sur des FPGA. Elles contenaient uniquement des circuits pour accélérer le lancer de rayon proprement dit, à savoir la génération des rayons, les calculs d'intersection, pas plus. Tout le reste, à savoir le rendu de la géométrie, le placage de textures, les ''shaders'' et autres, étaient effectués par le processeur. Voici des papiers académiques sur leur architecture : * [https://gamma.cs.unc.edu/SATO/Raycore/raycore.pdf RayCore: A ray-tracing hardware architecture for mobile devices]. Le successeur de la SaarCOR, le Ray Processing Unit (RPU), était une carte hybride : c'était une SaarCOR basée sur des circuits fixes, qui gagna quelques possibilités de programmation. Elle ajoutait des processeurs de ''shaders'' aux circuits fixes spécialisés pour le lancer de rayons. Les autres cartes du genre faisaient pareil, et on peut citer les cartes ART, les cartes CausticOne, Caustic Professional's R2500 et R2100. Les cartes 3D modernes permettent de faire à la fois de la rasterisation et du lancer de rayons. Pour cela, les GPU récents incorporent des unités pour effectuer des calculs d'intersection, qui sont réalisés dans des circuits spécialisés. Elles sont appelées des RT Cores sur les cartes NVIDIA, mais les cartes AMD et Intel ont leur équivalent, idem chez leurs concurrents de chez Imagination technologies, ainsi que sur certains GPU destinés au marché mobile. Peu de choses sont certaines sur ces unités, mais il semblerait qu'il s'agisse d'unités de textures modifiées. De ce qu'on en sait, certains GPU utilisent des unités pour calculer les intersections avec les triangles, et d'autres unités séparées pour calculer les intersections avec les volumes englobants. La raison est que, comme dit plus haut, les algorithmes de calcul d'intersection sont différents dans les deux cas. Les algorithmes utilisés ne sont pas connus pour toutes les cartes graphiques. On sait que les GPU Wizard de Imagination technology utilisaient des tests AABB de Plücker. Ils utilisaient 15 circuits de multiplication, 9 additionneurs-soustracteurs, quelques circuits pour tester la présence dans un intervalle, des circuits de normalisation et arrondi. L'algorithme pour leurs GPU d'architecture Photon est disponible ici, pour les curieux : [https://www.highperformancegraphics.org/slides23/2023-06-_HPG_IMG_RayTracing_2.pdf]. {{NavChapitre | book=Les cartes graphiques | prev=Les écritures en VRAM hors ROPs | prevText=Les écritures en VRAM hors ROPs | next=L'antialiasing | prevNext=L'antialiasing }}{{autocat}} 2gwwa7cj8oz2ycmqeb6smiif5lycvxt 764893 764876 2026-04-24T17:58:43Z Mewtow 31375 /* Un historique rapide des cartes graphiques dédiées au lancer de rayon */ 764893 wikitext text/x-wiki Les cartes graphiques actuelles utilisent la technique de la rastérisation, qui a été décrite en détail dans le chapitre sur les cartes accélératrices 3D. Mais nous avions dit qu'il existe une seconde technique générale pour le rendu 3D, totalement opposée à la rastérisation, appelée le '''lancer de rayons'''. Cette technique a cependant été peu utilisée dans les jeux vidéo, jusqu'à récemment. La raison est que le lancer de rayons demande beaucoup de puissance de calcul, sans compter que créer des cartes accélératrices pour le lancer de rayons n'est pas simple. Mais les choses commencent à changer. Quelques jeux vidéos récents intègrent des techniques de lancer rayons, pour compléter un rendu effectué principalement en rastérisation. De plus, les cartes graphiques modernes incorporent quelques circuits pour accélérer le lancer de rayons, même s'ils restent marginaux des compléments au rendu par rastérisation. S'il a existé des cartes accélératrices totalement dédiées au rendu en lancer de rayons, elles sont restées confidentielles. Aussi, nous allons nous concentrer sur les cartes graphiques récentes, et allons peu parler des cartes accélératrices dédiées au lancer de rayons. ==Le lancer de rayons== Le lancer de rayons et la rastérisation. commencent par générer la géométrie de la scène 3D, en plaçant les objets dans la scène 3D, et en effectuant l'étape de transformation des modèles 3D, et les étapes de transformation suivante. Mais les ressemblances s'arrêtent là. Le lancer de rayons effectue l'étape d'éclairage différemment, sans compter qu'il n'a pas besoin de rastérisation. ===Le ''ray-casting'' : des rayons tirés depuis la caméra=== La forme la plus simple de lancer de rayon s'appelle le '''''ray-casting'''''. Elle émet des lignes droites, des '''rayons''' qui partent de la caméra et qui passent chacun par un pixel de l'écran. Les rayons font alors intersecter les différents objets présents dans la scène 3D, en un point d'intersection. Le moteur du jeu détermine alors quel est le point d'intersection le plus proche, ou plus précisément, le sommet le plus proche de ce point d'intersection. Ce sommet est associé à une coordonnée de textures, ce qui permet d'associer directement un texel au pixel associé au rayon. [[File:Raytrace trace diagram.png|centre|vignette|upright=2|Raycasting, rayon simple.]] En somme, l'étape de lancer de rayon et le calcul des intersections remplacent l'étape de rasterisation, mais les étapes de traitement de la géométrie et des textures existent encore. Après tout, il faut bien placer les objets dans la scène 3D/2D, faire diverses transformations, les éclairer. On peut gérer la transparence des textures assez simplement, si on connait la transparence sur chaque point d'intersection d'un rayon, information présente dans les textures. [[File:Anarch short gameplay.gif|vignette|Exemple de rendu en ray-casting 2D dans un jeu vidéo.]] En soi, cet algorithme est simple, mais il a déjà été utilisé dans pas mal de jeux vidéos. Mais sous une forme simple, en deux dimensions ! Les premiers jeux IdSoftware, dont Wolfenstein 3D et Catacomb, utilisaient cette méthode de rendu, mais dans un univers en deux dimensions. Cet article explique bien cela : [[Les moteurs de rendu des FPS en 2.5 D\Le moteur de Wolfenstein 3D|Le moteur de rendu de Wolfenstein 3D]]. Au passage, si vous faites des recherches sur le ''raycasting'', vous verrez que le terme est souvent utilisé pour désigner la méthode de rendu de ces vieux FPS, alors que ce n'en est qu'un cas particulier. [[File:Simple raycasting with fisheye correction.gif|centre|vignette|upright=2|Simple raycasting with fisheye correction]] ===Le ''raytracing'' proprement dit=== Le lancer de rayon proprement dit est une forme améliorée de ''raycasting'' dans la gestion de l'éclairage et des ombres est modifiée. Le lancer de rayon calcule les ombres assez simplement, sans recourir à des algorithmes compliqués. L'idée est qu'un point d'intersection est dans l'ombre si un objet se trouve entre lui et une source de lumière. Pour déterminer cela, il suffit de tirer un trait entre les deux et de vérifier s'il y a un obstacle/objet sur le trajet. Si c'est le cas, le point d'intersection n'est pas éclairé par la source de lumière et est donc dans l'ombre. Si ce n'est pas le cas, il est éclairé avec un algorithme d'éclairage. Le trait tiré entre la source de lumière et le point d'intersection est en soi facile : c'est rayon, identique aux rayons envoyés depuis la caméra. La différence est que ces rayons servent à calculer les ombres, ils sont utilisés pour une raison différente. Il faut donc faire la différence entre les '''rayons primaires''' qui partent de la caméra et passent par un pixel de l'écran, et les '''rayon d'ombrage''' qui servent pour le calcul des ombres. [[File:Ray trace diagram.svg|centre|vignette|upright=2|Principe du lancer de rayons.]] Les calculs d'éclairage utilisés pour éclairer/ombrer les points d'intersection vous sont déjà connus : la luminosité est calculée à partir de l'algorithme d'éclairage de Phong, vu dans le chapitre "L'éclairage d'une scène 3D : shaders et T&L". Pour cela, il faut juste récupérer la normale du sommet associé au point d'intersection et l'intensité de la source de lumière, et de calculer les informations manquantes (l'angle normale-rayons de lumière, autres). Il détermine alors la couleur de chaque point d'intersection à partir de tout un tas d'informations. ===Le ''raytracing'' récursif=== <noinclude>[[File:Glasses 800 edit.png|vignette|Image rendue avec le lancer de rayons récursif.]]</noinclude> La technique de lancer de rayons précédente ne gère pas les réflexions, les reflets, des miroirs, les effets de spécularité, et quelques autres effets graphiques de ce style. Pourtant, ils peuvent être implémentés facilement en modifiant le ''raycasting'' d'une manière très simple. Il suffit de relancer des rayons à partir du point d'intersection. La direction de ces '''rayons secondaires''' est calculée en utilisant les lois de la réfraction/réflexion vues en physique. De plus, les rayons secondaires peuvent eux-aussi créer des rayons secondaires quand ils sont reflétés/réfractés, etc. La technique est alors appelée du ''lancer de rayons récursif'', qui est souvent simplement appelée "lancer de rayons". [[File:Recursive raytracing.svg|centre|vignette|upright=2|Lancer de rayon récursif.]] ==Les optimisations du lancer de rayons== Les calculs d'intersections sont très gourmands en puissance de calcul. Sans optimisation, on doit tester l'intersection de chaque rayon avec chaque triangle. Mais diverses optimisations permettent d'économiser des calculs. Elles consistent à regrouper plusieurs triangles ensemble pour rejeter des paquets de triangles en une fois. Pour cela, la carte graphique utilise des '''structures d'accélération''', qui mémorisent les regroupements de triangles, et parfois les triangles eux-mêmes. ===Les volumes englobants=== [[File:BoundingBox.jpg|vignette|Objet englobant : la statue est englobée dans un pavé.]] L'idée est d'englober chaque objet par un pavé appelé un ''volume englobant''. Le tout est illustré ci-contre, avec une statue représentée en 3D. La statue est un objet très complexe, contenant plusieurs centaines ou milliers de triangles, ce qui fait que tester l'intersection d'un rayon avec chaque triangle serait très long. Par contre, on peut tester si le rayon intersecte le volume englobant facilement : il suffit de tester les 6 faces du pavé, soit 12 triangles, pas plus. S'il n'y a pas d'intersection, alors on économise plusieurs centaines ou milliers de tests d'intersection. Par contre, s'il y a intersection, on doit vérifier chaque triangle. Vu que les rayons intersectent souvent peu d'objets, le gain est énorme ! L'usage seul de volumes englobant est une optimisation très performante. Au lieu de tester l'intersection avec chaque triangle, on teste l'intersection avec chaque objet, puis l'intersection avec chaque triangle quand on intersecte chaque volume englobant. On divise le nombre de tests par un facteur quasi-constant, mais de très grande valeur. Il faut noter que les calculs d'intersection sont légèrement différents entre un triangle et un volume englobant. Il faut dire que les volumes englobant sont généralement des pavées, ils utilisent des rectangles, etc. Les différences sont cependant minimales. Mais on peut faire encore mieux. L'idée est de regrouper plusieurs volumes englobants en un seul. Si une dizaine d'objets sont proches, leurs volumes englobants seront proches. Il est alors utile d'englober leurs volumes englobants dans un super-volume englobant. L'idée est que l'on teste d'abord le super-volume englobant, au lieu de tester la dizaine de volumes englobants de base. S'il n'y a pas d'intersection, alors on a économisé une dizaine de tests. Mais si intersection, il y a, alors on doit vérifier chaque sous-volume englobant de base, jusqu'à tomber sur une intersection. Vu que les intersections sont rares, on y gagne plus qu'on y perd. Et on peut faire la même chose avec les super-volumes englobants, en les englobant dans des volumes englobants encore plus grands, et ainsi de suite, récursivement. On obtient alors une '''hiérarchie de volumes englobants''', qui part d'un volume englobant qui contient toute la géométrie, hors skybox, qui lui-même regroupe plusieurs volumes englobants, qui eux-mêmes... [[File:Example of bounding volume hierarchy.svg|centre|vignette|upright=2|Hiérarchie de volumes englobants.]] Le nombre de tests d'intersection est alors grandement réduit. On passe d'un nombre de tests proportionnel aux nombres d'objets à un nombre proportionnel à son logarithme. Plus la scène contient d'objets, plus l'économie est importante. La seule difficulté est de générer la hiérarchie de volumes englobants à partir d'une scène 3D. Divers algorithmes assez rapides existent pour cela, ils créent des volumes englobants différents. Les volumes englobants les plus utilisés dans les cartes 3D sont les '''''axis-aligned bounding boxes (AABB)'''''. La hiérarchie est mémorisée en mémoire RAM, dans une structure de données que les programmeurs connaissent sous le nom d'arbre, et précisément un arbre binaire ou du moins d'un arbre similaire (''k-tree''). Traverser cet arbre pour passer d'un objet englobant à un autre plus petit est très simple, mais a un défaut : on saute d'on objet à un autre en mémoire, les deux sont souvent éloignés en mémoire. La traversée de la mémoire est erratique, sautant d'un point à un autre. On n'est donc dans un cas où les caches fonctionnent mal, ou les techniques de préchargement échouent, où la mémoire devient un point bloquant car trop lente. ===La cohérence des rayons=== Les rayons primaires, émis depuis la caméra, sont proches les uns des autres, et vont tous dans le même sens. Mais ce n'est pas le cas pour des rayons secondaires. Les objets d'une scène 3D ont rarement des surfaces planes, mais sont composés d'un tas de triangles qui font un angle entre eux. La conséquence est que deux rayons secondaires émis depuis deux triangles voisins peuvent aller dans des directions très différentes. Ils vont donc intersecter des objets très différents, atterrir sur des sources de lumières différentes, etc. De tels rayons sont dits '''incohérents''', en opposition aux rayons cohérents qui sont des rayons proches qui vont dans la même direction. Les rayons incohérents sont peu fréquents avec le ''rayctracing'' récursif basique, mais deviennent plus courants avec des techniques avancées comme le ''path tracing'' ou les techniques d'illumination globale. En soi, la présende de rayons incohérents n'est pas un problème et est parfaitement normale. Le problème est que le traitement des rayons incohérent est plus lent que pour les rayons cohérents. Le traitement de deux rayons secondaires voisins demande d'accéder à des données différentes, ce qui donne des accès mémoire très différents et très éloignés. On ne peut pas profiter des mémoires caches ou des optimisations de la hiérarchie mémoire, si on les traite consécutivement. Un autre défaut est qu'une même instance de ''pixels shaders'' va traiter plusieurs rayons en même temps, grâce au SIMD. Mais les branchements n'auront pas les mêmes résultats d'un rayon à l'autre, et cette divergence entrainera des opérations de masquage et de branchement très couteuses. Pour éviter cela, les GPU modernes permettent de trier les rayons en fonction de leur direction et de leur origine. Ils traitent les rayons non dans l'ordre usuel, mais essayent de regrouper des rayons proches qui vont dans la même direction, et de les traiter ensemble, en parallèle, ou l'un après l'autre. Cela ne change rien au rendu final, qui traite les rayons en parallèle. Ainsi, les données chargées dans le cache par le premier rayon seront celles utilisées pour les rayons suivants, ce qui donne un gain de performance appréciable. De plus, cela évite d'utiliser des branchements dans les ''pixels shaders''. Les méthodes de '''tri de rayons''' sont nombreuses, aussi en faire une liste exhaustive serait assez long, sans compter qu'on ne sait pas quelles sont celles implémentées en hardware, ni commetn elles le sont. ===Les avantages et désavantages comparé à la rastérisation=== [[File:ViewFrustum.svg|vignette|upright=1|Volume délimité par la caméra (''view frustum'').]] L'avantage principal du lancer de rayons est la détermination des surfaces visibles. La rastérisation a tendance à calculer inutilement des portions non-rendues de la scène 3D, malgré l'usage de techniques de ''culling'' ou de ''clipping'' aussi puissantes qu'imparfaites. De nombreux fragments/pixels sont éliminés à la toute fin du pipeline, grâce au z-buffer, après avoir été calculés et texturés. Le lancer de rayons ne calcule pas les portions invisibles de l'image par construction : pas besoin de ''culling'', de ''clipping'', ni même de z-buffer. D'ailleurs, l'absence de z-buffer réduit grandement le nombre d'accès mémoire. Les réflexions et la réfraction sont gérées naturellement par le lancer de rayon récursif, de même que l'éclairage et les ombres, alors qu'elles demandent des ruses de sioux pour obtenir un résultat correct avec la rastérisation. Avec la rastérisation, cela demande d'utiliser des techniques de rendu au-dessus de la rastérisation de base, comme des ombres volumétriques, des ''lightmaps'', des ''shadowmaps'' ou autres. L'absence de ''shadowmaps'', qui demande de faire du ''render-to-texture'', élimine certaines écritures mémoires et permet aux caches de texture d'être en lecture seule (leurs circuits sont donc assez simples et performants, les problèmes de cohérence des caches disparaissent). Mais tous ces avantages sont compensés par le fait que le lancer de rayons est plus lent sur un paquet d'autres points. Déjà, les calculs d'intersection sont très lourds, ils demandent beaucoup de calculs et d'opérations arithmétiques, plus que pour l'équivalent en rastérisation. Et ils se parallélisent mal. Le moteur de jeu doit d'abord lancer les rayons primaires, puis les rayons secondaires qui en découlent, puis les rayons de la troisième passe, etc. Au final, cela se parallélise assez mal, car il y a un ordre de traitement des rayons (primaires, puis secondaires, puis...), alors que la rastérisation traite chaque triangle/pixel/source de lumière de manière indépendante. Ensuite, le lancer de rayon n'est pas économe niveau accès mémoire. Ce qu'on économise avec l’absence de tampon de profondeur et l'absence de ''shadowmaps'', on le perd au niveau de la BVH et des accès aux textures. La BVH est notamment un énorme problème. Les BVH étant ce que les programmeurs connaissent sous le nom d'arbre (binaire ou k-tree), elles dispersent les données en mémoire, alors que les GPU et CPU modernes préfèrent des données consécutives en RAM. Leur hiérarchie mémoire est beaucoup plus efficace pour accéder à des données proches en mémoire qu'à des données dispersées et il n'y a pas grand chose à faire pour changer la donne. La traversée d'une BVH se fait avec des accès en mémoire vidéo complétement désorganisés, là où le rendu 3D a des accès plus linéaires qui permettent d'utiliser des mémoires caches. ==Le matériel pour accélérer le lancer de rayons== En théorie, il est possible d'utiliser des ''shaders'' pour effectuer du lancer de rayons, mais la technique n'est pas très performante. Il vaut mieux utiliser du hardware dédié. Heureusement, cela ne demande pas beaucoup de changements à un GPU usuel. Le lancer de rayons se différencie peu de la rastérisationla différence principale étant que l'étape de rastérisation est remplacée par une étape de lancer de rayons. Les deux types de rendu ont besoin de calculer la géométrie, d'appliquer des textures et de faire des calculs d'éclairage. Sachant cela, les GPU actuels ont juste besoin d'ajouter des circuits dédiés au lancer de rayons, à savoir des unités de génération des rayons et des unités pour les calculs d'intersection. ===Les circuits spécialisés pour les calculs liés aux rayons=== Toute la subtilité du lancer de rayons est de générer les rayons et de déterminer quels triangles ils intersectent. La seule difficulté est de gérer la transparence, mais aussi et surtout la traversée de la BVH. En soit, générer les rayons et déterminer leurs intersections n'est pas compliqué. Il existe des algorithmes basés sur du calcul vectoriel pour déterminer si intersection il y a et quelles sont ses coordonnées. C'est toute la partie de parcours de la BVH qui est plus compliquée à implémenter : faire du ''pointer chasing'' en hardware n'est pas facile. Et cela se ressent quand on étudie comment les GPU récents gèrent le lancer de rayons. Ils utilisent des shaders dédiés, qui communiquent avec une '''unité de lancer de rayon''' dédiée à la traversée de la BVH. Le terme anglais est ''Ray-tracing Unit'', ce qui fait que nous utiliseront l'abréviation RTU pour la désigner. Les shaders spécialisés sont des '''shaders de lancer de rayon''' et il y en a deux types. * Les '''''shaders'' de génération de rayon''' s'occupent de générer les rayons * Les '''''shaders'' de ''Hit/miss''''' s'occupent de faire tous les calculs une fois qu'une intersection est détectée. Le processus de rendu en lancer de rayon sur ces GPU est le suivant. Les shaders de génération de rayon génèrent les rayons lancés, qu'ils envoient à la RTU. La RTU parcours la BVH et effectue les calculs d'intersection. Si la RTU détecte une intersection, elle lance l'exécution d'un ''shader'' de ''Hit/miss'' sur les processeurs de ''shaders''. Ce dernier finit le travail, mais il peut aussi commander la génération de rayons secondaires ou d'ombrage. Suivant la nature de la surface (opaque, transparente, réfléchissante, mate, autre), ils décident s'il faut ou non émettre un rayon secondaire, et commandent les shaders de génération de rayon si besoin. [[File:Implementation hardware du raytracing.png|centre|vignette|upright=2|Implémentation hardware du raytracing]] ===La RTU : la traversée des structures d'accélérations et des BVH=== Lorsqu'un processeur de shader fait appel à la RTU, il lui envoie un rayon encodé d'une manière ou d'une autre, potentiellement différente d'un GPU à l'autre. Toujours est-il que les informations sur ce rayon sont mémorisées dans des registres à l'intérieur de la RTU. Ce n'est que quand le rayon quitte la RTU que ces registres sont réinitialisés pour laisser la place à un autre rayon. Il y a donc un ou plusieurs '''registres de rayon''' intégrés à la RTU. La RTU contient beaucoup d''''unités de calculs d'intersections''', des circuits de calcul qui font les calculs d'intersection. Il est possible de tester un grand nombre d'intersections de triangles en parallèles, chacun dans une unité de calcul séparée. L'algorithme de lancer de rayons se parallélise donc, au moins un minimum, et la RTU en profite. En soi, les circuits de détection des intersections sont très simples et se résument à un paquet de circuits de calcul (addition, multiplications, division, autres), connectés les uns aux autres. Il y a assez peu à dire dessus. Mais les autres circuits sont très intéressants à étudier. Il y a deux types d'intersections à calculer : les intersections avec les volumes englobants, les intersections avec les triangles. Volumes englobants et triangles ne sont pas encodés de la même manière en mémoire vidéo, ce qui fait que les calculs à faire ne sont pas exactement les mêmes. Et c'est normal : il y a une différence entre un pavé pour le volume englobant et trois sommets/vecteurs pour un triangle. La RTU des GPU Intel, et vraisemblablement celle des autres GPU, utilise des circuits de calcul différents pour les deux. Elle incorpore plus de circuits pour les intersections avec les volumes englobants, que de circuits pour les intersections avec un triangle. Il faut dire que lors de la traversée d'une BVH, il y a une intersection avec un triangle par rayon, mais plusieurs pour les volumes englobants. L'intérieur de la RTU contient aussi de quoi séquencer les accès mémoire nécessaires pour parcourir la BVH. Traverser un BVH demande de tester l'intersection avec un volume englobant, puis de décider s'il faut passer au suivant, et rebelotte. Une fois que la RTU tombe sur un triangle, elle l'envoie aux unités de calcul d'intersection dédiées aux triangles. Les RTU intègrent des '''caches de BVH''', qui mémorisent des portions de la BVH au cas où celles-ci seraient retraversées plusieurs fois de suite par des rayons consécutifs. La taille de ce cache est de l'ordre du kilo-octet ou plus. Pour donner des exemples, les GPU Intel d'architecture Battlemage ont un cache de BVH de 16 Kilo-octets, soit le double comparé aux GPU antérieurs. Le cache de BVH est très fortement lié à la RTU et n'est pas accesible par l'unité de texture, les processeurs de ''shader'' ou autres. [[File:Raytracing Unit.png|centre|vignette|upright=2|Raytracing Unit]] Pour diminuer l’impact sur les performances, les cartes graphiques modernes incorporent des circuits de tri pour regrouper les rayons cohérents, ceux qui vont dans la même direction et proviennent de triangles proches. Ce afin d'implémenter les optimisations vues plus haut. ===La génération des structures d'accélération et BVH=== La plupart des cartes graphiques ne peuvent pas générer les BVH d'elles-mêmes. Pareil pour les autres structures d'accélération. Elles sont calculées par le processeur, stockées en mémoire RAM, puis copiées dans la mémoire vidéo avant le démarrage du rendu 3D. Cependant, quelques rares cartes spécialement dédiées au lancer de rayons incorporent des circuits pour générer les BVH/AS. Elles lisent le tampon de sommet envoyé par le processeur, puis génèrent les BVH complémentaires. L'unité de génération des structures d'accélération est complétement séparée des autres unités. Un exemple d'architecture de ce type est l'architecture Raycore, dont nous parlerons dans les sections suivantes. Cette unité peut aussi modifier les BVH à la volée, si jamais la scène 3D change. Par exemple, si un objet change de place, comme un NPC qui se déplace, il faut reconstruire le BVH. Les cartes graphiques récentes évitent de reconstruire le BVH de zéro, mais se contentent de modifier ce qui a changé dans le BVH. Les performances en sont nettement meilleures. ==Un historique rapide des cartes graphiques dédiées au lancer de rayon== Les premières cartes accélératrices de lancer de rayons sont assez anciennes et datent des années 80-90. Leur évolution a plus ou moins suivi la même évolution que celle des cartes graphiques usuelles, sauf que très peu de cartes pour le lancer de rayons ont été produites. Par même évolution, on veut dire que les cartes graphiques pour le lancer de rayon ont commencé par tester deux solutions évidentes et extrêmes : les cartes basées sur des circuits programmables d'un côté, non programmables de l'autre. La première carte pour le lancer de rayons était la TigerShark, et elle était tout simplement composée de plusieurs processeurs et de la mémoire sur une carte PCI. Elle ne faisait qu'accélérer le calcul des intersections, rien de plus. Les autres cartes effectuaient du rendu 3D par voxel, un type de rendu 3D assez spécial que nous n'avons pas abordé jusqu'à présent, dont l'algorithme de lancer de rayons n'était qu'une petite partie du rendu. Elles étaient destinées au marché scientifique, industriel et médical. On peut notamment citer la VolumePro et la VIZARD et II. Les deux étaient des cartes pour bus PCI qui ne faisaient que du ''raycasting'' et n'utilisaient pas de rayons d'ombrage. Le ''raycasting'' était exécuté sur un processeur dédié sur la VIZARD II, sur un circuit fixe implémenté par un FPGA sur la Volume Pro Voici différents papiers académiques qui décrivent l'architecture de ces cartes accélératrices : * [https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=ccda3712ba0e6575cd08025f3bb920de46201cac The VolumePro Real-Time Ray-Casting System]. * [https://www.researchgate.net/publication/234829060_VIZARD_II_A_reconfigurable_interactive_volume_rendering_system VIZARD II: A reconfigurable interactive volume rendering system] La puce SaarCOR (Saarbrücken's Coherence Optimized Ray Tracer) et bien plus tard par la carte Raycore, étaient deux cartes réelement dédiées au raycasting pur, sans usage de voxels, et étaient basées sur des FPGA. Elles contenaient uniquement des circuits pour accélérer le lancer de rayon proprement dit, à savoir la génération des rayons, les calculs d'intersection, pas plus. Tout le reste, à savoir le rendu de la géométrie, le placage de textures, les ''shaders'' et autres, étaient effectués par le processeur. Voici des papiers académiques sur leur architecture : * [https://gamma.cs.unc.edu/SATO/Raycore/raycore.pdf RayCore: A ray-tracing hardware architecture for mobile devices]. Le successeur de la SaarCOR, le Ray Processing Unit (RPU), était une carte hybride : c'était une SaarCOR basée sur des circuits fixes, qui gagna quelques possibilités de programmation. Elle ajoutait des processeurs de ''shaders'' aux circuits fixes spécialisés pour le lancer de rayons. Les autres cartes du genre faisaient pareil, et on peut citer les cartes ART, les cartes CausticOne, Caustic Professional's R2500 et R2100. Les cartes 3D modernes permettent de faire à la fois de la rasterisation et du lancer de rayons. Pour cela, les GPU récents incorporent des unités pour effectuer des calculs d'intersection, qui sont réalisés dans des circuits spécialisés. Elles sont appelées des RT Cores sur les cartes NVIDIA, mais les cartes AMD et Intel ont leur équivalent, idem chez leurs concurrents de chez Imagination technologies, ainsi que sur certains GPU destinés au marché mobile. Peu de choses sont certaines sur ces unités, mais il semblerait qu'il s'agisse d'unités de textures modifiées. De ce qu'on en sait, certains GPU utilisent des unités pour calculer les intersections avec les triangles, et d'autres unités séparées pour calculer les intersections avec les volumes englobants. La raison est que, comme dit plus haut, les algorithmes de calcul d'intersection sont différents dans les deux cas. Les algorithmes utilisés ne sont pas connus pour toutes les cartes graphiques. On sait que les GPU Wizard de Imagination technology utilisaient des tests AABB de Plücker. Ils utilisaient 15 circuits de multiplication, 9 additionneurs-soustracteurs, quelques circuits pour tester la présence dans un intervalle, des circuits de normalisation et arrondi. L'algorithme pour leurs GPU d'architecture Photon est disponible ici, pour les curieux : [https://www.highperformancegraphics.org/slides23/2023-06-_HPG_IMG_RayTracing_2.pdf]. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les écritures en VRAM hors ROPs | prevText=Les écritures en VRAM hors ROPs | next=L'antialiasing | prevNext=L'antialiasing }}{{autocat}} </noinclude> 5dkgmk9qo2f3gznv01lyi8geqq79yax Les cartes graphiques/Les systèmes à framebuffer 0 81123 764860 748294 2026-04-24T17:40:07Z Mewtow 31375 /* Le splitscreen horizontal */ 764860 wikitext text/x-wiki Les cartes graphiques récentes utilisent une portion de la mémoire vidéo pour stocker l'image à afficher à l'écran. La portion de VRAM en question est appelée le '''''framebuffer''''', ou encore le '''tampon d'image'''. La mémoire vidéo peut aussi stocker d'autres informations importantes : les textures et les vertices de l'image à calculer, ainsi que divers résultats temporaires. Mais pour le moment, concentrons-nous sur le tampon d'image. La taille du ''framebuffer'' limite la résolution maximale atteignable. En effet, prenons une image dont la résolution est de 640 par 480 : l'image est composée de 480 lignes, chacune contenant 640 pixels. En tout, cela fait 640 * 480 = 307 200 pixels. Si chaque pixel est codé sur 32 bits, l'image prend donc 307 200 * 32 = 9 830 400 bits, soit 1 228 800 octets, ce qui fait 1200 kilo-octets, plus d'un méga-octet. Si la carte d'affichage a moins d'un méga-octet de mémoire vidéo, elle ne pourra pas afficher cette résolution, sauf en trichant. De manière générale, la mémoire prise par une image se calcule comme : nombre de pixels * taille d'un pixel, où le nombre de pixels de l’image se calcule à partir de la résolution (on multiplie la hauteur par la largeur de l'écran, les deux exprimées en pixels). ==Le codage des pixels dans le ''framebuffer''== Tout pixel est codé sur un certain nombre de bits, qui dépend du standard d'affichage utilisé. Dans un fichier image, les données sont compressées avec des algorithmes compliqués, ce qui a pour conséquence qu'un pixel est codé sur un nombre variable de bits. Certains vont l'être sur 5 bits, d'autres sur 16, d'autres sur 4, etc. Mais dans une carte graphique, ce n'est pas le cas. Une carte graphique n’intègre pas d'algorithme de compression d'image dans le ''framebuffer'', les images sont stockées décompressées. Tout pixel prend alors le même nombre de bit, ils ont tous une taille en binaire qui est fixe. ===Le codage des images monochromes=== À l'époque des toutes premières cartes graphiques, les écrans étaient monochromes et ne pouvait afficher que deux couleurs : blanc ou noir. De fait, il suffisait d'un seul bit pour coder la couleur d'un pixel : 0 codait blanc, 1 codait noir (ou l'inverse, peu importe). Par la suite, les niveaux de gris furent ajoutés, ce qui demanda d'ajouter des bits en plus. {|class="wikitable" |- ! 1 bit ! 2 bit ! 4 bit ! 8 bit |- | [[File:Bilevel 1bit palette sample image.png]] | [[File:Grayscale 2bit palette sample image.png]] | [[File:Grayscale 4bit palette sample image.png]] | [[File:Grayscale 8bits palette sample image.png]] |} Le cas le plus simple est celui des premiers modes CGA où 4 bits étaient utilisés pour indiquer la couleur : 1 bit pour chaque composante rouge, verte et bleue et 1 bit pour indiquer l'intensité (sombre / clair). ===La technique de la palette indicée=== [[File:Indexed palette.svg|vignette|upright=0.5|Palette indicée. En haut, on a le ''framebuffer'', qui contient les couleurs codées par des nombres. La table de correspondance est donnée au milieu, et l'image finale en bas.]] Avec l'apparition de la couleur, il fallut ruser pour coder les couleurs. Cela demandait d'utiliser plus de 1 bit par pixel : 2 bits permettaient de coder 4 couleurs, 3 bits codaient 8 couleurs, 4 bits codaient 16 couleurs, 8 bits codaient 256 couleurs, etc. Chaque combinaison de bit correspondait à une couleur et la carte d'affichage contenait une table de correspondance qui fait la correspondance entre un nombre et la couleur associée. Cette technique s'appelle la '''palette indicée''', la table de correspondance s'appelant la ''palette''. [[File:IBM16 Palette-en.svg|centre|vignette|upright=1|Palette de l'IBM16.]] L'implémentation de la ''palette indicée'' demande d'ajouter à la carte graphique une table de correspondance pour traduire les couleurs au format RGB. Elle s'appelait la '''''Color Look-up Table''''' (CLT) et est placée après la mémoire vidéo. Tout pixel qui sort de la mémoire vidéo est envoyé à la CLT, sur son entrée d'adresse. En réponse, elle fournit en sortie le pixel coloré, la couleur RGB voulue. Au tout début, la ''Color Look-up Table'' était une ROM qui mémorisait la couleur RGB pour chaque numéro envoyé en adresse. De ce fait, la table de correspondance était généralement fixée une bonne fois pour toute dans la carte d'affichage, dans un circuit dédié. Mais par la suite, les cartes d'affichage permirent de modifier la table de correspondance dynamiquement. La CLT était alors une mémoire SRAM, ce qui permettait de changer la palette à la volée. Les programmeurs pouvaient modifier son contenu, et ainsi changer la correspondance nombre-couleur à la volée. La SRAM est soit mappée en mémoire, soit accessible de manière indirecte par des commandes spécialisées. La ''Color Look-up Table'' était parfois fusionnée avec le DAC qui convertissait les pixels numériques en données analogiques : le tout formait ce qui s'appelait le '''RAMDAC'''. [[File:Color-lookup-table.png|centre|vignette|upright=2|Color-lookup-table]] Des applications différentes pouvaient ainsi utiliser des couleurs différentes, on pouvait adapter la palette en fonction de l'image à afficher, c'était aussi utilisé pour faire des animations sans avoir à modifier la mémoire vidéo. Les applications étaient multiples. En changeant le contenu de la palette, on pouvait réaliser des gradients mobiles, ou des animations assez simples : c'est la technique du '''''color cycling'''''. {|class="wikitable" |+ Exemples d'animations obtenues avec du color Cycling |- ! [[File:Mandelbrot Set Color Cycling Animation 400px.gif|150px|]] ! [[File:Color square cm.gif|150px|]] ! [[File:Mtree-spiral-11 nevit 25.gif|150px|]] ! [[File:-PLASMA-ColorCycling.Gif|150px|]] |} ===Le standard RGB et ses dérivés=== [[File:Barn grand tetons rgb separation.jpg|vignette|upright=0.5|Image codée en RGB : l'image est un mélange de trois images : une ne contenant que des nuances de rouge, une des nuances de vert, et la dernière uniquement des nuances de bleu.]] Au-delà de 8/12 bits, la technique de la palette n'est pas très intéressante car elle demande une table de correspondance assez grosse, donc beaucoup de mémoire. Ce qui fait que le codage des couleurs a dû prendre une autre direction quand la limite des 8 bits fût dépassée. L'idée pour contourner le problème est d'utiliser la synthèse additive des couleurs, que vous avez certainement vu au collège. Pour rappel, cela revient à synthétiser une couleur en mélangeant deux à trois couleurs primaires. La manière la plus simple de faire cela est de mélanger du Rouge, du Bleu, et du Vert. En appliquant cette méthode au codage des couleurs, on obtient le standard RGB (Red, Green, Blue). L'intensité du vert est codée par un nombre, idem pour le rouge et le bleu. Autrefois, il était courant de coder un pixel sur 8 bits, soit un octet : 2 bits étaient utilisés pour coder le bleu, 3 pour le rouge et 3 pour le vert. Le fait qu'on ait choisi seulement 2 bits pour le bleu s'explique par le fait que l’œil humain est peu sensible au bleu, mais est très sensible au rouge et au vert. Nous avons du mal à voir les nuances fines de bleu, contrairement aux nuances de vert et de rouge. Donc, sacrifier un bit pour le bleu n'est pas un problème. De nos jours, l'intensité d'une couleur primaire est codée sur 8 bits, soit un octet. Il suffit donc de 3 octets, soit 24 bits, pour coder une couleur. Une autre astuce pour économiser des bits est de se passer d'une des trois couleurs primaires, typiquement le bleu. En faisant cela, on code toutes les couleurs par un mélange de deux couleurs, le plus souvent du rouge et du vert. Vu que l’œil humain a du mal avec le bleu, c'est souvent la couleur bleu qui disparait, ce qui donne le ''standard RG''. En faisant cela, on économise les bits qui codent le bleu : si chaque couleur primaire est codée sur un octet, deux octets suffisent au lieu de trois avec le RGB usuel. {|class="wikitable" |- ! RGB 16 bits ! RG 16 bits |- |[[File:RGB 24bits palette sample image.jpg]] |[[File:RG 16bits palette sample image.png]] |} ==L'organisation du ''framebuffer''== Le ''framebuffer'' peut être organisé plusieurs manières différentes, mais deux grandes méthodes se dégagent. Elles portent les noms de ''framebuffer'' compact et de ''framebuffer'' planaire. La première est bien plus intuitive que la seconde, c'est sans doute celle qui vous viendrait à l'esprit en premier si vous réfléchissiez à la manière de stocker une image dans une RAM vidéo. Mais elle a quelques défauts qui ne se manifestent que sur les anciennes cartes graphiques, qui devaient faire avec des limitations en RAM assez importantes. Voyons cela en détail. ===Le ''framebuffer'' compact=== La toute première est celle du '''''packed framebuffer''''', ou encore du '''''framebuffer'' compact'''. Elle est très intuitive : les pixels sont placés les uns à côté des autres en mémoire. L'image est découpée en plusieurs lignes de pixels, deux pixels consécutifs sur une ligne sont placés à des adresses consécutives, deux lignes consécutives se suivent dans la mémoire. Cependant, un ''framebuffer'' compact a quelques problèmes sur les vielles cartes graphiques. Le ''framebuffer'' est placé dans une mémoire RAM, qui est adressable par octet. En clair, la mémoire est composée d'octets, qui ont chacun une adresse mémoire. Le processeur et la carte graphique peuvent lire ou écrire un octet à la fois, mais on ne peut pas modifier 1 bit isolé, ni des groupes de 2 ou 4 bits. La conséquence est qu'idéalement, un pixel doit faire au moins un octet. Avec un octet par pixel, on a alors 256 couleurs possibles par pixel, ce qui était beaucoup dans les années 80-90. Il est possible de coder un pixel sur 2, 3, 4 octets, au prix d'une consommation de mémoire 2, 3, ou 4 fois plus importante. Sur les cartes graphiques modernes, ca ne pose pas de problème. La mémoire vidéo est assez grande pour qu'on puisse attribuer entre 1 et 4 octets par pixel, parfois plus. Mais sur les anciennes cartes graphiques, ce n'était pas le cas. Par exemple, les cartes graphiques VGA disposaient de 256 kilo-octets de mémoire vidéo. Or, une simple image en résolution 640 par 480 contient 307 200 pixels, ce qui prend déjà 300 kilo-octets ! Il fallait donc limiter la taille des images, sans pour autant toucher à leur résolution. Et la seule solution était de réduire le nombre de bits par pixels. Typiquement, une solution était de stocker plusieurs pixels par octet, les seules solutions étant d'utiliser 1, 2 ou 4 bits par pixel. Utiliser 4 bits par pixel permettait de stocker deux pixels de 16 couleurs par octets. Il était aussi possible de stocker 2 bits par pixel, de stocker 4 pixels de 4 couleurs par octets. Le cas avec des pixels de 1 bit permettait de stocker 8 pixels monochromes (deux couleurs, typiquement blanc et noir). Mais c'était tout sauf pratique quand il fallait lire ou écrire des pixels en mémoire vidéo. L'écriture devait se faire par groupe de deux pixels, ce qui n'était pas pratique pour le programmeur. Pour écrire un seul pixel, la solution était de copier un octet dans un registre du processeur, de modifier uniquement un pixel dans cet octet, puis d'écrire le résultat en mémoire vidéo. Mais c'était très lent. Aussi, une autre solution a vu le jour, qui permettait d'encoder des pixels sur 2, 3, 4, 5, 6, 7 bits. Mais elle demandait de modifier la manière dont la mémoire RAM était utilisée pour stocker le ''framebuffer''. ===Les ''framebuffers'' planaires=== Une solution simple serait d'utiliser des mémoires qui ne sont pas composées d'octets, mais de groupes de 2/3/4/5/6/7 bits, chacun correspondant à un pixel. Mais il faudrait alors fabriquer ces mémoires sur-mesure pour une carte graphique bien précise. Une autre solution utilise des '''mémoires bit-adressables''', à savoir qu'il y a non pas un octet, mais un bit par adresse mémoire. Une telle mémoire permet de lire/écrire bit par bit, et non octet par octet. L'idée est alors de prendre 2/3/4/5/6/7 mémoires bit-adressables, et de les combiner pour simuler une mémoire composée de groupes de 2/3/4/5/6/7 bits. Prenons le cas où un pixel est codé sur 3 bits, qui sont appelés le bit de poids fort, le bit de poids intermédiaire et le bit de poids faible. Supposons qu'on veuille une mémoire qui soit capable de stocker 200 000 de pixels. Dans ce cas, on prend trois mémoires de 200 000 bits : la première mémoire stockera les bits de poids fort, une autre les bits de poids faible, et la dernière prendra les bits du milieu. Le principe se généralise pour des pixels codés sur N bits, sauf qu'il faudra alors N mémoires RAM. Les N mémoires RAM de 1 bit sont appelées des '''''bitplanes'''''. Une telle organisation est ce qu'on appelle un '''''planar framebuffer''''', aussi appelé un '''''framebuffer'' planaire'''. Disons-le clairement, la méthode est compliquée et pas intuitive, mais elle permet de coder des pixels sur 2, 3, 4, 5, 6, 7, 9, 11 bits ou autre. Elle n'est plus utilisée depuis que les cartes d'affichage se sont standardisées avec une taille des pixels multiple d'un octet. [[File:Vector-06c-video-memory.svg|centre|vignette|upright=2|Exemple de ''framebuffer'' planaire, provenant de l'ordinateur soviétique Vector-06c.]] Avec un ''framebuffer'' planaire, un pixel est répartit sur plusieurs mémoires, qu'il faut lire ou écrire simultanément. L’inconvénient que lire un pixel consomme plus d'énergie dans le cas général, car on accède à plusieurs mémoires simples au lieu d'une. Par contre, il est possible de modifier un ''bitplane'' indépendamment des autres, ce qui permet de faire certains effets graphiques simplement. La technique a le bon gout d'être assez simple à implémenter au niveau du matériel. Le seul défaut de cette technique, au niveau matériel, est qu'elle demande d'utiliser des mémoires bit-adressables. Dans les faits, de telles mémoires ne sont pas rares, mais elles sont plus rares que les mémoires adressables par octet. Nous verrons plus bas, quand nous étudierons le standard VGA, qu'il est possible d'émuler des mémoires bit-adressable avec des mémoires adressables par octet. Mais laissons cela à plus tard. Un exemple d'utilisation de ''planar framebuffer'' est l'ancien ordinateur/console de jeu Amiga Commodore. L'Amiga possédait 5 bits par pixel, donc disposait de 5 mémoires distinctes, et affichait 32 couleurs différentes. L'Amiga permettait de changer le nombre de bits nécessaires à la volée. Par exemple, si un jeu n'avait besoin que de quatre couleurs, seule deux plans/mémoires étaient utilisées. En conséquence, tout était plus rapide : les écritures dedans étaient alors accélérées, car on n'écrivait que 2 bits au lieu de 5. Et la RAM utilisée était limitée : au lieu de 5 bits par pixel, on n'en utilisait que 2, ce qui laissait trois plans de libre pour rendre des effets graphiques ou tout autre tache de calcul. Tout cela se généralise avec 3, 4, voire 1 seul bit d'utilisé. Un sixième bit était utilisé pour le rendu dans certains modes d'affichage. * Dans le mode '''''Extra-Half Brite''''' (EHB), le sixième bit indique s'il faut réduire la luminosité du pixel codé sur les 5 autres bits. S'il est mit à 1, la luminosité du pixel est divisée par deux, elle est inchangée s'il est à 0. * En mode '''double terrain de jeu''', les 6 bits sont séparés en deux ''framebuffer'' de 3 bits, qui sont modifiés indépendamment les uns des autres. Le calcul de l'image finale se fait en mélangeant les deux ''framebuffer'' d'une manière assez précise qui donne un rendu particulier. Les deux ''framebuffer'' sont scrollables séparément. * Le mode '''''Hold-And-Modify''''' (HAM) interprète les 6 bits en tant que 4 bits de couleur et 2 bits de contrôle qui indiquent comment modifier la couleur du pixel final. ==Le multibuffering et la synchronisation verticale== Sur les toutes premières cartes graphiques, le ''framebuffer'' ne pouvait contenir qu'une seule image. L'ordinateur écrivait donc une image dans le ''framebuffer'' et celle-ci était envoyée à l'écran dès que possible. Cependant, écran et ordinateur n'étaient pas forcément synchronisés. Rien n’empêchait à l’ordinateur d'écrire dans le ''framebuffer'' pendant que l'image était envoyée à l'écran. Et cela peut causer des artefacts qui se voient à l'écran. Un exemple typique est celui des traitements de texte. Lorsque le texte affiché est modifié, le traitement de texte efface l'image dans le ''framebuffer'' et recalcule la nouvelle image à afficher. Ce faisant, une image blanche peut apparaitre durant quelques millisecondes à l'écran, entre le moment où l'image précédente est effacée et le moment où la nouvelle image est disponible. Ce phénomène de ''flickering''; d'artefacts liés à une modification de l'image pendant qu'elle est affichée, est des plus désagréables. ===Le ''double buffering''=== Pour éviter cela, on peut utiliser la technique du '''''double buffering'''''. L'idée derrière cette technique est de calculer une image en avance et de les mémoriser celle-ci dans le ''framebuffer''. Mais cela demande que le ''framebuffer'' ait une taille suffisante, qu'il puisse mémoriser plusieurs images sans problèmes. Le ''framebuffer'' est alors divisé en deux portions, une par image, auxquelles nous donnerons le nom de tampons d'affichage. L'idée est de mémoriser l'image qui s'affiche à l'écran dans le premier tampon d'affichage et une image en cours de calcul dans le second. Le tampon pour l'image affichée s'appelle le tampon avant, ou encore le ''front buffer'', alors que celui avec l'image en cours de calcul s'appelle le ''back buffer''. [[File:Double buffering.png|centre|vignette|upright=2|Double buffering]] Quand l'image dans le ''back-buffer'' est complète, elle est copiée dans le ''front buffer'' pour être affichée. L'ancienne image dans le ''front buffer'' est donc éliminée au profit de la nouvelle image. Le remplacement peut se faire par une copie réelle, l'image étant copiée le premier tampon vers le second, ce qui est une opération très lente. C'est ce qui est fait quand le remplacement est réalisé par le logiciel, et non par la carte graphique elle-même. Par exemple, c'est ce qui se passait sur les très anciennes versions de Windows, pour afficher le bureau et l'interface graphique du système d'exploitation. Mais une solution plus simple consiste à intervertir les deux tampons, le ''back buffer'' devenant le ''front buffer'' et réciproquement. Une telle interversion fait qu'on a pas besoin de copier les données de l'image. L'interversion des deux tampons peut se faire au niveau matériel. ===La synchronisation verticale=== Lors de l'interversion des deux tampons, le remplacement de la première image par la seconde est très rapide. Et il peut avoir lieu pendant que l'écran affiche la première image. L'image affichée à l'écran est alors composée d'un morceau de la première image en haut, et de la seconde image en dessous. Cela produit un défaut d'affichage appelé le '''''tearing'''''. Plus votre ordinateur calcule d'images par secondes, plus le phénomène est exacerbé. [[File:Tearing (simulated).jpg|centre|vignette|upright=2|''Tearing'' (simulé)]] Pour éviter ça, on peut utiliser la '''synchronisation verticale''', aussi appelée vsync, dont vous en avez peut-être déjà entendu parler. C'est une option présente dans les options de nombreux jeux vidéo, ainsi que dans les réglages du pilote de la carte graphique. Elle consiste à attendre que l'image dans le ''front buffer'' soit entièrement affichée avant de faire le remplacement. La synchronisation verticale fait disparaitre le ''tearing'', mais elle a de nombreux défauts, qui s'expliquent pour deux raisons que nous allons aboder. Rappelons que l'écran affiche une nouvelle image à intervalles réguliers. L'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de "fréquence de rafraîchissement". La fréquence de rafraichissement est fixe, elle est gérée par un signal périodique dans l'écran. Par contre, sans Vsync, le nombre de FPS n'est pas limité, sauf si on a activé un limiteur de FPS dans les options d'un jeu vidéo ou dans les options du driver. Avec Vsync, le nombre de FPS est limité par la fréquence de l'écran. Par exemple, si vous avez un écran 60 Hz (sa fréquence de rafraichissement est de 60 Hertz), vous ne pourrez pas dépasser les 60 FPS. Vous pourrez avoir moins, cependant, si l'ordinateur ne peut pas sortir 60 images par secondes sans problème. Un autre défaut de la Vsync est donc qu'il faut un PC assez puissant pour calculer assez de FPS. Par contre, même avec la vsync activée, l'écran n'est pas parfaitement synchronisé avec la carte graphique. Pour comprendre pourquoi, nous allons faire une analogie avec une situation de la vie courante. Imaginez deux horloges, qui sonnent toutes les deux à midi. Les deux ont la même fréquence, à savoir qu'elles sonnent une fois toutes les 24 heures. Maintenant, cela ne signifie pas qu'elles sont synchronisées. Imaginez qu'une horloge indique 1 heure du matin pendant que l'autre indique minuit : les deux horloges sont désynchronisées, alors qu'elles ont la même fréquence. Il y a un décalage entre les deux horloges, un déphasage. Eh bien la même chose a lieu, avec la vsync. La vsync égalise deux fréquences : la fréquence de l'écran et les FPS (la fréquence de génération d'image par la carte graphique). Par contre, les deux fréquences sont généralement déphasées, il y a un délai entre le moment où la carte graphique a rendu une image, et le moment où l'écran affiche une image. Cela n'a l'air de rien, mais cela peut se ressentir. D'où l'impression qu'ont certains joueurs de jeux vidéo que leur souris est plus lente quand ils jouent avec la synchronisation verticale activée. Le temps d'attente lié à la synchronisation verticale dépend du nombre d'images par secondes. Pour un écran qui affiche maximum 60 images par seconde, le délai ajouté par la synchronisation verticale est au maximum de 1 seconde/60 = 16.666... millisecondes. Un autre défaut est que la synchronisation verticale entraîne des différences de timings perceptibles. Le phénomène se manifeste avec les vidéos/films encodés à 24 images par secondes qui s'affichent sur un écran à 60 Hz : l'écran affiche une image tous les 16.6666... millisecondes, alors que la vidéo veut afficher une image toutes les 41,666... millisecondes. Or, 16.666... et 41.666... n'ont pas de diviseur entier commun : une image de film d'affiche tous les 2,5 images d'écran. Concrètement, écran et film sont désynchronisés. Si cela ne pose pas trop de problèmes sans la synchronisation verticale, cela en pose avec. Une image sur deux est décalée en termes de timings avec la synchronisation verticale, ce qui donne un effet bizarre, bien que léger, lors du visionnage sur un écran d'ordinateur. Le même problème survient dans les jeux vidéos, qui ont un nombre d'images par seconde très variable. Ces différences de timings entraînent des sauts d'images quand un jeu vidéo calcule moins d'images par seconde que ce que peut accepter l'écran, ce qui donne une impression désagréable appelée le ''stuttering''. Pour résumer, les problèmes de la vsync sont liés à deux choses : le nombre de FPS n'est pas nécessairement synchronisé avec le rafraichissement de l'écran, et le déphasage entre ordinateur et écran se ressent. ===Le ''triple buffering'' et ses dérivés=== Diverses solutions existent pour éliminer ces problèmes, et elles sont assez nombreuses. La première solution ajoute un troisième tampon d'affichage, ce qui donne la technique du '''''triple buffering'''''. L'utilité est de réduire le délai ajouté par la synchronisation verticale : utiliser le ''triple buffering'' sans synchronisation verticale n'a aucun sens. L'idée est que l'ordinateur peut calculer une seconde image d'avance. Ainsi, si l'écran affiche l'image n°1, une image n°2 est terminée mais en attente, et une image n°3 est en cours de calcul. [[File:Triple buffering.png|centre|vignette|upright=2|Triple buffering]] Le délai lié à la synchronisation verticale est réduit dans le cas où les FPS sont vraiment bas comparé à la fréquence d'affichage de l'écran, par exemple si on tourne à 40 images par secondes sur un écran à 60 Hz, du fait de l'image calculée en avance. Dans le cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran, la troisième image finit son calcul avant que la seconde soit affichée. Dans ce cas, la seconde image est affichée avant la troisième. Il n'y a pas d'image supprimée ou abandonnée, peu importe la situation. ===Les améliorations de la synchronisation verticale=== La technologie '''''Fast Sync''''' sur les cartes graphiques NVIDIA est une amélioration du ''triple buffering'', qui se préoccupe du cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran. Dans ce cas, avec le ''triple buffering'' simple, aucune image n'est abandonnée : on a deux images en attente, dont l'une est plus récente que l'autre. La technologie ''fast sync'' élimine la première image en attente et de la remplacer par la seconde, plus récente. L'avantage est que le délai d'affichage d'une image est réduit, le temps d'attente lié à la synchronisation verticale étant réduit au strict minimum. Une autre solution est la '''synchronisation verticale adaptative''', qui consiste à désactiver la synchronisation verticale quand le nombre d'images par seconde descend sous la fréquence de rafraîchissement de l'écran. Le principe est simple, mais il s'agit pourtant d'une technologie assez récente, introduite en 2016 sur les cartes NVIDIA. Notons qu'on peut combiner cette technologie avec la technologie ''fast sync'' : cette dernière fonctionne quand les FPS dépassent la fréquence de rafraîchissement de l'écran, alors que la vsync adaptative fonctionne quand les FPS sont trop bas. C'est utile si les FPS sont très variables. Une dernière possibilité est d'utiliser des technologies qui permettent à l'écran et la carte graphique d'utiliser une '''fréquence de rafraîchissement variable'''. La fréquence de rafraîchissement de l'écran s'adapte en temps réel à celle de la carte graphique. En clair, l'écran démarre l'affichage d'une nouvelle image quand la carte graphique le lui demande, pas à intervalle régulier. Évidemment, l'écran a une limite physique et ne peut pas toujours suivre la carte graphique. Dans ce cas, la carte graphique limite les FPS au maximum de ce que peut l'écran. Les premières technologies de ce type étaient le Gsync de NVIDIA et le Free Sync d'AMD, qui ont été suivies par les standards AdaptiveSync et MediaSync. ==Les VDC des systèmes à ''framebuffer'' : les CRTC== Afficher une image à l'écran demande de prendre l'image dans le ''framebuffer'' et de l'envoyer à l'écran pixel par pixel. Pour cela, le VDC doit parcourir le ''framebuffer'' pour lire les pixels un par un, dans le bon ordre. Il existe des VDC qui sont capables de lire les pixels à envoyer à l'écran depuis la mémoire vidéo. Ils sont appelés des '''''Cathode Ray Tube Controler''''', ou CRTC. Leur nom vient du fait qu'ils servaient autrefois d'interface écran pour des écrans CRT. Ils gèrent des choses comme la résolution de l'écran, la fréquence d'affichage, le nombre de couleurs utilisés pour chaque pixel, etc. Pour résumer ce que fait un CRTC, les pixels sont lus les uns après les autres, ligne par ligne, en balayant le ''framebuffer''. Pour cela, ils génèrent l'adresse du pixel à lire, au rythme d'un pixel par cycle d'horloge. La génération d'adresse est assez simple si le ''framebuffer'' est coopératif. Il suffit de démarrer à une adresse bien précise, celle où commence le ''framebuffer'', et parcourir la mémoire dans l'ordre, en passant à l'adresse suivante à chaque cycle. Un simple compteur fait l'affaire. Pour cela, il utilise les deux compteurs de ligne et colonne pour forger l'adresse mémoire adéquate à chaque cycle. [[File:Architecture globale d'une carte d'affichage, avec CRTC.png|centre|vignette|upright=2|Architecture globale d'une carte d'affichage, avec CRTC.]] Une carte d'affichage se résume donc à un CRTC, une mémoire vidéo pour le ''framebuffer'', une mémoire SRAM pour la palette indicée, et éventuellement un convertisseur digital-analogique (DAC) sur les anciennes cartes d’affichage. Il faut évidemment ajouter un circuit de communication avec le bus, ainsi qu'une interface écran, pour compléter le tout. [[File:Architecture interne d'une carte d'affichage en mode graphique.png|centre|vignette|upright=2|Architecture interne d'une carte d'affichage en mode graphique]] ===Le pointeur de ''framebuffer''=== [[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]] Rappelons qu'un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Chaque pixel a deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. La carte graphique envoie le pixel (0,0) en premier, puis celui situé à gauche et ainsi de suite. Quand il a fini d'envoyer la ligne de pixel, il descend et reprend à la ligne suivante, tout à gauche. L'ordre de transfert est donc assez simple : ligne par ligne, de gauche à droite. [[File:Arraystatic.svg|vignette|Tableau bidimensionnel.]] Une méthode simple pour l'implémenter se base sur le fait que l'image à envoyer est stockée ligne par ligne dans la mémoire, avec les pixels d'une étant mémorisés dans l'ordre de balayage progressif. Les programmeurs appellent un tableau bi-dimensionnel. On peut récupérer un pixel en spécifiant les deux coordonnées X et Y, ce qui est l'idéal. Pour détailler un peu ce tableau bi-dimensionnel de pixels, c'est juste que les pixels consécutifs sur une ligne sont consécutifs en mémoire et les lignes consécutives sur l'écran le sont aussi dans la mémoire vidéo. En clair, il suffit de balayer la mémoire pixel par pixel en partant de l'adresse mémoire du premier pixel, jusqu’à atteindre la fin de l'image. Pour cela, il suffit d'utiliser un simple compteur d'adresse. Le compteur contient l'adresse, à savoir la position du pixel en mémoire. Il est initialisé avec l'adresse du premier pixel, il est incrémenté à chaque envoi de pixel, et il s’arrête une fois que l'image est totalement envoyée. La méthode en question est appelée la méthode du ''framebuffer pointer'', ou '''pointeur de ''framebuffer'''''. Le problème est qu'il faut gérer l'application des signaux de synchronisation verticale/horizontale. Le compteur d'adresse doit arrêter de compter pendant que ces signaux sont transmis. De plus, il faut tenir compte des timings, comme le temps pour remettre le canon à électrons d'un CRT au début de la ligne suivante. Rien d'insurmontable, mais il faut ajouter un circuit qui détermine si un signal de synchronisation HSYNC/VSYNC est à envoyer à l'écran, et stoppe le compteur si c'est le cas. ===La réutilisation des compteurs de ligne/colonne=== Une autre solution, qui se marie mieux avec les signaux de synchronisation, combine un pointeur de ''framebuffer'' avec les compteurs de ligne et de colonne vus dans la section précédente. Le contenu des compteurs de ligne et de colonne est envoyé à un circuit de calcul d'adresse, qui détermine la position du pixel à envoyer. L'adresse mémoire du pixel à afficher est calculée à partir de la valeur des deux compteurs, et de l'adresse du premier pixel. Le calcul de l'adresse prend en compte les timings, en n'accédant pas à la mémoire quand la valeur des compteurs dépasse celle de la résolution à rendre. Par exemple, pour une résolution de 640 par 480, le calcul d'adresse ne donne pas de résultat si le compteur de colonne dépasse 640 : c'est signe que le compteur envoie des signaux de synchronisation horizontale. [[File:CRTC et calcul d'adresse.png|centre|vignette|upright=2|CRTC et calcul d'adresse.]] Le tout peut être amélioré pour implémenter le ''double buffering''. Pour cela, il suffit d'utiliser deux registres pour l'adresse de base : un pour le ''front buffer'' et un autre pour le ''back buffer''. La carte vidéo choisit le bon registre à utiliser, ce qui permet de passer de l'un à l'autre en quelques cycles d'horloge. En changeant l'adresse pour la faire pointer vers l'ancien ''back buffer'', l’interversion se fait automatiquement. [[File:CRTC et double buffering.png|centre|vignette|upright=2|Circuit de contrôle et double buffering]] L'entrelacement est géré par le VDC, qui lit l'image à afficher une ligne sur deux en mémoire vidéo. Gérer l'entrelacement est donc un sujet qui implique l'écran mais aussi la carte d'affichage. Notamment, la lecture des pixels dans la mémoire vidéo se fait différemment. Le compteur de ligne est modifié de manière à avoir une séquence de comptage différente. Déjà, il compte deux par deux, pour sauter une ligne sur deux. De plus, quand il est réinitialisé, il est réinitialisé à une valeur qui est soit paire, soit impaire, en alternant. ==Le mode écran divisé (''splitscreen'')== L'affichage en '''''splitscreen''''' subdivise l'écran en rectangles qui affichent chacun une image différente. Les anciens jeux vidéo en faisaient usage pour le mode multijoueur local, où plusieurs manettes de jeu étaient reliées à une seule console de jeu, elle-même reliée à un seul écran. Pour un affrontement entre deux joueurs, l'écran était découpé en deux : la moitié haute de l'écran pour le premier joueur, la moitié basse pour le second joueur. Avec quatre joueurs, l'écran était découpé en quatre écrans. La console de jeu devait calculer 2 à 4 images, suivant le nombre de joueurs, et les combiner dans le ''framebuffer''. Chaque image avait une résolution deux à quatre fois plus basse, ce qui fait que la console avait assez de puissance de calcul pour les calculer. [[File:Speed Dreams splitscreen feature.png|centre|vignette|upright=2|Speed Dreams splitscreen feature]] Implémenter un affichage ''splitscreen'' se fait généralement sans support matériel. La console de jeu n'a pas grand-chose à faire pour le supporter, ce sont les jeux vidéos qui sont programmés pour effectuer un rendu de ce type. L'idée est de rendre plusieurs images de résolution inférieure et de les combiner pour obtenir le ''framebuffer'' final. Mais quelques cartes d'affichage implémentent des optimisations pour le ''splitscreen'' . Les optimisations ne permettent pas vraiment d'avoir un rendu plus rapide, du moins ce n'est pas leur objectif. Elles visent à rendre l'affichage ''splitscreen'' plus simple pour, le programmeur. ===Le ''splitscreen'' horizontal=== L'optimisation la plus intuitive ne marche que pour un affichage divisé simple : l'écran est coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'est pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans est configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Un tel ''splitscreen'' est appelé un '''''splitscreen'' horizontal'''. L'implémentation réutilise les registres du CRTC vus dans la section précédente : le compteur de ligne, le compteur de colonne, et les deux registres pour l'adresse de base. L'implémentation utilise deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. La ligne de démarcation est configurable grâce à un registre dédié, appelé le '''registre de ''splitscreen'''''. Le programmeur y écrit à quelle ligne se trouve la ligne de démarcation, son numéro de ligne. Quand le compteur de ligne et le registre de ''splitscreen'' sont égaux, c'est signe qu'il faut changer d'écran. A ce moment là, le parcours du ''framebuffer'' reprend à l'adresse de base. Le changement demande de simplement changer de registre d'adresse de base, mais aussi de réinitialiser les compteurs de ligne et de colonne (pour repartir à zéro). Sans registre de ''splitscreen'', le ''splitscreen'' horizontal est implémenté avec des ''raster interrupts'' qui seront détaillés plus loin. Et il est possible de combiner ''raster interrupts'' et registre de ''splitscreen''. Imaginez que vous vouliez découper un écran en plusieurs bandeaux horizontaux distincts. Un registre de ''splitscreen'' permet de couper l'écran en deux, mais pas en trois ou autre. Intuitivement, on se dit qu'il faudrait rajouter d'autres registres de ''splitscreen'', mais cela aurait un cout en circuits pour une utilisation très rare. Une autre solution est de changer le contenu du registre de ''splitscreen'' lors de l'affichage, grâce à des ''raster interrupts''. L'idée part d'un écran initialement coupé en deux. Le passage à la seconde partie de l'écran déclenche une ''raster interrupt''. Le processeur modifie alors les registres du CRTC, pour gérer l'affichage de la troisième portion de l'image. Le registre d'adresse de base, pointant initialement sur la première partie de l'image, pointe alors sur la troisième partie. Le registre de ''splitscreen'' est modifié de manière à pointer sur la seconde ligne de démarcation, celle entre la seconde partie de l'image et la troisième. Ainsi, lorsque la seconde ligne de démarcation sera atteinte, le hardware commutant d'image, et affichera automatiquement la troisième image. Supporter une quatrième image demande d'utiliser une autre ''raster interrupt'' lors du passage à la troisième partie de l'image, et ainsi de suite. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le Video Display Controler | prevText=Le Video Display Controler | next=Les cartes accélératrices 2D | nextText=Les cartes accélératrices 2D }}{{autocat}} </noinclude> h3ob405t16ya253zpwsk5r0n5wjxggo 764900 764860 2026-04-24T18:01:25Z Mewtow 31375 /* La technique de la palette indicée */ 764900 wikitext text/x-wiki Les cartes graphiques récentes utilisent une portion de la mémoire vidéo pour stocker l'image à afficher à l'écran. La portion de VRAM en question est appelée le '''''framebuffer''''', ou encore le '''tampon d'image'''. La mémoire vidéo peut aussi stocker d'autres informations importantes : les textures et les vertices de l'image à calculer, ainsi que divers résultats temporaires. Mais pour le moment, concentrons-nous sur le tampon d'image. La taille du ''framebuffer'' limite la résolution maximale atteignable. En effet, prenons une image dont la résolution est de 640 par 480 : l'image est composée de 480 lignes, chacune contenant 640 pixels. En tout, cela fait 640 * 480 = 307 200 pixels. Si chaque pixel est codé sur 32 bits, l'image prend donc 307 200 * 32 = 9 830 400 bits, soit 1 228 800 octets, ce qui fait 1200 kilo-octets, plus d'un méga-octet. Si la carte d'affichage a moins d'un méga-octet de mémoire vidéo, elle ne pourra pas afficher cette résolution, sauf en trichant. De manière générale, la mémoire prise par une image se calcule comme : nombre de pixels * taille d'un pixel, où le nombre de pixels de l’image se calcule à partir de la résolution (on multiplie la hauteur par la largeur de l'écran, les deux exprimées en pixels). ==Le codage des pixels dans le ''framebuffer''== Tout pixel est codé sur un certain nombre de bits, qui dépend du standard d'affichage utilisé. Dans un fichier image, les données sont compressées avec des algorithmes compliqués, ce qui a pour conséquence qu'un pixel est codé sur un nombre variable de bits. Certains vont l'être sur 5 bits, d'autres sur 16, d'autres sur 4, etc. Mais dans une carte graphique, ce n'est pas le cas. Une carte graphique n’intègre pas d'algorithme de compression d'image dans le ''framebuffer'', les images sont stockées décompressées. Tout pixel prend alors le même nombre de bit, ils ont tous une taille en binaire qui est fixe. ===Le codage des images monochromes=== À l'époque des toutes premières cartes graphiques, les écrans étaient monochromes et ne pouvait afficher que deux couleurs : blanc ou noir. De fait, il suffisait d'un seul bit pour coder la couleur d'un pixel : 0 codait blanc, 1 codait noir (ou l'inverse, peu importe). Par la suite, les niveaux de gris furent ajoutés, ce qui demanda d'ajouter des bits en plus. {|class="wikitable" |- ! 1 bit ! 2 bit ! 4 bit ! 8 bit |- | [[File:Bilevel 1bit palette sample image.png]] | [[File:Grayscale 2bit palette sample image.png]] | [[File:Grayscale 4bit palette sample image.png]] | [[File:Grayscale 8bits palette sample image.png]] |} Le cas le plus simple est celui des premiers modes CGA où 4 bits étaient utilisés pour indiquer la couleur : 1 bit pour chaque composante rouge, verte et bleue et 1 bit pour indiquer l'intensité (sombre / clair). ===La technique de la palette indicée=== [[File:Indexed palette.svg|vignette|upright=0.5|Palette indicée. En haut, on a le ''framebuffer'', qui contient les couleurs codées par des nombres. La table de correspondance est donnée au milieu, et l'image finale en bas.]] Avec l'apparition de la couleur, il fallut ruser pour coder les couleurs. Cela demandait d'utiliser plus de 1 bit par pixel : 2 bits permettaient de coder 4 couleurs, 3 bits codaient 8 couleurs, 4 bits codaient 16 couleurs, 8 bits codaient 256 couleurs, etc. Chaque combinaison de bit correspondait à une couleur et la carte d'affichage contenait une table de correspondance qui fait la correspondance entre un nombre et la couleur associée. Cette technique s'appelle la '''palette indicée''', la table de correspondance s'appelant la ''palette''. [[File:IBM16 Palette-en.svg|centre|vignette|upright=1|Palette de l'IBM16.]] L'implémentation de la ''palette indicée'' demande d'ajouter à la carte graphique une table de correspondance pour traduire les couleurs au format RGB. Elle s'appelait la '''''Color Look-up Table''''' (CLT) et est placée après la mémoire vidéo. Tout pixel qui sort de la mémoire vidéo est envoyé à la CLT, sur son entrée d'adresse. En réponse, elle fournit en sortie le pixel coloré, la couleur RGB voulue. Au tout début, la ''Color Look-up Table'' était une ROM qui mémorisait la couleur RGB pour chaque numéro envoyé en adresse. De ce fait, la table de correspondance était généralement fixée une bonne fois pour toute dans la carte d'affichage, dans un circuit dédié. Mais par la suite, les cartes d'affichage permirent de modifier la table de correspondance dynamiquement. La CLT était alors une mémoire SRAM, ce qui permettait de changer la palette à la volée. Les programmeurs pouvaient modifier son contenu, et ainsi changer la correspondance nombre-couleur à la volée. La SRAM est soit mappée en mémoire, soit accessible de manière indirecte par des commandes spécialisées. La ''Color Look-up Table'' était parfois fusionnée avec le DAC qui convertissait les pixels numériques en données analogiques : le tout formait ce qui s'appelait le '''RAMDAC'''. [[File:Color-lookup-table.png|centre|vignette|upright=2|Color-lookup-table]] Des applications différentes pouvaient ainsi utiliser des couleurs différentes, on pouvait adapter la palette en fonction de l'image à afficher, c'était aussi utilisé pour faire des animations sans avoir à modifier la mémoire vidéo. Les applications étaient multiples. En changeant le contenu de la palette, on pouvait réaliser des gradients mobiles, ou des animations assez simples : c'est la technique du '''''color cycling'''''. <noinclude> {|class="wikitable" |+ Exemples d'animations obtenues avec du color Cycling |- ! [[File:Mandelbrot Set Color Cycling Animation 400px.gif|150px|]] ! [[File:Color square cm.gif|150px|]] ! [[File:Mtree-spiral-11 nevit 25.gif|150px|]] ! [[File:-PLASMA-ColorCycling.Gif|150px|]] |} </noinclude> ===Le standard RGB et ses dérivés=== [[File:Barn grand tetons rgb separation.jpg|vignette|upright=0.5|Image codée en RGB : l'image est un mélange de trois images : une ne contenant que des nuances de rouge, une des nuances de vert, et la dernière uniquement des nuances de bleu.]] Au-delà de 8/12 bits, la technique de la palette n'est pas très intéressante car elle demande une table de correspondance assez grosse, donc beaucoup de mémoire. Ce qui fait que le codage des couleurs a dû prendre une autre direction quand la limite des 8 bits fût dépassée. L'idée pour contourner le problème est d'utiliser la synthèse additive des couleurs, que vous avez certainement vu au collège. Pour rappel, cela revient à synthétiser une couleur en mélangeant deux à trois couleurs primaires. La manière la plus simple de faire cela est de mélanger du Rouge, du Bleu, et du Vert. En appliquant cette méthode au codage des couleurs, on obtient le standard RGB (Red, Green, Blue). L'intensité du vert est codée par un nombre, idem pour le rouge et le bleu. Autrefois, il était courant de coder un pixel sur 8 bits, soit un octet : 2 bits étaient utilisés pour coder le bleu, 3 pour le rouge et 3 pour le vert. Le fait qu'on ait choisi seulement 2 bits pour le bleu s'explique par le fait que l’œil humain est peu sensible au bleu, mais est très sensible au rouge et au vert. Nous avons du mal à voir les nuances fines de bleu, contrairement aux nuances de vert et de rouge. Donc, sacrifier un bit pour le bleu n'est pas un problème. De nos jours, l'intensité d'une couleur primaire est codée sur 8 bits, soit un octet. Il suffit donc de 3 octets, soit 24 bits, pour coder une couleur. Une autre astuce pour économiser des bits est de se passer d'une des trois couleurs primaires, typiquement le bleu. En faisant cela, on code toutes les couleurs par un mélange de deux couleurs, le plus souvent du rouge et du vert. Vu que l’œil humain a du mal avec le bleu, c'est souvent la couleur bleu qui disparait, ce qui donne le ''standard RG''. En faisant cela, on économise les bits qui codent le bleu : si chaque couleur primaire est codée sur un octet, deux octets suffisent au lieu de trois avec le RGB usuel. {|class="wikitable" |- ! RGB 16 bits ! RG 16 bits |- |[[File:RGB 24bits palette sample image.jpg]] |[[File:RG 16bits palette sample image.png]] |} ==L'organisation du ''framebuffer''== Le ''framebuffer'' peut être organisé plusieurs manières différentes, mais deux grandes méthodes se dégagent. Elles portent les noms de ''framebuffer'' compact et de ''framebuffer'' planaire. La première est bien plus intuitive que la seconde, c'est sans doute celle qui vous viendrait à l'esprit en premier si vous réfléchissiez à la manière de stocker une image dans une RAM vidéo. Mais elle a quelques défauts qui ne se manifestent que sur les anciennes cartes graphiques, qui devaient faire avec des limitations en RAM assez importantes. Voyons cela en détail. ===Le ''framebuffer'' compact=== La toute première est celle du '''''packed framebuffer''''', ou encore du '''''framebuffer'' compact'''. Elle est très intuitive : les pixels sont placés les uns à côté des autres en mémoire. L'image est découpée en plusieurs lignes de pixels, deux pixels consécutifs sur une ligne sont placés à des adresses consécutives, deux lignes consécutives se suivent dans la mémoire. Cependant, un ''framebuffer'' compact a quelques problèmes sur les vielles cartes graphiques. Le ''framebuffer'' est placé dans une mémoire RAM, qui est adressable par octet. En clair, la mémoire est composée d'octets, qui ont chacun une adresse mémoire. Le processeur et la carte graphique peuvent lire ou écrire un octet à la fois, mais on ne peut pas modifier 1 bit isolé, ni des groupes de 2 ou 4 bits. La conséquence est qu'idéalement, un pixel doit faire au moins un octet. Avec un octet par pixel, on a alors 256 couleurs possibles par pixel, ce qui était beaucoup dans les années 80-90. Il est possible de coder un pixel sur 2, 3, 4 octets, au prix d'une consommation de mémoire 2, 3, ou 4 fois plus importante. Sur les cartes graphiques modernes, ca ne pose pas de problème. La mémoire vidéo est assez grande pour qu'on puisse attribuer entre 1 et 4 octets par pixel, parfois plus. Mais sur les anciennes cartes graphiques, ce n'était pas le cas. Par exemple, les cartes graphiques VGA disposaient de 256 kilo-octets de mémoire vidéo. Or, une simple image en résolution 640 par 480 contient 307 200 pixels, ce qui prend déjà 300 kilo-octets ! Il fallait donc limiter la taille des images, sans pour autant toucher à leur résolution. Et la seule solution était de réduire le nombre de bits par pixels. Typiquement, une solution était de stocker plusieurs pixels par octet, les seules solutions étant d'utiliser 1, 2 ou 4 bits par pixel. Utiliser 4 bits par pixel permettait de stocker deux pixels de 16 couleurs par octets. Il était aussi possible de stocker 2 bits par pixel, de stocker 4 pixels de 4 couleurs par octets. Le cas avec des pixels de 1 bit permettait de stocker 8 pixels monochromes (deux couleurs, typiquement blanc et noir). Mais c'était tout sauf pratique quand il fallait lire ou écrire des pixels en mémoire vidéo. L'écriture devait se faire par groupe de deux pixels, ce qui n'était pas pratique pour le programmeur. Pour écrire un seul pixel, la solution était de copier un octet dans un registre du processeur, de modifier uniquement un pixel dans cet octet, puis d'écrire le résultat en mémoire vidéo. Mais c'était très lent. Aussi, une autre solution a vu le jour, qui permettait d'encoder des pixels sur 2, 3, 4, 5, 6, 7 bits. Mais elle demandait de modifier la manière dont la mémoire RAM était utilisée pour stocker le ''framebuffer''. ===Les ''framebuffers'' planaires=== Une solution simple serait d'utiliser des mémoires qui ne sont pas composées d'octets, mais de groupes de 2/3/4/5/6/7 bits, chacun correspondant à un pixel. Mais il faudrait alors fabriquer ces mémoires sur-mesure pour une carte graphique bien précise. Une autre solution utilise des '''mémoires bit-adressables''', à savoir qu'il y a non pas un octet, mais un bit par adresse mémoire. Une telle mémoire permet de lire/écrire bit par bit, et non octet par octet. L'idée est alors de prendre 2/3/4/5/6/7 mémoires bit-adressables, et de les combiner pour simuler une mémoire composée de groupes de 2/3/4/5/6/7 bits. Prenons le cas où un pixel est codé sur 3 bits, qui sont appelés le bit de poids fort, le bit de poids intermédiaire et le bit de poids faible. Supposons qu'on veuille une mémoire qui soit capable de stocker 200 000 de pixels. Dans ce cas, on prend trois mémoires de 200 000 bits : la première mémoire stockera les bits de poids fort, une autre les bits de poids faible, et la dernière prendra les bits du milieu. Le principe se généralise pour des pixels codés sur N bits, sauf qu'il faudra alors N mémoires RAM. Les N mémoires RAM de 1 bit sont appelées des '''''bitplanes'''''. Une telle organisation est ce qu'on appelle un '''''planar framebuffer''''', aussi appelé un '''''framebuffer'' planaire'''. Disons-le clairement, la méthode est compliquée et pas intuitive, mais elle permet de coder des pixels sur 2, 3, 4, 5, 6, 7, 9, 11 bits ou autre. Elle n'est plus utilisée depuis que les cartes d'affichage se sont standardisées avec une taille des pixels multiple d'un octet. [[File:Vector-06c-video-memory.svg|centre|vignette|upright=2|Exemple de ''framebuffer'' planaire, provenant de l'ordinateur soviétique Vector-06c.]] Avec un ''framebuffer'' planaire, un pixel est répartit sur plusieurs mémoires, qu'il faut lire ou écrire simultanément. L’inconvénient que lire un pixel consomme plus d'énergie dans le cas général, car on accède à plusieurs mémoires simples au lieu d'une. Par contre, il est possible de modifier un ''bitplane'' indépendamment des autres, ce qui permet de faire certains effets graphiques simplement. La technique a le bon gout d'être assez simple à implémenter au niveau du matériel. Le seul défaut de cette technique, au niveau matériel, est qu'elle demande d'utiliser des mémoires bit-adressables. Dans les faits, de telles mémoires ne sont pas rares, mais elles sont plus rares que les mémoires adressables par octet. Nous verrons plus bas, quand nous étudierons le standard VGA, qu'il est possible d'émuler des mémoires bit-adressable avec des mémoires adressables par octet. Mais laissons cela à plus tard. Un exemple d'utilisation de ''planar framebuffer'' est l'ancien ordinateur/console de jeu Amiga Commodore. L'Amiga possédait 5 bits par pixel, donc disposait de 5 mémoires distinctes, et affichait 32 couleurs différentes. L'Amiga permettait de changer le nombre de bits nécessaires à la volée. Par exemple, si un jeu n'avait besoin que de quatre couleurs, seule deux plans/mémoires étaient utilisées. En conséquence, tout était plus rapide : les écritures dedans étaient alors accélérées, car on n'écrivait que 2 bits au lieu de 5. Et la RAM utilisée était limitée : au lieu de 5 bits par pixel, on n'en utilisait que 2, ce qui laissait trois plans de libre pour rendre des effets graphiques ou tout autre tache de calcul. Tout cela se généralise avec 3, 4, voire 1 seul bit d'utilisé. Un sixième bit était utilisé pour le rendu dans certains modes d'affichage. * Dans le mode '''''Extra-Half Brite''''' (EHB), le sixième bit indique s'il faut réduire la luminosité du pixel codé sur les 5 autres bits. S'il est mit à 1, la luminosité du pixel est divisée par deux, elle est inchangée s'il est à 0. * En mode '''double terrain de jeu''', les 6 bits sont séparés en deux ''framebuffer'' de 3 bits, qui sont modifiés indépendamment les uns des autres. Le calcul de l'image finale se fait en mélangeant les deux ''framebuffer'' d'une manière assez précise qui donne un rendu particulier. Les deux ''framebuffer'' sont scrollables séparément. * Le mode '''''Hold-And-Modify''''' (HAM) interprète les 6 bits en tant que 4 bits de couleur et 2 bits de contrôle qui indiquent comment modifier la couleur du pixel final. ==Le multibuffering et la synchronisation verticale== Sur les toutes premières cartes graphiques, le ''framebuffer'' ne pouvait contenir qu'une seule image. L'ordinateur écrivait donc une image dans le ''framebuffer'' et celle-ci était envoyée à l'écran dès que possible. Cependant, écran et ordinateur n'étaient pas forcément synchronisés. Rien n’empêchait à l’ordinateur d'écrire dans le ''framebuffer'' pendant que l'image était envoyée à l'écran. Et cela peut causer des artefacts qui se voient à l'écran. Un exemple typique est celui des traitements de texte. Lorsque le texte affiché est modifié, le traitement de texte efface l'image dans le ''framebuffer'' et recalcule la nouvelle image à afficher. Ce faisant, une image blanche peut apparaitre durant quelques millisecondes à l'écran, entre le moment où l'image précédente est effacée et le moment où la nouvelle image est disponible. Ce phénomène de ''flickering''; d'artefacts liés à une modification de l'image pendant qu'elle est affichée, est des plus désagréables. ===Le ''double buffering''=== Pour éviter cela, on peut utiliser la technique du '''''double buffering'''''. L'idée derrière cette technique est de calculer une image en avance et de les mémoriser celle-ci dans le ''framebuffer''. Mais cela demande que le ''framebuffer'' ait une taille suffisante, qu'il puisse mémoriser plusieurs images sans problèmes. Le ''framebuffer'' est alors divisé en deux portions, une par image, auxquelles nous donnerons le nom de tampons d'affichage. L'idée est de mémoriser l'image qui s'affiche à l'écran dans le premier tampon d'affichage et une image en cours de calcul dans le second. Le tampon pour l'image affichée s'appelle le tampon avant, ou encore le ''front buffer'', alors que celui avec l'image en cours de calcul s'appelle le ''back buffer''. [[File:Double buffering.png|centre|vignette|upright=2|Double buffering]] Quand l'image dans le ''back-buffer'' est complète, elle est copiée dans le ''front buffer'' pour être affichée. L'ancienne image dans le ''front buffer'' est donc éliminée au profit de la nouvelle image. Le remplacement peut se faire par une copie réelle, l'image étant copiée le premier tampon vers le second, ce qui est une opération très lente. C'est ce qui est fait quand le remplacement est réalisé par le logiciel, et non par la carte graphique elle-même. Par exemple, c'est ce qui se passait sur les très anciennes versions de Windows, pour afficher le bureau et l'interface graphique du système d'exploitation. Mais une solution plus simple consiste à intervertir les deux tampons, le ''back buffer'' devenant le ''front buffer'' et réciproquement. Une telle interversion fait qu'on a pas besoin de copier les données de l'image. L'interversion des deux tampons peut se faire au niveau matériel. ===La synchronisation verticale=== Lors de l'interversion des deux tampons, le remplacement de la première image par la seconde est très rapide. Et il peut avoir lieu pendant que l'écran affiche la première image. L'image affichée à l'écran est alors composée d'un morceau de la première image en haut, et de la seconde image en dessous. Cela produit un défaut d'affichage appelé le '''''tearing'''''. Plus votre ordinateur calcule d'images par secondes, plus le phénomène est exacerbé. [[File:Tearing (simulated).jpg|centre|vignette|upright=2|''Tearing'' (simulé)]] Pour éviter ça, on peut utiliser la '''synchronisation verticale''', aussi appelée vsync, dont vous en avez peut-être déjà entendu parler. C'est une option présente dans les options de nombreux jeux vidéo, ainsi que dans les réglages du pilote de la carte graphique. Elle consiste à attendre que l'image dans le ''front buffer'' soit entièrement affichée avant de faire le remplacement. La synchronisation verticale fait disparaitre le ''tearing'', mais elle a de nombreux défauts, qui s'expliquent pour deux raisons que nous allons aboder. Rappelons que l'écran affiche une nouvelle image à intervalles réguliers. L'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de "fréquence de rafraîchissement". La fréquence de rafraichissement est fixe, elle est gérée par un signal périodique dans l'écran. Par contre, sans Vsync, le nombre de FPS n'est pas limité, sauf si on a activé un limiteur de FPS dans les options d'un jeu vidéo ou dans les options du driver. Avec Vsync, le nombre de FPS est limité par la fréquence de l'écran. Par exemple, si vous avez un écran 60 Hz (sa fréquence de rafraichissement est de 60 Hertz), vous ne pourrez pas dépasser les 60 FPS. Vous pourrez avoir moins, cependant, si l'ordinateur ne peut pas sortir 60 images par secondes sans problème. Un autre défaut de la Vsync est donc qu'il faut un PC assez puissant pour calculer assez de FPS. Par contre, même avec la vsync activée, l'écran n'est pas parfaitement synchronisé avec la carte graphique. Pour comprendre pourquoi, nous allons faire une analogie avec une situation de la vie courante. Imaginez deux horloges, qui sonnent toutes les deux à midi. Les deux ont la même fréquence, à savoir qu'elles sonnent une fois toutes les 24 heures. Maintenant, cela ne signifie pas qu'elles sont synchronisées. Imaginez qu'une horloge indique 1 heure du matin pendant que l'autre indique minuit : les deux horloges sont désynchronisées, alors qu'elles ont la même fréquence. Il y a un décalage entre les deux horloges, un déphasage. Eh bien la même chose a lieu, avec la vsync. La vsync égalise deux fréquences : la fréquence de l'écran et les FPS (la fréquence de génération d'image par la carte graphique). Par contre, les deux fréquences sont généralement déphasées, il y a un délai entre le moment où la carte graphique a rendu une image, et le moment où l'écran affiche une image. Cela n'a l'air de rien, mais cela peut se ressentir. D'où l'impression qu'ont certains joueurs de jeux vidéo que leur souris est plus lente quand ils jouent avec la synchronisation verticale activée. Le temps d'attente lié à la synchronisation verticale dépend du nombre d'images par secondes. Pour un écran qui affiche maximum 60 images par seconde, le délai ajouté par la synchronisation verticale est au maximum de 1 seconde/60 = 16.666... millisecondes. Un autre défaut est que la synchronisation verticale entraîne des différences de timings perceptibles. Le phénomène se manifeste avec les vidéos/films encodés à 24 images par secondes qui s'affichent sur un écran à 60 Hz : l'écran affiche une image tous les 16.6666... millisecondes, alors que la vidéo veut afficher une image toutes les 41,666... millisecondes. Or, 16.666... et 41.666... n'ont pas de diviseur entier commun : une image de film d'affiche tous les 2,5 images d'écran. Concrètement, écran et film sont désynchronisés. Si cela ne pose pas trop de problèmes sans la synchronisation verticale, cela en pose avec. Une image sur deux est décalée en termes de timings avec la synchronisation verticale, ce qui donne un effet bizarre, bien que léger, lors du visionnage sur un écran d'ordinateur. Le même problème survient dans les jeux vidéos, qui ont un nombre d'images par seconde très variable. Ces différences de timings entraînent des sauts d'images quand un jeu vidéo calcule moins d'images par seconde que ce que peut accepter l'écran, ce qui donne une impression désagréable appelée le ''stuttering''. Pour résumer, les problèmes de la vsync sont liés à deux choses : le nombre de FPS n'est pas nécessairement synchronisé avec le rafraichissement de l'écran, et le déphasage entre ordinateur et écran se ressent. ===Le ''triple buffering'' et ses dérivés=== Diverses solutions existent pour éliminer ces problèmes, et elles sont assez nombreuses. La première solution ajoute un troisième tampon d'affichage, ce qui donne la technique du '''''triple buffering'''''. L'utilité est de réduire le délai ajouté par la synchronisation verticale : utiliser le ''triple buffering'' sans synchronisation verticale n'a aucun sens. L'idée est que l'ordinateur peut calculer une seconde image d'avance. Ainsi, si l'écran affiche l'image n°1, une image n°2 est terminée mais en attente, et une image n°3 est en cours de calcul. [[File:Triple buffering.png|centre|vignette|upright=2|Triple buffering]] Le délai lié à la synchronisation verticale est réduit dans le cas où les FPS sont vraiment bas comparé à la fréquence d'affichage de l'écran, par exemple si on tourne à 40 images par secondes sur un écran à 60 Hz, du fait de l'image calculée en avance. Dans le cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran, la troisième image finit son calcul avant que la seconde soit affichée. Dans ce cas, la seconde image est affichée avant la troisième. Il n'y a pas d'image supprimée ou abandonnée, peu importe la situation. ===Les améliorations de la synchronisation verticale=== La technologie '''''Fast Sync''''' sur les cartes graphiques NVIDIA est une amélioration du ''triple buffering'', qui se préoccupe du cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran. Dans ce cas, avec le ''triple buffering'' simple, aucune image n'est abandonnée : on a deux images en attente, dont l'une est plus récente que l'autre. La technologie ''fast sync'' élimine la première image en attente et de la remplacer par la seconde, plus récente. L'avantage est que le délai d'affichage d'une image est réduit, le temps d'attente lié à la synchronisation verticale étant réduit au strict minimum. Une autre solution est la '''synchronisation verticale adaptative''', qui consiste à désactiver la synchronisation verticale quand le nombre d'images par seconde descend sous la fréquence de rafraîchissement de l'écran. Le principe est simple, mais il s'agit pourtant d'une technologie assez récente, introduite en 2016 sur les cartes NVIDIA. Notons qu'on peut combiner cette technologie avec la technologie ''fast sync'' : cette dernière fonctionne quand les FPS dépassent la fréquence de rafraîchissement de l'écran, alors que la vsync adaptative fonctionne quand les FPS sont trop bas. C'est utile si les FPS sont très variables. Une dernière possibilité est d'utiliser des technologies qui permettent à l'écran et la carte graphique d'utiliser une '''fréquence de rafraîchissement variable'''. La fréquence de rafraîchissement de l'écran s'adapte en temps réel à celle de la carte graphique. En clair, l'écran démarre l'affichage d'une nouvelle image quand la carte graphique le lui demande, pas à intervalle régulier. Évidemment, l'écran a une limite physique et ne peut pas toujours suivre la carte graphique. Dans ce cas, la carte graphique limite les FPS au maximum de ce que peut l'écran. Les premières technologies de ce type étaient le Gsync de NVIDIA et le Free Sync d'AMD, qui ont été suivies par les standards AdaptiveSync et MediaSync. ==Les VDC des systèmes à ''framebuffer'' : les CRTC== Afficher une image à l'écran demande de prendre l'image dans le ''framebuffer'' et de l'envoyer à l'écran pixel par pixel. Pour cela, le VDC doit parcourir le ''framebuffer'' pour lire les pixels un par un, dans le bon ordre. Il existe des VDC qui sont capables de lire les pixels à envoyer à l'écran depuis la mémoire vidéo. Ils sont appelés des '''''Cathode Ray Tube Controler''''', ou CRTC. Leur nom vient du fait qu'ils servaient autrefois d'interface écran pour des écrans CRT. Ils gèrent des choses comme la résolution de l'écran, la fréquence d'affichage, le nombre de couleurs utilisés pour chaque pixel, etc. Pour résumer ce que fait un CRTC, les pixels sont lus les uns après les autres, ligne par ligne, en balayant le ''framebuffer''. Pour cela, ils génèrent l'adresse du pixel à lire, au rythme d'un pixel par cycle d'horloge. La génération d'adresse est assez simple si le ''framebuffer'' est coopératif. Il suffit de démarrer à une adresse bien précise, celle où commence le ''framebuffer'', et parcourir la mémoire dans l'ordre, en passant à l'adresse suivante à chaque cycle. Un simple compteur fait l'affaire. Pour cela, il utilise les deux compteurs de ligne et colonne pour forger l'adresse mémoire adéquate à chaque cycle. [[File:Architecture globale d'une carte d'affichage, avec CRTC.png|centre|vignette|upright=2|Architecture globale d'une carte d'affichage, avec CRTC.]] Une carte d'affichage se résume donc à un CRTC, une mémoire vidéo pour le ''framebuffer'', une mémoire SRAM pour la palette indicée, et éventuellement un convertisseur digital-analogique (DAC) sur les anciennes cartes d’affichage. Il faut évidemment ajouter un circuit de communication avec le bus, ainsi qu'une interface écran, pour compléter le tout. [[File:Architecture interne d'une carte d'affichage en mode graphique.png|centre|vignette|upright=2|Architecture interne d'une carte d'affichage en mode graphique]] ===Le pointeur de ''framebuffer''=== [[File:Array2.svg|vignette|upright=0.5|Coordonnées d'un pixel à l'écran.]] Rappelons qu'un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Chaque pixel a deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. La carte graphique envoie le pixel (0,0) en premier, puis celui situé à gauche et ainsi de suite. Quand il a fini d'envoyer la ligne de pixel, il descend et reprend à la ligne suivante, tout à gauche. L'ordre de transfert est donc assez simple : ligne par ligne, de gauche à droite. [[File:Arraystatic.svg|vignette|Tableau bidimensionnel.]] Une méthode simple pour l'implémenter se base sur le fait que l'image à envoyer est stockée ligne par ligne dans la mémoire, avec les pixels d'une étant mémorisés dans l'ordre de balayage progressif. Les programmeurs appellent un tableau bi-dimensionnel. On peut récupérer un pixel en spécifiant les deux coordonnées X et Y, ce qui est l'idéal. Pour détailler un peu ce tableau bi-dimensionnel de pixels, c'est juste que les pixels consécutifs sur une ligne sont consécutifs en mémoire et les lignes consécutives sur l'écran le sont aussi dans la mémoire vidéo. En clair, il suffit de balayer la mémoire pixel par pixel en partant de l'adresse mémoire du premier pixel, jusqu’à atteindre la fin de l'image. Pour cela, il suffit d'utiliser un simple compteur d'adresse. Le compteur contient l'adresse, à savoir la position du pixel en mémoire. Il est initialisé avec l'adresse du premier pixel, il est incrémenté à chaque envoi de pixel, et il s’arrête une fois que l'image est totalement envoyée. La méthode en question est appelée la méthode du ''framebuffer pointer'', ou '''pointeur de ''framebuffer'''''. Le problème est qu'il faut gérer l'application des signaux de synchronisation verticale/horizontale. Le compteur d'adresse doit arrêter de compter pendant que ces signaux sont transmis. De plus, il faut tenir compte des timings, comme le temps pour remettre le canon à électrons d'un CRT au début de la ligne suivante. Rien d'insurmontable, mais il faut ajouter un circuit qui détermine si un signal de synchronisation HSYNC/VSYNC est à envoyer à l'écran, et stoppe le compteur si c'est le cas. ===La réutilisation des compteurs de ligne/colonne=== Une autre solution, qui se marie mieux avec les signaux de synchronisation, combine un pointeur de ''framebuffer'' avec les compteurs de ligne et de colonne vus dans la section précédente. Le contenu des compteurs de ligne et de colonne est envoyé à un circuit de calcul d'adresse, qui détermine la position du pixel à envoyer. L'adresse mémoire du pixel à afficher est calculée à partir de la valeur des deux compteurs, et de l'adresse du premier pixel. Le calcul de l'adresse prend en compte les timings, en n'accédant pas à la mémoire quand la valeur des compteurs dépasse celle de la résolution à rendre. Par exemple, pour une résolution de 640 par 480, le calcul d'adresse ne donne pas de résultat si le compteur de colonne dépasse 640 : c'est signe que le compteur envoie des signaux de synchronisation horizontale. [[File:CRTC et calcul d'adresse.png|centre|vignette|upright=2|CRTC et calcul d'adresse.]] Le tout peut être amélioré pour implémenter le ''double buffering''. Pour cela, il suffit d'utiliser deux registres pour l'adresse de base : un pour le ''front buffer'' et un autre pour le ''back buffer''. La carte vidéo choisit le bon registre à utiliser, ce qui permet de passer de l'un à l'autre en quelques cycles d'horloge. En changeant l'adresse pour la faire pointer vers l'ancien ''back buffer'', l’interversion se fait automatiquement. [[File:CRTC et double buffering.png|centre|vignette|upright=2|Circuit de contrôle et double buffering]] L'entrelacement est géré par le VDC, qui lit l'image à afficher une ligne sur deux en mémoire vidéo. Gérer l'entrelacement est donc un sujet qui implique l'écran mais aussi la carte d'affichage. Notamment, la lecture des pixels dans la mémoire vidéo se fait différemment. Le compteur de ligne est modifié de manière à avoir une séquence de comptage différente. Déjà, il compte deux par deux, pour sauter une ligne sur deux. De plus, quand il est réinitialisé, il est réinitialisé à une valeur qui est soit paire, soit impaire, en alternant. ==Le mode écran divisé (''splitscreen'')== L'affichage en '''''splitscreen''''' subdivise l'écran en rectangles qui affichent chacun une image différente. Les anciens jeux vidéo en faisaient usage pour le mode multijoueur local, où plusieurs manettes de jeu étaient reliées à une seule console de jeu, elle-même reliée à un seul écran. Pour un affrontement entre deux joueurs, l'écran était découpé en deux : la moitié haute de l'écran pour le premier joueur, la moitié basse pour le second joueur. Avec quatre joueurs, l'écran était découpé en quatre écrans. La console de jeu devait calculer 2 à 4 images, suivant le nombre de joueurs, et les combiner dans le ''framebuffer''. Chaque image avait une résolution deux à quatre fois plus basse, ce qui fait que la console avait assez de puissance de calcul pour les calculer. [[File:Speed Dreams splitscreen feature.png|centre|vignette|upright=2|Speed Dreams splitscreen feature]] Implémenter un affichage ''splitscreen'' se fait généralement sans support matériel. La console de jeu n'a pas grand-chose à faire pour le supporter, ce sont les jeux vidéos qui sont programmés pour effectuer un rendu de ce type. L'idée est de rendre plusieurs images de résolution inférieure et de les combiner pour obtenir le ''framebuffer'' final. Mais quelques cartes d'affichage implémentent des optimisations pour le ''splitscreen'' . Les optimisations ne permettent pas vraiment d'avoir un rendu plus rapide, du moins ce n'est pas leur objectif. Elles visent à rendre l'affichage ''splitscreen'' plus simple pour, le programmeur. ===Le ''splitscreen'' horizontal=== L'optimisation la plus intuitive ne marche que pour un affichage divisé simple : l'écran est coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'est pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans est configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Un tel ''splitscreen'' est appelé un '''''splitscreen'' horizontal'''. L'implémentation réutilise les registres du CRTC vus dans la section précédente : le compteur de ligne, le compteur de colonne, et les deux registres pour l'adresse de base. L'implémentation utilise deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. La ligne de démarcation est configurable grâce à un registre dédié, appelé le '''registre de ''splitscreen'''''. Le programmeur y écrit à quelle ligne se trouve la ligne de démarcation, son numéro de ligne. Quand le compteur de ligne et le registre de ''splitscreen'' sont égaux, c'est signe qu'il faut changer d'écran. A ce moment là, le parcours du ''framebuffer'' reprend à l'adresse de base. Le changement demande de simplement changer de registre d'adresse de base, mais aussi de réinitialiser les compteurs de ligne et de colonne (pour repartir à zéro). Sans registre de ''splitscreen'', le ''splitscreen'' horizontal est implémenté avec des ''raster interrupts'' qui seront détaillés plus loin. Et il est possible de combiner ''raster interrupts'' et registre de ''splitscreen''. Imaginez que vous vouliez découper un écran en plusieurs bandeaux horizontaux distincts. Un registre de ''splitscreen'' permet de couper l'écran en deux, mais pas en trois ou autre. Intuitivement, on se dit qu'il faudrait rajouter d'autres registres de ''splitscreen'', mais cela aurait un cout en circuits pour une utilisation très rare. Une autre solution est de changer le contenu du registre de ''splitscreen'' lors de l'affichage, grâce à des ''raster interrupts''. L'idée part d'un écran initialement coupé en deux. Le passage à la seconde partie de l'écran déclenche une ''raster interrupt''. Le processeur modifie alors les registres du CRTC, pour gérer l'affichage de la troisième portion de l'image. Le registre d'adresse de base, pointant initialement sur la première partie de l'image, pointe alors sur la troisième partie. Le registre de ''splitscreen'' est modifié de manière à pointer sur la seconde ligne de démarcation, celle entre la seconde partie de l'image et la troisième. Ainsi, lorsque la seconde ligne de démarcation sera atteinte, le hardware commutant d'image, et affichera automatiquement la troisième image. Supporter une quatrième image demande d'utiliser une autre ''raster interrupt'' lors du passage à la troisième partie de l'image, et ainsi de suite. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le Video Display Controler | prevText=Le Video Display Controler | next=Les cartes accélératrices 2D | nextText=Les cartes accélératrices 2D }}{{autocat}} </noinclude> 1k0kimzg0gupfxs7q5t40vi4n9qhj4c 764901 764900 2026-04-24T18:01:44Z Mewtow 31375 /* Le pointeur de framebuffer */ 764901 wikitext text/x-wiki Les cartes graphiques récentes utilisent une portion de la mémoire vidéo pour stocker l'image à afficher à l'écran. La portion de VRAM en question est appelée le '''''framebuffer''''', ou encore le '''tampon d'image'''. La mémoire vidéo peut aussi stocker d'autres informations importantes : les textures et les vertices de l'image à calculer, ainsi que divers résultats temporaires. Mais pour le moment, concentrons-nous sur le tampon d'image. La taille du ''framebuffer'' limite la résolution maximale atteignable. En effet, prenons une image dont la résolution est de 640 par 480 : l'image est composée de 480 lignes, chacune contenant 640 pixels. En tout, cela fait 640 * 480 = 307 200 pixels. Si chaque pixel est codé sur 32 bits, l'image prend donc 307 200 * 32 = 9 830 400 bits, soit 1 228 800 octets, ce qui fait 1200 kilo-octets, plus d'un méga-octet. Si la carte d'affichage a moins d'un méga-octet de mémoire vidéo, elle ne pourra pas afficher cette résolution, sauf en trichant. De manière générale, la mémoire prise par une image se calcule comme : nombre de pixels * taille d'un pixel, où le nombre de pixels de l’image se calcule à partir de la résolution (on multiplie la hauteur par la largeur de l'écran, les deux exprimées en pixels). ==Le codage des pixels dans le ''framebuffer''== Tout pixel est codé sur un certain nombre de bits, qui dépend du standard d'affichage utilisé. Dans un fichier image, les données sont compressées avec des algorithmes compliqués, ce qui a pour conséquence qu'un pixel est codé sur un nombre variable de bits. Certains vont l'être sur 5 bits, d'autres sur 16, d'autres sur 4, etc. Mais dans une carte graphique, ce n'est pas le cas. Une carte graphique n’intègre pas d'algorithme de compression d'image dans le ''framebuffer'', les images sont stockées décompressées. Tout pixel prend alors le même nombre de bit, ils ont tous une taille en binaire qui est fixe. ===Le codage des images monochromes=== À l'époque des toutes premières cartes graphiques, les écrans étaient monochromes et ne pouvait afficher que deux couleurs : blanc ou noir. De fait, il suffisait d'un seul bit pour coder la couleur d'un pixel : 0 codait blanc, 1 codait noir (ou l'inverse, peu importe). Par la suite, les niveaux de gris furent ajoutés, ce qui demanda d'ajouter des bits en plus. {|class="wikitable" |- ! 1 bit ! 2 bit ! 4 bit ! 8 bit |- | [[File:Bilevel 1bit palette sample image.png]] | [[File:Grayscale 2bit palette sample image.png]] | [[File:Grayscale 4bit palette sample image.png]] | [[File:Grayscale 8bits palette sample image.png]] |} Le cas le plus simple est celui des premiers modes CGA où 4 bits étaient utilisés pour indiquer la couleur : 1 bit pour chaque composante rouge, verte et bleue et 1 bit pour indiquer l'intensité (sombre / clair). ===La technique de la palette indicée=== [[File:Indexed palette.svg|vignette|upright=0.5|Palette indicée. En haut, on a le ''framebuffer'', qui contient les couleurs codées par des nombres. La table de correspondance est donnée au milieu, et l'image finale en bas.]] Avec l'apparition de la couleur, il fallut ruser pour coder les couleurs. Cela demandait d'utiliser plus de 1 bit par pixel : 2 bits permettaient de coder 4 couleurs, 3 bits codaient 8 couleurs, 4 bits codaient 16 couleurs, 8 bits codaient 256 couleurs, etc. Chaque combinaison de bit correspondait à une couleur et la carte d'affichage contenait une table de correspondance qui fait la correspondance entre un nombre et la couleur associée. Cette technique s'appelle la '''palette indicée''', la table de correspondance s'appelant la ''palette''. [[File:IBM16 Palette-en.svg|centre|vignette|upright=1|Palette de l'IBM16.]] L'implémentation de la ''palette indicée'' demande d'ajouter à la carte graphique une table de correspondance pour traduire les couleurs au format RGB. Elle s'appelait la '''''Color Look-up Table''''' (CLT) et est placée après la mémoire vidéo. Tout pixel qui sort de la mémoire vidéo est envoyé à la CLT, sur son entrée d'adresse. En réponse, elle fournit en sortie le pixel coloré, la couleur RGB voulue. Au tout début, la ''Color Look-up Table'' était une ROM qui mémorisait la couleur RGB pour chaque numéro envoyé en adresse. De ce fait, la table de correspondance était généralement fixée une bonne fois pour toute dans la carte d'affichage, dans un circuit dédié. Mais par la suite, les cartes d'affichage permirent de modifier la table de correspondance dynamiquement. La CLT était alors une mémoire SRAM, ce qui permettait de changer la palette à la volée. Les programmeurs pouvaient modifier son contenu, et ainsi changer la correspondance nombre-couleur à la volée. La SRAM est soit mappée en mémoire, soit accessible de manière indirecte par des commandes spécialisées. La ''Color Look-up Table'' était parfois fusionnée avec le DAC qui convertissait les pixels numériques en données analogiques : le tout formait ce qui s'appelait le '''RAMDAC'''. [[File:Color-lookup-table.png|centre|vignette|upright=2|Color-lookup-table]] Des applications différentes pouvaient ainsi utiliser des couleurs différentes, on pouvait adapter la palette en fonction de l'image à afficher, c'était aussi utilisé pour faire des animations sans avoir à modifier la mémoire vidéo. Les applications étaient multiples. En changeant le contenu de la palette, on pouvait réaliser des gradients mobiles, ou des animations assez simples : c'est la technique du '''''color cycling'''''. <noinclude> {|class="wikitable" |+ Exemples d'animations obtenues avec du color Cycling |- ! [[File:Mandelbrot Set Color Cycling Animation 400px.gif|150px|]] ! [[File:Color square cm.gif|150px|]] ! [[File:Mtree-spiral-11 nevit 25.gif|150px|]] ! [[File:-PLASMA-ColorCycling.Gif|150px|]] |} </noinclude> ===Le standard RGB et ses dérivés=== [[File:Barn grand tetons rgb separation.jpg|vignette|upright=0.5|Image codée en RGB : l'image est un mélange de trois images : une ne contenant que des nuances de rouge, une des nuances de vert, et la dernière uniquement des nuances de bleu.]] Au-delà de 8/12 bits, la technique de la palette n'est pas très intéressante car elle demande une table de correspondance assez grosse, donc beaucoup de mémoire. Ce qui fait que le codage des couleurs a dû prendre une autre direction quand la limite des 8 bits fût dépassée. L'idée pour contourner le problème est d'utiliser la synthèse additive des couleurs, que vous avez certainement vu au collège. Pour rappel, cela revient à synthétiser une couleur en mélangeant deux à trois couleurs primaires. La manière la plus simple de faire cela est de mélanger du Rouge, du Bleu, et du Vert. En appliquant cette méthode au codage des couleurs, on obtient le standard RGB (Red, Green, Blue). L'intensité du vert est codée par un nombre, idem pour le rouge et le bleu. Autrefois, il était courant de coder un pixel sur 8 bits, soit un octet : 2 bits étaient utilisés pour coder le bleu, 3 pour le rouge et 3 pour le vert. Le fait qu'on ait choisi seulement 2 bits pour le bleu s'explique par le fait que l’œil humain est peu sensible au bleu, mais est très sensible au rouge et au vert. Nous avons du mal à voir les nuances fines de bleu, contrairement aux nuances de vert et de rouge. Donc, sacrifier un bit pour le bleu n'est pas un problème. De nos jours, l'intensité d'une couleur primaire est codée sur 8 bits, soit un octet. Il suffit donc de 3 octets, soit 24 bits, pour coder une couleur. Une autre astuce pour économiser des bits est de se passer d'une des trois couleurs primaires, typiquement le bleu. En faisant cela, on code toutes les couleurs par un mélange de deux couleurs, le plus souvent du rouge et du vert. Vu que l’œil humain a du mal avec le bleu, c'est souvent la couleur bleu qui disparait, ce qui donne le ''standard RG''. En faisant cela, on économise les bits qui codent le bleu : si chaque couleur primaire est codée sur un octet, deux octets suffisent au lieu de trois avec le RGB usuel. {|class="wikitable" |- ! RGB 16 bits ! RG 16 bits |- |[[File:RGB 24bits palette sample image.jpg]] |[[File:RG 16bits palette sample image.png]] |} ==L'organisation du ''framebuffer''== Le ''framebuffer'' peut être organisé plusieurs manières différentes, mais deux grandes méthodes se dégagent. Elles portent les noms de ''framebuffer'' compact et de ''framebuffer'' planaire. La première est bien plus intuitive que la seconde, c'est sans doute celle qui vous viendrait à l'esprit en premier si vous réfléchissiez à la manière de stocker une image dans une RAM vidéo. Mais elle a quelques défauts qui ne se manifestent que sur les anciennes cartes graphiques, qui devaient faire avec des limitations en RAM assez importantes. Voyons cela en détail. ===Le ''framebuffer'' compact=== La toute première est celle du '''''packed framebuffer''''', ou encore du '''''framebuffer'' compact'''. Elle est très intuitive : les pixels sont placés les uns à côté des autres en mémoire. L'image est découpée en plusieurs lignes de pixels, deux pixels consécutifs sur une ligne sont placés à des adresses consécutives, deux lignes consécutives se suivent dans la mémoire. Cependant, un ''framebuffer'' compact a quelques problèmes sur les vielles cartes graphiques. Le ''framebuffer'' est placé dans une mémoire RAM, qui est adressable par octet. En clair, la mémoire est composée d'octets, qui ont chacun une adresse mémoire. Le processeur et la carte graphique peuvent lire ou écrire un octet à la fois, mais on ne peut pas modifier 1 bit isolé, ni des groupes de 2 ou 4 bits. La conséquence est qu'idéalement, un pixel doit faire au moins un octet. Avec un octet par pixel, on a alors 256 couleurs possibles par pixel, ce qui était beaucoup dans les années 80-90. Il est possible de coder un pixel sur 2, 3, 4 octets, au prix d'une consommation de mémoire 2, 3, ou 4 fois plus importante. Sur les cartes graphiques modernes, ca ne pose pas de problème. La mémoire vidéo est assez grande pour qu'on puisse attribuer entre 1 et 4 octets par pixel, parfois plus. Mais sur les anciennes cartes graphiques, ce n'était pas le cas. Par exemple, les cartes graphiques VGA disposaient de 256 kilo-octets de mémoire vidéo. Or, une simple image en résolution 640 par 480 contient 307 200 pixels, ce qui prend déjà 300 kilo-octets ! Il fallait donc limiter la taille des images, sans pour autant toucher à leur résolution. Et la seule solution était de réduire le nombre de bits par pixels. Typiquement, une solution était de stocker plusieurs pixels par octet, les seules solutions étant d'utiliser 1, 2 ou 4 bits par pixel. Utiliser 4 bits par pixel permettait de stocker deux pixels de 16 couleurs par octets. Il était aussi possible de stocker 2 bits par pixel, de stocker 4 pixels de 4 couleurs par octets. Le cas avec des pixels de 1 bit permettait de stocker 8 pixels monochromes (deux couleurs, typiquement blanc et noir). Mais c'était tout sauf pratique quand il fallait lire ou écrire des pixels en mémoire vidéo. L'écriture devait se faire par groupe de deux pixels, ce qui n'était pas pratique pour le programmeur. Pour écrire un seul pixel, la solution était de copier un octet dans un registre du processeur, de modifier uniquement un pixel dans cet octet, puis d'écrire le résultat en mémoire vidéo. Mais c'était très lent. Aussi, une autre solution a vu le jour, qui permettait d'encoder des pixels sur 2, 3, 4, 5, 6, 7 bits. Mais elle demandait de modifier la manière dont la mémoire RAM était utilisée pour stocker le ''framebuffer''. ===Les ''framebuffers'' planaires=== Une solution simple serait d'utiliser des mémoires qui ne sont pas composées d'octets, mais de groupes de 2/3/4/5/6/7 bits, chacun correspondant à un pixel. Mais il faudrait alors fabriquer ces mémoires sur-mesure pour une carte graphique bien précise. Une autre solution utilise des '''mémoires bit-adressables''', à savoir qu'il y a non pas un octet, mais un bit par adresse mémoire. Une telle mémoire permet de lire/écrire bit par bit, et non octet par octet. L'idée est alors de prendre 2/3/4/5/6/7 mémoires bit-adressables, et de les combiner pour simuler une mémoire composée de groupes de 2/3/4/5/6/7 bits. Prenons le cas où un pixel est codé sur 3 bits, qui sont appelés le bit de poids fort, le bit de poids intermédiaire et le bit de poids faible. Supposons qu'on veuille une mémoire qui soit capable de stocker 200 000 de pixels. Dans ce cas, on prend trois mémoires de 200 000 bits : la première mémoire stockera les bits de poids fort, une autre les bits de poids faible, et la dernière prendra les bits du milieu. Le principe se généralise pour des pixels codés sur N bits, sauf qu'il faudra alors N mémoires RAM. Les N mémoires RAM de 1 bit sont appelées des '''''bitplanes'''''. Une telle organisation est ce qu'on appelle un '''''planar framebuffer''''', aussi appelé un '''''framebuffer'' planaire'''. Disons-le clairement, la méthode est compliquée et pas intuitive, mais elle permet de coder des pixels sur 2, 3, 4, 5, 6, 7, 9, 11 bits ou autre. Elle n'est plus utilisée depuis que les cartes d'affichage se sont standardisées avec une taille des pixels multiple d'un octet. [[File:Vector-06c-video-memory.svg|centre|vignette|upright=2|Exemple de ''framebuffer'' planaire, provenant de l'ordinateur soviétique Vector-06c.]] Avec un ''framebuffer'' planaire, un pixel est répartit sur plusieurs mémoires, qu'il faut lire ou écrire simultanément. L’inconvénient que lire un pixel consomme plus d'énergie dans le cas général, car on accède à plusieurs mémoires simples au lieu d'une. Par contre, il est possible de modifier un ''bitplane'' indépendamment des autres, ce qui permet de faire certains effets graphiques simplement. La technique a le bon gout d'être assez simple à implémenter au niveau du matériel. Le seul défaut de cette technique, au niveau matériel, est qu'elle demande d'utiliser des mémoires bit-adressables. Dans les faits, de telles mémoires ne sont pas rares, mais elles sont plus rares que les mémoires adressables par octet. Nous verrons plus bas, quand nous étudierons le standard VGA, qu'il est possible d'émuler des mémoires bit-adressable avec des mémoires adressables par octet. Mais laissons cela à plus tard. Un exemple d'utilisation de ''planar framebuffer'' est l'ancien ordinateur/console de jeu Amiga Commodore. L'Amiga possédait 5 bits par pixel, donc disposait de 5 mémoires distinctes, et affichait 32 couleurs différentes. L'Amiga permettait de changer le nombre de bits nécessaires à la volée. Par exemple, si un jeu n'avait besoin que de quatre couleurs, seule deux plans/mémoires étaient utilisées. En conséquence, tout était plus rapide : les écritures dedans étaient alors accélérées, car on n'écrivait que 2 bits au lieu de 5. Et la RAM utilisée était limitée : au lieu de 5 bits par pixel, on n'en utilisait que 2, ce qui laissait trois plans de libre pour rendre des effets graphiques ou tout autre tache de calcul. Tout cela se généralise avec 3, 4, voire 1 seul bit d'utilisé. Un sixième bit était utilisé pour le rendu dans certains modes d'affichage. * Dans le mode '''''Extra-Half Brite''''' (EHB), le sixième bit indique s'il faut réduire la luminosité du pixel codé sur les 5 autres bits. S'il est mit à 1, la luminosité du pixel est divisée par deux, elle est inchangée s'il est à 0. * En mode '''double terrain de jeu''', les 6 bits sont séparés en deux ''framebuffer'' de 3 bits, qui sont modifiés indépendamment les uns des autres. Le calcul de l'image finale se fait en mélangeant les deux ''framebuffer'' d'une manière assez précise qui donne un rendu particulier. Les deux ''framebuffer'' sont scrollables séparément. * Le mode '''''Hold-And-Modify''''' (HAM) interprète les 6 bits en tant que 4 bits de couleur et 2 bits de contrôle qui indiquent comment modifier la couleur du pixel final. ==Le multibuffering et la synchronisation verticale== Sur les toutes premières cartes graphiques, le ''framebuffer'' ne pouvait contenir qu'une seule image. L'ordinateur écrivait donc une image dans le ''framebuffer'' et celle-ci était envoyée à l'écran dès que possible. Cependant, écran et ordinateur n'étaient pas forcément synchronisés. Rien n’empêchait à l’ordinateur d'écrire dans le ''framebuffer'' pendant que l'image était envoyée à l'écran. Et cela peut causer des artefacts qui se voient à l'écran. Un exemple typique est celui des traitements de texte. Lorsque le texte affiché est modifié, le traitement de texte efface l'image dans le ''framebuffer'' et recalcule la nouvelle image à afficher. Ce faisant, une image blanche peut apparaitre durant quelques millisecondes à l'écran, entre le moment où l'image précédente est effacée et le moment où la nouvelle image est disponible. Ce phénomène de ''flickering''; d'artefacts liés à une modification de l'image pendant qu'elle est affichée, est des plus désagréables. ===Le ''double buffering''=== Pour éviter cela, on peut utiliser la technique du '''''double buffering'''''. L'idée derrière cette technique est de calculer une image en avance et de les mémoriser celle-ci dans le ''framebuffer''. Mais cela demande que le ''framebuffer'' ait une taille suffisante, qu'il puisse mémoriser plusieurs images sans problèmes. Le ''framebuffer'' est alors divisé en deux portions, une par image, auxquelles nous donnerons le nom de tampons d'affichage. L'idée est de mémoriser l'image qui s'affiche à l'écran dans le premier tampon d'affichage et une image en cours de calcul dans le second. Le tampon pour l'image affichée s'appelle le tampon avant, ou encore le ''front buffer'', alors que celui avec l'image en cours de calcul s'appelle le ''back buffer''. [[File:Double buffering.png|centre|vignette|upright=2|Double buffering]] Quand l'image dans le ''back-buffer'' est complète, elle est copiée dans le ''front buffer'' pour être affichée. L'ancienne image dans le ''front buffer'' est donc éliminée au profit de la nouvelle image. Le remplacement peut se faire par une copie réelle, l'image étant copiée le premier tampon vers le second, ce qui est une opération très lente. C'est ce qui est fait quand le remplacement est réalisé par le logiciel, et non par la carte graphique elle-même. Par exemple, c'est ce qui se passait sur les très anciennes versions de Windows, pour afficher le bureau et l'interface graphique du système d'exploitation. Mais une solution plus simple consiste à intervertir les deux tampons, le ''back buffer'' devenant le ''front buffer'' et réciproquement. Une telle interversion fait qu'on a pas besoin de copier les données de l'image. L'interversion des deux tampons peut se faire au niveau matériel. ===La synchronisation verticale=== Lors de l'interversion des deux tampons, le remplacement de la première image par la seconde est très rapide. Et il peut avoir lieu pendant que l'écran affiche la première image. L'image affichée à l'écran est alors composée d'un morceau de la première image en haut, et de la seconde image en dessous. Cela produit un défaut d'affichage appelé le '''''tearing'''''. Plus votre ordinateur calcule d'images par secondes, plus le phénomène est exacerbé. [[File:Tearing (simulated).jpg|centre|vignette|upright=2|''Tearing'' (simulé)]] Pour éviter ça, on peut utiliser la '''synchronisation verticale''', aussi appelée vsync, dont vous en avez peut-être déjà entendu parler. C'est une option présente dans les options de nombreux jeux vidéo, ainsi que dans les réglages du pilote de la carte graphique. Elle consiste à attendre que l'image dans le ''front buffer'' soit entièrement affichée avant de faire le remplacement. La synchronisation verticale fait disparaitre le ''tearing'', mais elle a de nombreux défauts, qui s'expliquent pour deux raisons que nous allons aboder. Rappelons que l'écran affiche une nouvelle image à intervalles réguliers. L'écran affiche un certain nombre d'images par secondes, le nombre en question étant désigné sous le terme de "fréquence de rafraîchissement". La fréquence de rafraichissement est fixe, elle est gérée par un signal périodique dans l'écran. Par contre, sans Vsync, le nombre de FPS n'est pas limité, sauf si on a activé un limiteur de FPS dans les options d'un jeu vidéo ou dans les options du driver. Avec Vsync, le nombre de FPS est limité par la fréquence de l'écran. Par exemple, si vous avez un écran 60 Hz (sa fréquence de rafraichissement est de 60 Hertz), vous ne pourrez pas dépasser les 60 FPS. Vous pourrez avoir moins, cependant, si l'ordinateur ne peut pas sortir 60 images par secondes sans problème. Un autre défaut de la Vsync est donc qu'il faut un PC assez puissant pour calculer assez de FPS. Par contre, même avec la vsync activée, l'écran n'est pas parfaitement synchronisé avec la carte graphique. Pour comprendre pourquoi, nous allons faire une analogie avec une situation de la vie courante. Imaginez deux horloges, qui sonnent toutes les deux à midi. Les deux ont la même fréquence, à savoir qu'elles sonnent une fois toutes les 24 heures. Maintenant, cela ne signifie pas qu'elles sont synchronisées. Imaginez qu'une horloge indique 1 heure du matin pendant que l'autre indique minuit : les deux horloges sont désynchronisées, alors qu'elles ont la même fréquence. Il y a un décalage entre les deux horloges, un déphasage. Eh bien la même chose a lieu, avec la vsync. La vsync égalise deux fréquences : la fréquence de l'écran et les FPS (la fréquence de génération d'image par la carte graphique). Par contre, les deux fréquences sont généralement déphasées, il y a un délai entre le moment où la carte graphique a rendu une image, et le moment où l'écran affiche une image. Cela n'a l'air de rien, mais cela peut se ressentir. D'où l'impression qu'ont certains joueurs de jeux vidéo que leur souris est plus lente quand ils jouent avec la synchronisation verticale activée. Le temps d'attente lié à la synchronisation verticale dépend du nombre d'images par secondes. Pour un écran qui affiche maximum 60 images par seconde, le délai ajouté par la synchronisation verticale est au maximum de 1 seconde/60 = 16.666... millisecondes. Un autre défaut est que la synchronisation verticale entraîne des différences de timings perceptibles. Le phénomène se manifeste avec les vidéos/films encodés à 24 images par secondes qui s'affichent sur un écran à 60 Hz : l'écran affiche une image tous les 16.6666... millisecondes, alors que la vidéo veut afficher une image toutes les 41,666... millisecondes. Or, 16.666... et 41.666... n'ont pas de diviseur entier commun : une image de film d'affiche tous les 2,5 images d'écran. Concrètement, écran et film sont désynchronisés. Si cela ne pose pas trop de problèmes sans la synchronisation verticale, cela en pose avec. Une image sur deux est décalée en termes de timings avec la synchronisation verticale, ce qui donne un effet bizarre, bien que léger, lors du visionnage sur un écran d'ordinateur. Le même problème survient dans les jeux vidéos, qui ont un nombre d'images par seconde très variable. Ces différences de timings entraînent des sauts d'images quand un jeu vidéo calcule moins d'images par seconde que ce que peut accepter l'écran, ce qui donne une impression désagréable appelée le ''stuttering''. Pour résumer, les problèmes de la vsync sont liés à deux choses : le nombre de FPS n'est pas nécessairement synchronisé avec le rafraichissement de l'écran, et le déphasage entre ordinateur et écran se ressent. ===Le ''triple buffering'' et ses dérivés=== Diverses solutions existent pour éliminer ces problèmes, et elles sont assez nombreuses. La première solution ajoute un troisième tampon d'affichage, ce qui donne la technique du '''''triple buffering'''''. L'utilité est de réduire le délai ajouté par la synchronisation verticale : utiliser le ''triple buffering'' sans synchronisation verticale n'a aucun sens. L'idée est que l'ordinateur peut calculer une seconde image d'avance. Ainsi, si l'écran affiche l'image n°1, une image n°2 est terminée mais en attente, et une image n°3 est en cours de calcul. [[File:Triple buffering.png|centre|vignette|upright=2|Triple buffering]] Le délai lié à la synchronisation verticale est réduit dans le cas où les FPS sont vraiment bas comparé à la fréquence d'affichage de l'écran, par exemple si on tourne à 40 images par secondes sur un écran à 60 Hz, du fait de l'image calculée en avance. Dans le cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran, la troisième image finit son calcul avant que la seconde soit affichée. Dans ce cas, la seconde image est affichée avant la troisième. Il n'y a pas d'image supprimée ou abandonnée, peu importe la situation. ===Les améliorations de la synchronisation verticale=== La technologie '''''Fast Sync''''' sur les cartes graphiques NVIDIA est une amélioration du ''triple buffering'', qui se préoccupe du cas où les FPS sont (temporairement) plus élevés que la fréquence d'affichage de l'écran. Dans ce cas, avec le ''triple buffering'' simple, aucune image n'est abandonnée : on a deux images en attente, dont l'une est plus récente que l'autre. La technologie ''fast sync'' élimine la première image en attente et de la remplacer par la seconde, plus récente. L'avantage est que le délai d'affichage d'une image est réduit, le temps d'attente lié à la synchronisation verticale étant réduit au strict minimum. Une autre solution est la '''synchronisation verticale adaptative''', qui consiste à désactiver la synchronisation verticale quand le nombre d'images par seconde descend sous la fréquence de rafraîchissement de l'écran. Le principe est simple, mais il s'agit pourtant d'une technologie assez récente, introduite en 2016 sur les cartes NVIDIA. Notons qu'on peut combiner cette technologie avec la technologie ''fast sync'' : cette dernière fonctionne quand les FPS dépassent la fréquence de rafraîchissement de l'écran, alors que la vsync adaptative fonctionne quand les FPS sont trop bas. C'est utile si les FPS sont très variables. Une dernière possibilité est d'utiliser des technologies qui permettent à l'écran et la carte graphique d'utiliser une '''fréquence de rafraîchissement variable'''. La fréquence de rafraîchissement de l'écran s'adapte en temps réel à celle de la carte graphique. En clair, l'écran démarre l'affichage d'une nouvelle image quand la carte graphique le lui demande, pas à intervalle régulier. Évidemment, l'écran a une limite physique et ne peut pas toujours suivre la carte graphique. Dans ce cas, la carte graphique limite les FPS au maximum de ce que peut l'écran. Les premières technologies de ce type étaient le Gsync de NVIDIA et le Free Sync d'AMD, qui ont été suivies par les standards AdaptiveSync et MediaSync. ==Les VDC des systèmes à ''framebuffer'' : les CRTC== Afficher une image à l'écran demande de prendre l'image dans le ''framebuffer'' et de l'envoyer à l'écran pixel par pixel. Pour cela, le VDC doit parcourir le ''framebuffer'' pour lire les pixels un par un, dans le bon ordre. Il existe des VDC qui sont capables de lire les pixels à envoyer à l'écran depuis la mémoire vidéo. Ils sont appelés des '''''Cathode Ray Tube Controler''''', ou CRTC. Leur nom vient du fait qu'ils servaient autrefois d'interface écran pour des écrans CRT. Ils gèrent des choses comme la résolution de l'écran, la fréquence d'affichage, le nombre de couleurs utilisés pour chaque pixel, etc. Pour résumer ce que fait un CRTC, les pixels sont lus les uns après les autres, ligne par ligne, en balayant le ''framebuffer''. Pour cela, ils génèrent l'adresse du pixel à lire, au rythme d'un pixel par cycle d'horloge. La génération d'adresse est assez simple si le ''framebuffer'' est coopératif. Il suffit de démarrer à une adresse bien précise, celle où commence le ''framebuffer'', et parcourir la mémoire dans l'ordre, en passant à l'adresse suivante à chaque cycle. Un simple compteur fait l'affaire. Pour cela, il utilise les deux compteurs de ligne et colonne pour forger l'adresse mémoire adéquate à chaque cycle. [[File:Architecture globale d'une carte d'affichage, avec CRTC.png|centre|vignette|upright=2|Architecture globale d'une carte d'affichage, avec CRTC.]] Une carte d'affichage se résume donc à un CRTC, une mémoire vidéo pour le ''framebuffer'', une mémoire SRAM pour la palette indicée, et éventuellement un convertisseur digital-analogique (DAC) sur les anciennes cartes d’affichage. Il faut évidemment ajouter un circuit de communication avec le bus, ainsi qu'une interface écran, pour compléter le tout. [[File:Architecture interne d'une carte d'affichage en mode graphique.png|centre|vignette|upright=2|Architecture interne d'une carte d'affichage en mode graphique]] ===Le pointeur de ''framebuffer''=== Rappelons qu'un écran est considéré par la carte graphique comme un tableau de pixels, organisé en lignes et en colonnes. Chaque pixel a deux coordonnées : sa position en largeur et en hauteur. Par convention, on suppose que le pixel de coordonnées (0,0) est celui situé tout haut et tout à gauche de l'écran. Le pixel de coordonnées (X,Y) est situé sur la X-ème colonne et la Y-ème ligne. Le tout est illustré ci-contre. Avec le '''balayage progressif''', la carte graphique doit envoyer les pixels ligne par ligne, colonne par colonne : de haut en bas et de gauche à droite. La carte graphique envoie le pixel (0,0) en premier, puis celui situé à gauche et ainsi de suite. Quand il a fini d'envoyer la ligne de pixel, il descend et reprend à la ligne suivante, tout à gauche. L'ordre de transfert est donc assez simple : ligne par ligne, de gauche à droite. [[File:Arraystatic.svg|vignette|Tableau bidimensionnel.]] Une méthode simple pour l'implémenter se base sur le fait que l'image à envoyer est stockée ligne par ligne dans la mémoire, avec les pixels d'une étant mémorisés dans l'ordre de balayage progressif. Les programmeurs appellent un tableau bi-dimensionnel. On peut récupérer un pixel en spécifiant les deux coordonnées X et Y, ce qui est l'idéal. Pour détailler un peu ce tableau bi-dimensionnel de pixels, c'est juste que les pixels consécutifs sur une ligne sont consécutifs en mémoire et les lignes consécutives sur l'écran le sont aussi dans la mémoire vidéo. En clair, il suffit de balayer la mémoire pixel par pixel en partant de l'adresse mémoire du premier pixel, jusqu’à atteindre la fin de l'image. Pour cela, il suffit d'utiliser un simple compteur d'adresse. Le compteur contient l'adresse, à savoir la position du pixel en mémoire. Il est initialisé avec l'adresse du premier pixel, il est incrémenté à chaque envoi de pixel, et il s’arrête une fois que l'image est totalement envoyée. La méthode en question est appelée la méthode du ''framebuffer pointer'', ou '''pointeur de ''framebuffer'''''. Le problème est qu'il faut gérer l'application des signaux de synchronisation verticale/horizontale. Le compteur d'adresse doit arrêter de compter pendant que ces signaux sont transmis. De plus, il faut tenir compte des timings, comme le temps pour remettre le canon à électrons d'un CRT au début de la ligne suivante. Rien d'insurmontable, mais il faut ajouter un circuit qui détermine si un signal de synchronisation HSYNC/VSYNC est à envoyer à l'écran, et stoppe le compteur si c'est le cas. ===La réutilisation des compteurs de ligne/colonne=== Une autre solution, qui se marie mieux avec les signaux de synchronisation, combine un pointeur de ''framebuffer'' avec les compteurs de ligne et de colonne vus dans la section précédente. Le contenu des compteurs de ligne et de colonne est envoyé à un circuit de calcul d'adresse, qui détermine la position du pixel à envoyer. L'adresse mémoire du pixel à afficher est calculée à partir de la valeur des deux compteurs, et de l'adresse du premier pixel. Le calcul de l'adresse prend en compte les timings, en n'accédant pas à la mémoire quand la valeur des compteurs dépasse celle de la résolution à rendre. Par exemple, pour une résolution de 640 par 480, le calcul d'adresse ne donne pas de résultat si le compteur de colonne dépasse 640 : c'est signe que le compteur envoie des signaux de synchronisation horizontale. [[File:CRTC et calcul d'adresse.png|centre|vignette|upright=2|CRTC et calcul d'adresse.]] Le tout peut être amélioré pour implémenter le ''double buffering''. Pour cela, il suffit d'utiliser deux registres pour l'adresse de base : un pour le ''front buffer'' et un autre pour le ''back buffer''. La carte vidéo choisit le bon registre à utiliser, ce qui permet de passer de l'un à l'autre en quelques cycles d'horloge. En changeant l'adresse pour la faire pointer vers l'ancien ''back buffer'', l’interversion se fait automatiquement. [[File:CRTC et double buffering.png|centre|vignette|upright=2|Circuit de contrôle et double buffering]] L'entrelacement est géré par le VDC, qui lit l'image à afficher une ligne sur deux en mémoire vidéo. Gérer l'entrelacement est donc un sujet qui implique l'écran mais aussi la carte d'affichage. Notamment, la lecture des pixels dans la mémoire vidéo se fait différemment. Le compteur de ligne est modifié de manière à avoir une séquence de comptage différente. Déjà, il compte deux par deux, pour sauter une ligne sur deux. De plus, quand il est réinitialisé, il est réinitialisé à une valeur qui est soit paire, soit impaire, en alternant. ==Le mode écran divisé (''splitscreen'')== L'affichage en '''''splitscreen''''' subdivise l'écran en rectangles qui affichent chacun une image différente. Les anciens jeux vidéo en faisaient usage pour le mode multijoueur local, où plusieurs manettes de jeu étaient reliées à une seule console de jeu, elle-même reliée à un seul écran. Pour un affrontement entre deux joueurs, l'écran était découpé en deux : la moitié haute de l'écran pour le premier joueur, la moitié basse pour le second joueur. Avec quatre joueurs, l'écran était découpé en quatre écrans. La console de jeu devait calculer 2 à 4 images, suivant le nombre de joueurs, et les combiner dans le ''framebuffer''. Chaque image avait une résolution deux à quatre fois plus basse, ce qui fait que la console avait assez de puissance de calcul pour les calculer. [[File:Speed Dreams splitscreen feature.png|centre|vignette|upright=2|Speed Dreams splitscreen feature]] Implémenter un affichage ''splitscreen'' se fait généralement sans support matériel. La console de jeu n'a pas grand-chose à faire pour le supporter, ce sont les jeux vidéos qui sont programmés pour effectuer un rendu de ce type. L'idée est de rendre plusieurs images de résolution inférieure et de les combiner pour obtenir le ''framebuffer'' final. Mais quelques cartes d'affichage implémentent des optimisations pour le ''splitscreen'' . Les optimisations ne permettent pas vraiment d'avoir un rendu plus rapide, du moins ce n'est pas leur objectif. Elles visent à rendre l'affichage ''splitscreen'' plus simple pour, le programmeur. ===Le ''splitscreen'' horizontal=== L'optimisation la plus intuitive ne marche que pour un affichage divisé simple : l'écran est coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'est pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans est configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Un tel ''splitscreen'' est appelé un '''''splitscreen'' horizontal'''. L'implémentation réutilise les registres du CRTC vus dans la section précédente : le compteur de ligne, le compteur de colonne, et les deux registres pour l'adresse de base. L'implémentation utilise deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. La ligne de démarcation est configurable grâce à un registre dédié, appelé le '''registre de ''splitscreen'''''. Le programmeur y écrit à quelle ligne se trouve la ligne de démarcation, son numéro de ligne. Quand le compteur de ligne et le registre de ''splitscreen'' sont égaux, c'est signe qu'il faut changer d'écran. A ce moment là, le parcours du ''framebuffer'' reprend à l'adresse de base. Le changement demande de simplement changer de registre d'adresse de base, mais aussi de réinitialiser les compteurs de ligne et de colonne (pour repartir à zéro). Sans registre de ''splitscreen'', le ''splitscreen'' horizontal est implémenté avec des ''raster interrupts'' qui seront détaillés plus loin. Et il est possible de combiner ''raster interrupts'' et registre de ''splitscreen''. Imaginez que vous vouliez découper un écran en plusieurs bandeaux horizontaux distincts. Un registre de ''splitscreen'' permet de couper l'écran en deux, mais pas en trois ou autre. Intuitivement, on se dit qu'il faudrait rajouter d'autres registres de ''splitscreen'', mais cela aurait un cout en circuits pour une utilisation très rare. Une autre solution est de changer le contenu du registre de ''splitscreen'' lors de l'affichage, grâce à des ''raster interrupts''. L'idée part d'un écran initialement coupé en deux. Le passage à la seconde partie de l'écran déclenche une ''raster interrupt''. Le processeur modifie alors les registres du CRTC, pour gérer l'affichage de la troisième portion de l'image. Le registre d'adresse de base, pointant initialement sur la première partie de l'image, pointe alors sur la troisième partie. Le registre de ''splitscreen'' est modifié de manière à pointer sur la seconde ligne de démarcation, celle entre la seconde partie de l'image et la troisième. Ainsi, lorsque la seconde ligne de démarcation sera atteinte, le hardware commutant d'image, et affichera automatiquement la troisième image. Supporter une quatrième image demande d'utiliser une autre ''raster interrupt'' lors du passage à la troisième partie de l'image, et ainsi de suite. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le Video Display Controler | prevText=Le Video Display Controler | next=Les cartes accélératrices 2D | nextText=Les cartes accélératrices 2D }}{{autocat}} </noinclude> oofoj0uhd6q7hdr8ditbihbhk0bjycc Les cartes graphiques/Les Video Display Controler atypiques 0 81131 764865 746669 2026-04-24T17:43:41Z Mewtow 31375 /* Le double VDC de la SuperGrafx */ 764865 wikitext text/x-wiki Nous avions vu dans le chapitre précédent qu'il existe plusieurs types de VDC. Dans les chapitres précédents, nous avons abordé les CRTC des systèmes à ''framebuffer'', ainsi que des VDC à tile et ceux à tampon de ligne. Dans ce chapitre, nous allons voir des VDC ou des systèmes graphiques originaux. ==Le rendu des ''sprites'' sur la borne d'arcade CPS-1== La borne d'arcade CPS-1 avait une méthode rendu assez particulière. Contrairement aux VDC normaux, sa carte graphique rendait les ''sprites'' séparément. Elle avait un ''framebuffer'' dédié au rendu des ''sprite'', qui était combiné avec l'arrière-plan pour donner l'image finale. La carte graphique lisait les ''sprites'' depuis la mémoire vidéo et les plaçait dans ce second ''framebuffer'', pour donner une image sans l'arrière-plan. La combinaison se faisait au moment d'afficher l'image, lors du rendu d'une ligne à l'écran. Un inconvénient de cette méthode est que le rendu du ''framebuffer'' pour les ''sprites'' se faisait pendant le rendu de l'image précédente. En clair, pendant que le GPU affichait une image à l'écran, le VDC accédait à la mémoire vidéo pour lire les ''sprites'' et calculer ce second ''framebuffer''. Le résultat était qu'il y avait une sorte de retard d'une ''frame'' pour les ''sprites'', donc un léger ''input lag''. Un second inconvénient est le cout en hardware. Le second ''framebuffer'' avait sa propre mémoire RAM séparée du reste, d'une capacité mémoire de 384 kilo-octets. Cela coutait cher, mais les bornes d'arcade de l'époque se moquaient un peu de ces considérations, vu leur prix élevé. L'avantage est que les limitations en matière de ''sprite'' par ligne n'existent pas sur ce système. Les autres systèmes de l'époque devaient faire avec une limite de ''sprite'' par ligne, que les développeurs contournaient en éteignant certains ''sprites'' une image sur deux, donnant un effet de clignotement. De son côté, le CPS-1 avait juste une limite par image, et une limite par image assez élevée qui plus est. Les jeux sur CPS-1 n'avaient donc pas d'effets de clignotement. Par contre, les développeurs devaient faire avec la limitation de ''sprite'' par image. Autant cette limite n'était pas pertinente, grâce au ''raster effects'', autant elle limitait les graphismes sur la CPS-1 car le ''swap'' des ''sprites'' à la volée lors de l'affichage n'était pas possible. Pour résumer, la CPS-1 échangeait une limitation de ''sprite'' par ligne pour une limitation de ''sprite'' par image. ==Le double VDC de la SuperGrafx== La console de jeu SuperGrafx est le successeur spirituel de la console PC-Engine, aussi appelée Turbo Graphx en occident. Elle a le même CPU, la même quantité de mémoire RAM, le même VDC 2D. Voici l'architecture de la Turbo Graphx, qui est assez simple. Un CPU, une puce sonore, un VDC, un circuit pour la palette et l'interface écran séparé du VDC, une RAM pour le CPU et une mémoire vidéo reliée au VDC. La ROM du système est dans la cartouche de jeu. [[File:Turbo graphx.png|centre|vignette|upright=2.5|Turbo graphx]] La Super Graphx a une grosse différence : elle a deux VDC identiques ! L'objectif des concepteurs de la console était de doubler la puissance graphique et la solution la plus simple était évidemment de dupliquer le VDC... La console avait donc deux VDC identique à ceux de la PC-Engine, à savoir deux HuC6270. La mémoire vidéo est elle aussi dupliquée, à savoir que chaque VDC dispose de sa propre mémoire vidéo de 64 kilo-octets. Les deux VDC calculent une image séparée chacun de leur côté, puis les deux images sont fusionnées pour donner l'image finale. L'intérêt est que cela permet d'avoir deux fois plus d'arrière-plan et de ''sprite'', si la fusion est gérée correctement. La fusion est réalisée par un circuit séparé, appelé le VPC (''Video Priority Controler''). À chaque pixel de l'écran, il choisit si ce pixel provient du premier VDC ou du second. Le tout est géré par un système qui dit quel écran a la priorité, l'écran prioritaire étant codé sur un 1 bit par pixel. Le VPC gère aussi la palette indicée et le RAMDAC, il n'y a pas de VCE séparé comme sur la PC-Engine. [[File:Super Graphx 01.png|centre|vignette|upright=2.5|Super Graphx]] ==Les ''Video shifters'' : des VDC sans mémoire vidéo associée== Les VDC les plus simples, appelés des Video shifters, ne sont pas connectés à la mémoire vidéo. Ils fournissent des signaux de commande à l'écran, mais n’accèdent pas à la mémoire vidéo. D'autres VDC plus complexes sont capables de générer des adresses mémoire et accèdent directement à la mémoire vidéo, ils gèrent d'eux-mêmes le parcours du framebuffer. Parmi ces derniers, on distingue généralement plusieurs sous-types, suivant leur complexité et leurs fonctionnalités supportées. Les VDP les plus simples se passent de mémoire vidéo. Ils n'effectuent pas le rendu ligne par ligne, mais réellement pixel par pixel. Nous les appellerons des '''''Video shifters''''', un nom qui trahit le fait qu'ils reçoivent des données pixel par pixel, et les transforment en un flux de bit, voire un flux analogique (ils intègrent alors un RAMDAC). Ils ne peuvent pas envoyer de commandes/adresses à la mémoire vidéo, ils ne parcourent pas le ''framebuffer'' et ne lisent pas les pixels à envoyer à l'écran dedans, c'est le processeur qui le fait à leur place. Leur avantage est qu'ils se passent de mémoire vidéo dédiée et d'utiliser une mémoire unique pour le processeur et le système vidéo. Ils sont très rares, les seuls à avoir été utilisé sur un microordinateur sont le RCA CDP1861 du micro-ordinateur soviétique COSMAC VIP, et le système vidéo du Sinclair ZX-81 (bien qu'il soit fabriqué avec des portes logiques et non avec un VDP). Pour résumer, voici les fonctions possibles de ces circuits : * RAMDAC et transformation octet/pixel en flux de bits ; * génération des signaux de commande pour l'écran ; * génération des ''raster interrupts''. Prenons l'exemple du RCA CDP1861. Il générait les signaux HSYNC et VSYNC de synchronisation verticale et horizontale pour l'écran, et transformait un octet reçu en flux de bits envoyés à l'écran (monochrome). L'intérieur de ce circuit était très simple : un registre à décalage pour la transformation parallèle-série, des compteurs pour la ligne et la colonne, quelques circuits de contrôle associés. Le RCA CDP1861 était relié au processeur et à la mémoire comme indiqué ci-dessous. Le rendu d'une image se faisait en utilisant les ''raster interrupt''. Le RCA CDP1861 générait une interruption à chaque fin de ligne, grâce à un compteur de ligne interne. Le processeur affichait une image grâce à une routine d'interruption, aidé par un contrôleur DMA intégré dans le processeur. La routine d'interruption configurait le contrôleur DMA, qui s'occupait d'envoyer l'image au RCA CDP1861, octet par octet. Il y avait un signal de synchronisation entre RCA CDP1861 et processeur/DMA : un bit émis par le RCA CDP1861 à destination du processeur indiquait qu'il était prêt à recevoir un nouvel octet. [[File:VDP shifter.png|centre|vignette|upright=2|VDP shifter RCA CDP1861]] ==Les fonctionnalités supplémentaires== Au-delà des ''Video shifters'' et des CRTC, les '''''Video Interface Controler''''' intègrent des fonctionnalités supplémentaires, comme de quoi gérer une palette indicée, ainsi que des circuits d'accélération 2D qu'on verra dans le prochain chapitre. En clair, ils regroupent tout ce qui est nécessaire pour faire une carte d'affichage, sauf la mémoire vidéo et éventuellement le RAMDAC. Ils peuvent gérer des RAMS séparées pour la gestion de la palette de couleur ou les caractères, voire peuvent l'intégrer dans leurs circuits. Là encore, ils peuvent souvent gérer à la fois mode texte et graphique, on peut les configurer pour choisir lequel utiliser. Les VDC peuvent gérer des fonctionnalités qui dépassent de loin le rendu 2D. Ils peuvent gérer des fonctionnalités très diverses, allant de la gestion de la mémoire vidéo, l'intégration d'un co-processeur graphique, la gestion du clavier et de la souris, une carte son rudimentaire, la gestion des signaux d'horloge du processeur, des ''timers'' et bien d'autres. Faisons un petit tour d'horizon de ces fonctionnalités. ===Le contrôleur mémoire pour la RAM vidéo=== De plus, beaucoup d'entre eu incorporent des circuits liés à la gestion de la mémoire vidéo. Pour rappel, l'accès à une mémoire DRAM est plus complexe que l'accès aux autres mémoires RAM, notamment, car les timings des accès mémoire sont complexes et que l'adresse doit être envoyée en deux fois. Un point important est que la mémoire vidéo est quasi-systématiquement une mémoire de type DRAM, similaire aux mémoires SDRAM ou DDR des PC actuels. Elles tendent à perdre leur contenu au bout d'un certain temps, ce qui fait qu'elles doivent être rafraichies régulièrement pour éviter cet effacement. Les VDP les plus complexe peuvent incorporer des circuits pour effectuer ce rafraichissement automatiquement. Mais d'autres VDC plus simples font sans et ajoutent des circuits de rafraichissement mémoire séparés du VDC. Et outre le rafraichissement, l'accès à une mémoire DRAM est plus complexe que l'accès aux autres mémoires RAM. Les timings des accès mémoire sont complexes, sans compter que l'adresse doit être envoyée en deux fois. Pour cela, un circuit appelé le contrôleur mémoire est nécessaire pour communiquer avec une DRAM. Le contrôleur traduit les adresses mémoires et signaux de commandes en commandes compréhensibles par la mémoire DRAM. Notamment, il reçoit une adresse mémoire et l'envoie en deux fois. Le contrôleur mémoire peut être intégré au VDC, ou être un circuit séparé, tout dépend du VDC en question. ===Les fonctionnalités liées aux périphériques=== Il existe des VIC qui incorporent une carte son rudimentaire, de quoi gérer les entrées clavier-souris, etc. Prenons par exemple le VDP 7360/8360 TExt Display (TED). Niveau affichage, il gérait mode texte et graphique, avec une résolution allant jusqu’au 320 × 200, avec une SRAM pour la palette de couleur intégrée. Il ressemble beaucoup au MOS Technology VIC-II de la Commorodre 64, mais avec des fonctionnalités de rendu 2D en moins. Mais contrairement à la VIC-II, il incorpore des circuits de génération sonore, avec de quoi générer un signal sonore dit carré ou du bruit blanc. Il incorporait aussi des circuits d'interface avec le clavier, ainsi que des ''timers'' (des circuits capables de compter une durée précise). [[File:Engineer working on CAD workstation with light pen Hughes Aircraft Company.jpg|vignette|Ingénieur de ''Hughes Aircraft Company'' travaillant sur un ordinateur de CAO avec un crayon optique.]] Une fonctionnalité très courante des VIC est la gestion d'un ''light pen'', une sorte de stylet pour écrans CRT, aujourd'hui disparus. Beaucoup de VIC incorporaient cette fonctionnalité, très fréquente pour l'époque. Il faut dire que les ''light pen'' étaient très pratiques pour toute application gérant autre chose que tu texte, comme le dessin assisté par ordinateur. Mais même pour ls applications texte, le ''light pen'' était utile, pour sélectionner une lettre ou un mot, éventuellement pour le corriger. Les VIC géraient le ''light pen'' en interne et présentaient au processeurs deux registres, qui indiquaient la position du ''light pen'' à l'écran. ===Un exemple : le NEC μPD7220=== [[File:NECuPD7220BlockDiagram.svg|vignette|NECuPD7220BlockDiagram]] Un exemple de VIC est le NEC μPD7220 de NEC. Le schéma ci-contre illustre ce qu'il y a à l'intérieur. On voit qu'il y a plusieurs circuits à 'intérieur, chacun spécialisé dans une tâche précise. Pour résumer, il contient : un CRTC, des circuits mémoire, et des circuits d'accélération 2D. Le CRTC, qui contient lui-même plusieurs sous-circuits : * Un circuit de génération des signaux de commande pour l'écran (HSYNC, VSYNC, autres). * Des registres de configuration et de status. * Une mémoire ROM et une mémoire RAM pour le circuit de contrôle. Les circuits liés à la mémoire vidéo sont les suivants : * Un circuit qui gère les timings pour les accès mémoire. * Un contrôleur mémoire avec un circuit de rafraichissement intégré. * Un contrôleur DMA pour la communication avec le bus ou les copies de blocs mémoire. * Une mémoire FIFO pour gérer les accès simultanés à la mémoire du CPU et du VDP (voir chapitre sur le ''framebuffer''). Les circuits d'accélération 2D regroupent : * Un circuit de tracé de lignes et de figures géométriques. * Un circuit pour les zooms et certaines opérations graphiques similaires. Enfin, il faut citer le circuit pour la gestion d'un ''light pen''. ===L'exemple des anciens micro-ordinateurs Amiga=== L'implémentation des optimisations du rendu 2D peuvent se faire soit directement dans le VDC, soit dans un circuit séparé. Le cas le plus fréquent est une intégration dans le VDC. Mais quelques consoles de jeu faisaient autrement : elles utilisaient un circuit séparé pour les optimisations du rendu 2D. Il est intéressant de donner quelques exemples réels de consoles de jeux qui utilisaient de l'accélération 2D. Nous allons voir l'exemple des anciens micro-ordinateurs Amiga. [[File:Amiga Original Chipset diagram.svg|vignette|Amiga Original Chipset diagram]] Pour finir ce chapitre, nous allons voir les anciens ordinateurs de marque Amiga, qui servaient aussi de console de jeu. Ces consoles disposaient d'un processeur Motorola MC 68000, couplé à une mémoire RAM principale, et d'un ''chipset'' qui gère tout ce qui a trait aux entrée-sorties (vidéo, sonore, interruptions, clavier et souris, lecteur de disquette). Il contient plusieurs circuits appelés respectivement Paula, Denise et Agnus. * Agnus gère la communication avec la mémoire vidéo et contient notamment un ''blitter'' et un co-processeur qui commande le ''blitter''. * Denise est une carte graphique de rendu 2D qui gère 8 ''sprites'' matériels. Il s'occupe aussi de la souris et du joystick. * Paula est un circuit multifonction qui fait à la fois carte son, controleur du lecteur de disquette, gestion des interruptions matérielles, du joystick analogique, du port série et de toutes les autres entrées-sorties. Agnus contient un ''blitter'', un CRTC, et un co-processeur spécialisé qu'on détaillera plus bas. Le fait qu'il intègre un CRTC fait qu'il gère aussi la génération des ''timings'' vidéos pour l'écran, le signal d'horloge du ''chipset'', et quelques autres signaux temporels. Agnus incorpore un circuit de gestion de la mémoire assez complexe. Il intégre notamment un contrôleur mémoire de DRAM, pour communiquer avec la mémoire, qui lui-même incorpore un circuit de rafraichissement mémoire. Tous les contrôleurs DRAM de l'époque ne géraient pas le rafraichissement mémoire, mais c'est le cas d'Agnus. Il n'a donc pas besoin de déléguer cette fonction au processeur. De plus, le circuit de gestion mémoire gère l'arbitrage de la mémoire, à savoir qu'il empêche le processeur et les circuits vidéo/audio de se marcher sur les pieds. Il privilégie les accès provenant du CRTC aux accès initiés par le ''blitter'', l'affichage à l'écran ayant la priorité sur tout le reste. Agnus alloue un cycle sur deux au ''CRTC'', le reste est alloué suivant les besoins, soit au CPU, soit au ''blitter''. Le ''blitter'' des anciennes consoles Amiga fonctionne suivant trois modes de fonctionnement : copie mémoire, remplissage de polygone, et tracé de ligne. Leurs noms sont assez parlants. Le mode de tracé de ligne permet de tracer une ligne en utilisant l'algorithme de Bresenham. Les deux autres modes se ressemblent, dans le sens où ils font des écritures en mémoire, pour remplir un bloc entier de forme rectangulaire. Le premier mode copie un bloc de mémoire dans un autre, mais peut aussi effectuer une opération logique entre plusieurs blocs. Le ''blitter'' prend en entrée 0, 1, 2 ou 3 blocs, et écrit le résultat d'une opération logique dans un quatrième bloc. Les quatre blocs peuvent se recouvrir partiellement. Les blocs en question sont rectangulaires et sont définis par les informations suivantes : une longueur mesurée en multiples de 16 bits, une largeur exprimée en nombre de lignes, et un ''stride'' qui indique la distance entre deux lignes dans le ''framebuffer''. Pour ce qui est du remplissage de polygone, il s'agit du remplissage de figures géométriques simples avec une couleur uniforme. Les figures géométriques sont soit en forme de rectangles, soit des trapèzes dessinés à l'horizontale. Ils sont dessinés en fournissant plusieurs informations : une largeur qui est un multiple de 16 bits, une hauteur mesurée en nombre de lignes, un décalage qui indique de combien de pixels sont décalées deux lignes consécutives, la position de leur premier pixel. Il peut aussi remplir un polygone d'une couleur uniforme. Enfin, Agnus contient un co-processeur spécialisé appelé '''Copper'''. Il s'agit plus d'une machine à état que d'un co-processeur, mais passons ce détail sous silence. Il exécute une ''display list'', à savoir une liste d'instructions, un programme. Les instructions en question sont de trois type : MOV, WAIT et SKIP. L'instruction MOV écrit dans les registres de configuration du VDC, ce qui lui permet d'initialiser des transferts DMA, de modifier les ''sprites'', etc. L'instruction WAIT attend que le l'écran en soit arrivé au rendu du pixel de coordonnée X,Y, ce qui peut remplacer partiellement les ''raster interrupts''. L'instruction SKIP est techniquement un branchement qui passe outre certaines instructions de la ''display list'' si l'écran a dépassé le pixel de coordonnée X,Y. Le co-processeur Copper peut modifier les registres du ''blitter'', ce qui lui permet de démarrer des copies mémoire sans que le CPU ne soit impliqué. Sans lui, le CPU devrait configurer les registres du ''blitter'' pour initier une copie. Ici, le CPU n'a rien à faire : tout est précisé dans la ''display list''. Copper peut modifier les registres de ''sprites'' à la volée, il suffit de coder la ''display list'' adéquate. Copper peut aussi générer des ''raster interrupts'', encore que leur utilité soit ici moindre, vu que ''blitter'' et registres de ''sprites'' sont gérés par la ''display list''. Mais elles sont supportées pour gérer la synchronisation CPU-mémoire vidéo. {{NavChapitre | book=Les cartes graphiques | prev=Les accélérateurs de scanline | prevText=Les accélérateurs de scanline | next=Les cartes d'affichage des anciens PC | nextText=Les cartes d'affichage des anciens PC }} {{autocat}} s2890oztzorproxwmnw61gkktm0h55j Les cartes graphiques/Le mode texte et le rendu en tiles 0 81132 764862 746671 2026-04-24T17:42:39Z Mewtow 31375 /* La table des caractères */ 764862 wikitext text/x-wiki Les toutes premières cartes d'affichage portaient le nom de cartes d'affichage en mode texte. Comme leur nom l'indique, elles sont spécifiquement conçues pour afficher du texte, pas des images. Elles étaient utilisées sur les ordinateurs personnels ou professionnels, qui n'avaient pas besoin d'afficher des graphismes, seulement des lignes de commandes, tableurs, traitements de textes rudimentaires, etc. Elles ont rapidement été remplacées par des cartes graphiques avec un ''framebuffer''. Il s'agit d'une avancée énorme, qui permet beaucoup plus de flexibilité dans l'affichage. L'existence de telles cartes en mode texte tient au fait que la mémoire vidéo était chère et qu'on ne pouvait pas en mettre beaucoup dans une carte d'affichage ou dans une console de jeu. Aussi, les fabricants de cartes graphiques devaient ruser. La petitesse de la mémoire faisait qu'il n'y avait pas de ''framebuffer'' proprement dit. On a vu au chapitre précédent qu'il existe des techniques de rendu 2D qui se passent de ''framebuffer'', hé bien les premières cartes d'affichage les utilisaient sous une forme détournée. ==Le rendu en mode texte== En '''mode texte''', l'écran était découpé en carré ou en rectangles de taille fixe, contenant chacun un caractère. Les caractères affichables sont des lettres, des chiffres, ou des symboles courants, même si des caractères spéciaux sont disponibles. La carte d'affichage traitait les caractères comme un tout et il était impossible de modifier des pixels individuellement. Ceux-ci sont encodés dans un jeu de caractère spécifique (ASCII, ISO-8859, etc.), qui est généralement l'ASCII. [[File:VGAText3.png|centre|vignette|upright=1.5|]] Tous les caractères sont des images de taille fixe, que ce soit en largeur ou en hauteur. Par exemple, un caractère peut faire 8 pixels de haut et 8 pixels de large, sur les écrans cathodiques. Sur les écrans LCD, les pixels sont carrés et les caractères font 16 pixels de haut par 8 de large pour avoir un aspect rectangulaire. [[File:VGA text sample animation.gif|vignette|Illustration du mode texte.]] Les ''attributs des caractères'' sont des informations qui indiquent si le caractère clignote, sa couleur, sa luminosité, si le caractère doit être souligné, etc. Une gestion minimale de la couleur est parfois présente. Le tout est mémorisé dans un octet, à la suite du code ASCII du caractère. Le mode texte est toujours présent dans nos cartes graphiques actuelles et est encore utilisé par le BIOS, ce qui lui donne cet aspect désuet et moche des plus inimitables. ===L'architecture d'une carte d'affichage en mode texte=== Paradoxalement, les cartes d'affichage en mode texte sont de loin les moins intuitives et elles sont plus complexes que les cartes d'affichage en mode graphique. Les limitations de la technologie de l'époque rendaient plus adaptées les cartes en mode texte, notamment les limitations en termes de mémoire vidéo. La faible taille de la mémoire rendait impossible l'usage d'un ''framebuffer'' proprement dit, ce qui fait que les ingénieurs ont utilisé un moyen de contournement, qui a donné naissance aux cartes graphiques en mode texte. Par la suite, avec l'amélioration de la technologie des mémoires, les cartes d'affichage avec un ''framebuffer'' sont apparues et ont remplacé les complexes cartes d'affichage en mode texte. Les cartes d'affichage en mode texte et avec ''framebuffer'' ont une architecture assez similaire. Pour rappel, une carte graphique avec un ''framebuffer'' est composée de plusieurs composants : un circuit d’interfaçage avec le bus, un circuit de contrôle appelé le CRTC, une mémoire vidéo, un DAC qui convertit les pixels en signal analogique, et quelques circuits annexes. [[File:Architecture interne d'une carte d'affichage en mode graphique.png|centre|vignette|upright=2.0|Architecture interne d'une carte d'affichage en mode graphique]] Une carte en mode texte a les mêmes composants, avec quelques modifications. Le '''tampon de texte''' (''text buffer'') est la mémoire vidéo. Dans celle-ci, les caractères à afficher sont placés les uns à la suite des autres. Chaque caractère est stocké en mémoire avec deux octets : un octet pour le code ASCII, suivi d'un octet pour les attributs. L'avantage du mode texte est qu'il utilise très peu de mémoire vidéo : on ne code que les caractères et non des pixels indépendants, et un caractère correspond à beaucoup de pixels. Le CRTC est modifié de manière tenir compte de l'organisation du tampon de texte. De plus, quelques circuits sont ensuite utilisés pour faire la conversion texte-image, comme on le verra plus bas. Le circuit de conversion texte-pixel est une petite mémoire ROM appelée la '''mémoire de caractère''', qui mémorise, pour chaque caractère, sa représentation sous forme de pixels. La carte graphique contient aussi un circuit chargé de gérer les attributs des caractères : l'ATC (''Attribute Controller''), aussi appelé le '''contrôleur d'attributs'''. Il est situé juste en aval du tampon de texte. [[File:Architecture interne d'une carte d'affichage en mode texte.png|centre|vignette|upright=2.0|Architecture interne d'une carte d'affichage en mode texte]] ===La table des caractères=== Les images de chaque caractère sont mémorisées dans une mémoire : la '''table des caractères''', aussi appelée mémoire des caractères dans les schémas au-dessus. Dans cette mémoire, chaque caractère est représenté par une matrice de pixels, avec un bit par pixel. Certaines cartes graphiques permettent à l'utilisateur de créer ses propres caractères en modifiant cette table, ce qui en fait une mémoire ROM/EEPROM ou RAM. On pourrait croire que la table des caractères telle que si l'on envoie le code ASCII sur l'entrée d'adresse, on récupère en sortie l'image du caractère associé. Mais cette solution simple est irréaliste : un simple caractère monochrome de 8 pixels de large et de 8 pixels de haut demanderait près de 64 pixels en sortie, soit facilement plusieurs centaines de bits, ce qui est impraticable, surtout pour les mémoires de l'époque. En réalité, la mémoire de caractère a une sortie de 1 pixel, le pixel en question étant pris dans l'image du caractère sélectionné. L'entrée d'adresse s'obtient alors en concaténant trois informations : le code ASCII pour sélectionner le caractère, le numéro de la ligne et le numéro de la colonne pour sélectionner le bit dans l'image du caractère. Les deux numéros sont fournis par le CRTC, comme on le verra plus bas. <noinclude>[[File:VGAText6.png|centre|vignette|upright=2.0|Représentation d'un caractère à l'écran et dans la table de caractère.]]</noinclude> ===Le CRTC sur une carte en mode texte=== Le mode texte impose de modifier le CRTC de manière à ce qu'il adresse le tampon de texte correctement. Il contient toujours deux compteurs, pour localiser la ligne et la colonne du pixel à afficher, mais doit transformer cela en adresse de caractère. Le CRTC doit sélectionner le caractère à afficher, puis sélectionner le pixel dans celui-ci, ce qui demande la collaboration de la mémoire de caractères et le tampon de texte. Le CRTC va déduire à quel caractère correspond le pixel choisit, et le récupérer dans le tampon de texte. Là, le code du caractère est envoyé à la mémoire de caractère, et le CRTC fournit de quoi sélectionner le numéro de ligne et le numéro de colonne. Le pixel récupéré dans la mémoire de caractère est alors envoyé à l'écran. Concrètement, les calculs à faire pour déterminer le caractère et pour trouver les numéros de ligne/colonne sont très simples, sans compter que les deux sont liés. Prenons par exemple un écran dont les caractères font tous 12 pixels de large et 8 pixels de haut. Le pixel de coordonnées X (largeur) et Y (hauteur) correspond au caractère de position X/12 et Y/8. Le reste de la première division donne la position de la colonne pour la mémoire de caractère, alors que le reste de la seconde division donne le numéro de ligne. Si les caractères ont une largeur et une hauteur qui sont des puissances de deux, les divisions se simplifient : la position du caractère dans la mémoire se calcule alors à partir des bits de poids forts des compteurs X et Y, alors que les bits de poids faible permettent de donner le numéro de ligne et de colonne pour la mémoire de caractère. Dans le diagramme ci-dessus, les 3 bits de poids faible des registres X et Y de balayage des pixels servent à adresser le pixel parmi les 8x8 du bloc correspondant au caractère à afficher. L'index de ce caractère est lu dans le tampon de texte, adressé par les bits restant des registres X et Y. [[File:Character generator scheme.svg|centre|vignette|upright=2.0|Balayage des pixels par le CRTC pour un mode texte avec des caractères de 8x8 pixels.]] [[File:MC6845.svg|vignette|Motorola 6845]] Un exemple de CRTC est le ''Motorola 6845''. Ce VDP génère l'adresse à lire dans la mémoire vidéo, ainsi que les signaux de synchronisation horizontale et verticale, mais ne fait pas grand-chose d'autre. Lire la mémoire vidéo, extraire les pixels et envoyer le tout à l'écran n'est pas de son ressort. Il gère le mode texte uniquement, mais on peut supporter le mode graphique en trichant. Il supporte le mode entrelacé et le mode non-entrelacé, et est compatible aussi bien avec les moniteurs en PAL qu'en NTSC. Il contient 18 registres dont le contenu permet de configurer le VDP, pour configurer la résolution, la fréquence d'affichage, et d'autres choses encore. [[File:Motorola MC6845P.jpg|centre|vignette|Motorola MC6845P]] D'autres CRTC plus évolués gèrent à la fois le mode texte et le mode graphique, on peut les configurer de manière à choisir lequel utiliser. Il est ainsi possible de prendre un VDP CRTC pour le mettre avec une mémoire assez petite pour gérer uniquement des graphiques en mode texte. Ou au contraire, de prendre un VDP CRTC et de le combiner avec une mémoire importante pour l'utiliser comme ''framebuffer''. ===Le défilement du texte=== Faire défiler du texte est une opération très courante. Concrètement, cela fait descendre d'une ou plusieurs lignes dans le texte, ce qui demande de bouger tout le texte à l'écran. Le défilement ne se fait pas ligne de pixel par ligne de pixel, mais ligne par ligne, voire par paquets de plusieurs lignes. Par exemple, si un caractère de texte fait 8 pixels de haut, alors on saute les lignes par paquets de 8. Il s'agit presque toujours de défilement vertical. Le texte est généralement défilé de haut en bas, verticalement, le défilement horizontal étant plus rare. Même sur les écrans de l'époque, qui avaient des colonnes limitées à 80/100 caractères, le texte était conçu de manière à ce que les lignes de texte ne débordent pas de l'écran. Aussi, les optimisations qui nous intéressent sont surtout les optimisations du défilement vertical. Défiler du texte est une opération très courante qui gagne à être optimisé au niveau de la carte graphique. Les toutes premières cartes graphiques MBA (monochromes) et CGA n'incorporaient pas de défilement vertical optimisé, mais les cartes suivantes, EGA et VGA, le faisaient. Les optimisations en question sont nombreuses, mais nous allons en voir deux. La première optimisation que nous allons voir réutilise les techniques vues dans le chapitre sur le rendu 2D. Pour cela, il utilise un tampon de texte organisé en lignes de texte consécutives. Le tampon de texte mémorise plus de lignes que ce qui est affiché à l'écran. Ce qui est visible à l'écran est une portion du tampon de texte, appelée le ''viewport''. Ainsi, les lignes à afficher au-dessus ou en dessous du ''viewport'' sont déjà en mémoire vidéo. Il y a juste à fournir un registre qui pointe vers la position du ''viewport'' dans le tampon de texte, ce qui permet de faire bouger le ''viewport'' à volonté. Une autre solution, plus économe en RAM, fait usage d'un VDC à co-processeur. Pour rappel, ce sont des VDC qui incorporent un processeur qui exécute un programme d'affichage. Le programme, appelé la ''display list'', afficher une image à l'écran, ou du texte, ou tout ce qu'il faut afficher. Chaque instruction de la ''display list'' dit quoi afficher sur une ligne à l'écran. Ici, elle dit quoi afficher sur une ligne de texte, une ligne de caractère, et non une ligne de pixels comme dans les chapitres précédents. Un exemple de VDC à co-processeur en mode texte est celui des '''ordinateurs Amstrad PCW'''. Il s'agissait d'ordinateurs qui ne géraient que le mode texte, ils ne pouvaient pas afficher d'image pixel par pixel, ils n'avaient pas de ''framebuffer''. Le texte à afficher à l'écran n'était pas stocké dans un tableau unique, ligne par ligne, dans l'ordre de rendu, comme c'est le cas sur les autres cartes en mode texte. A la place, chaque ligne était stocké en mémoire séparément les unes des autres, ou presque. L'affichage était gouverné par une ''display list'' qui disait quelle ligne afficher, et dans quel ordre. La ''display list'' était une liste d'adresses, chacun pointant vers le début d'une ligne en mémoire vidéo. Toutes les lignes faisaient la même taille, ce qui fait que la ''display list'' avait juste à encoder l'adresse de départ de la ligne pour l'afficher correctement. Le processeur du VDC lisait la ''display list'' adresse par adresse et rendait les lignes dans l'ordre précisé par la ''display list''. Le défilement était alors simple à implémenter : il suffisait de modifier le contenu de la ''display list''. Par exemple, pour défiler d'une ligne vers le cas, on décalait son contenu de la ''display list'' d'un cran et on modifiait la ligne la plus en haut. L'avantage est que modifier une ''display list'' est plus rapide que de faire défiler l'ensemble du ''text buffer''. La ''display list'' était stockée dans une mémoire RAM spécialisée de 512 octets, ce qui permettait de stocker 256 adresses de 16 bits chacune. La ''display list'' avait 256 lignes, ce qui collait exactement à la résolution de 720 par 256 pixels de l'Amstrad PCW. LA RAM qui mémorisait la ''display list'' s'appelait la '''''roller RAM'''''. Elle était utilisée par le processeur 280 de la machine pour gérer le rendu de l'affichage. Le VDC utilisé était en effet très simple et se résumait sans doute à un vulgaire CRTC en mode texte. ==Le rendu en mode semi-graphique== [[File:Level 1 teletext test.png|vignette|Rendu d'une image en mode semi-graphique.]] Le rendu en mode texte ne permet en théorie de n'afficher que du texte. Cependant, il est possible d'émuler un rendu graphique à partir du mode texte, en trichant un petit peu. On a alors un mode de rendu appelé '''mode semi-graphique'''. Il y en a deux sous-types, appelés ''rendu graphique en bloc'' et ''pseudo-graphique'', qui seront détaillés ci-dessous. Les mode semi-graphiques sont en soi des techniques logicielles, qui ne demandent pas de support particulier de la part du matériel. Ils servent cependant d'introduction propédeutique au rendu en motifs qui sera vu à la fin du chapitre. La triche n'est possible que sur les cartes en mode texte sur lesquelles les caractères sont configurables, c’est-à-dire qu'on peut préciser à quoi ressemblent les caractères. Sur de telles cartes en mode texte, on peut fournir un dessin rectangulaire de quelques pixels de côté à la carte graphique et lui dire : ceci est le caractère numéro 40. L'idée est de remplacer les caractères par des dessins basiques, des '''motifs''', qui sont assemblés pour fabriquer des "sprites", qui sont eux-même assemblés pour former l'image finale. ==Le rendu à motif (''tiles'')== Le '''rendu en motifs''' est un proche cousin du mode texte. Il n'est cependant pas spécialisé pour du texte, mais permet de compresser des images complètes. Il a été utilisé sur des consoles de jeu, afin d'outrepasser les contraintes en mémoire RAM. les consoles 8 bits avaient peu de mémoire et ne pouvaient pas utiliser de ''framebuffer'', même en utilisant la technique de la palette indicée. Elles ne pouvaient pas non plus utiliser de tampon de ligne, car le processeur n'était pas assez puissant pour. Alors, elles utilisaient le rendu en motifs pour rendre des images avec peu de mémoire vidéo. ===Le stockage des ''sprites'' et de l’arrière-plan : les tiles=== [[File:Tile set.png|vignette|Tile set de Ultima VI.]] Le rendu en motifs force une certaine redondance à l'intérieur de l'arrière-plan et des ''sprites''. L'idée est que les ''sprites'' et l'arrière-plan sont fabriqués à partir de motifs, aussi appelés ''tiles''. Concrètement, ce sont des dessins carrés de 8, 16, 32 pixels de côtés, qui sont assemblés pour fabriquer un ''sprite'' ou l'arrière-plan. L'ensemble des motifs est mémorisée dans un fichier unique, appelé le ''tile set'', le ''tilemap'', ou encore la '''table des motifs'''. La table des motifs est placée dans la cartouche de jeu, souvent dans une mémoire ROM dédiée. Ci-contre, vous voyez la table des motifs du jeu Ultima VI. Les motifs sont numérotés, un numéro identifiant un motif parmi toutes les autres. L'image ne mémorise pas des pixels, mais des numéros de motifs. Le gain est assez appréciable : avec des motifs de 8 pixels de côté, au lieu de stocker X * Y pixels, on stocke X/8 * Y/8 numéros de motifs par image. La mémoire vidéo n'est donc pas un ''framebuffer'', mais un '''tampon de motifs'''. L'image à afficher à l'écran est reconstituée par la carte graphique, lors de l'affichage, en plusieurs étapes. Un avantage est que les motifs peuvent être utilisés en plusieurs endroits, ce qui garantit une certaine redondance. L'arrière-plan, qui est généralement l'image la plus redondante. Par exemple, un ciel est composé de motifs bleus identiques. Idem quand il faut rendre plusieurs petits ennemis identiques à l'écran : on n'utilise qu'un seul motif pour tous les ennemis. Pareil si un motifs est utilisé dans plusieurs ''sprites'', il n'est stockée qu'une seule fois. Il s'agit donc d'une forme de compression d'image qui profite d'une certaine redondance. Ajoutons à cela que les numéros de motifs prennent moins de place que la couleur d'un pixel, et les gains sont encore meilleurs. La consommation mémoire est déportée de l'image vers la mémoire qui stocke les motifs, une mémoire ROM intégrée dans la cartouche de jeu.''' '''. ===L'architecture d'une carte d'affichage en rendu à motifs=== Pour les consoles de 2ème, 3ème et 4ème génération, l'usage de motifs était obligatoire et tous les jeux vidéo utilisaient cette technique. Les cartes graphiques des consoles de jeux de cette époque étaient conçues pour gérer les motifs. Le matériel affichait l'image finale ligne par ligne, pixel par pixel comme le ferait un CRTC. Sauf qu'il détermine : dans quelle motif se trouve le pixel à afficher, où se trouve le pixel dans le motif (quelle ligne, quelle colonne). Une fois cela fait, le VDC accède à la mémoire vidéo pour récupérer le numéro de motif. Une fois le numéro de motif connu, il lit la table des potifs en mémoire ROM, sur la cartouche. Puis, il sélectionne le pixel à afficher dans ce motif, et l'envoie à la palette indicée, puis à l'écran. [[File:VDC à rendu à motif, sans gestion des sprites.png|centre|vignette|upright=2|VDC à rendu à motif, sans gestion des sprites]] Les motifs sont des équivalents des caractères dans le mode texte. Un motif peut être vu comme une sorte de super-caractère. Une carte d'affichage en mode texte et une carte en rendu à motifs sont d'ailleurs très similaires. Le tampon de motifs est l'équivalent pour le rendu à motifs du tampon de texte en mode texte. La table des motifs est l'équivalent de la table des caractères, les deux convertissent un caractère/''tile'' en pixels. La méthode d'adressage est fortement similaire, l'utilisation l'est aussi. La seule différence est leur contenu, la table des caractères stockant des caractères, la table des motifs stockant des motifs graphiques. Une optimisation permettait de lire certains motifs dans les deux sens à l'horizontale, de faire une sorte d'opération miroir. Ce faisant, on pouvait créer un objet symétrique en mémorisant seulement un motif. Par exemple, la moitié droite est générée par une opération miroir sur la partie gauche. Mais cette optimisation était assez rare, car elle demandait d'ajouter des circuits dans un environnement où le moindre transistor était cher. De plus, les objets symétriques sont généralement assez rares. Les ''sprites'' sont presque toujours gérés avec le rendu à motifs, pour des raisons de performance. Les ''sprites'' les plus simples sont un seul motif, mais les autres ''sprites'' sont formés en assemblant plusieurs motifs. Typiquement, un ''sprite'' prend de 2 à 4 motifs. Par exemple, un ''sprite'' de 16 pixels de haut et 8 pixels de large est composé de deux motifs de 8 pixels de côté. Pour cela, les registres pour les ''sprites'' mémorisent des numéros de motif, pas des pixels. [[File:Carte 2D avec un rendu en tile.png|centre|vignette|upright=2|Carte 2D avec un rendu en tile]] ===Le défilement avec des motifs=== Le défilement se marie assez mal avec un rendu à base de motifs. La solution la plus simple fait du défilement motif par motif, par sauts de 8 pixels. L'implémentation est la même qu'avec le défilement, à savoir qu'on utilise un ''viewport'' matériel. La différence est que la mémoire vidéo contient des motifs et non des pixels, idem pour le ''viewport''. Le résultat à l'écran n'est pas fluide du tout, il donne un défilement saccadé et désagréable. Pour corriger cela, il a existé des techniques pour implémenter du défilement du défilement pixel par pixel avec un rendu à motifs. Un défilement de ce type est appelé un '''défilement fluide''', ou encore du '''défilement pixel par pixel'''. La première implémentation du défilement fluide avec des motifs était purement logicielle, le VDC faisait lui du défilement motif par motif. Sur PC, la première implémentation a été trouvée par John Carmack, le programmeur derrière les moteurs des jeux IDSoftware comme DOOM, Quake, Wolfenstein 3D, etc. Il a inventé la technique de l'''Adaptive tile refresh'' qui permet justement d'avoir un défilement fluide sur des cartes sans gestion hardware du défilement. D'autres solutions logicielles similaires existaient sur console. Elles utilisaient 8 copies de chaque motif, chacun étant décalé d'un pixel. Le motif adéquat était choisi suivant un décalage dépendant du défilement. Mais il est possible de faire du défilement pixel par pixel avec un rendu à motifs, en ajoutant du hardware spécifique au VDC. Elles étaient implémentées sur les consoles de 4ème génération et antérieures, mais pas sur les anciens PC. Une des toute première console à gérer le défilement pixel par pixel était l'Intellivision, une des toutes premières consoles, précisément une console de deuxième génération. Elle avait des motifs de 8 pixels de côté, et permettait de défiler au pixel près. Pour cela, elle disposait d'un '''registre de décalage''' contenant une valeur allant de 0 à 7, qui indiquait de combien de pixels il fallait décaler l'image sur l'écran. Pour décaler d'une valeur plus grande, il fallait recourir au logiciel. Le logiciel devait alors faire défiler l'image en la déplaçant en mémoire vidéo. Il s'agissait donc d'une implémentation partielle du défilement avec des motifs. Le logiciel faisait du défilement motif par motif, et pouvait finir le travail en ajustant le tout pour obtenir un défilement pixel par pixel. Les consoles suivantes géraient le défilement pixel par pixel d'une manière plus optimisée, en gérant à la fois le registre de décalage et le défilement motif par motif. Le défilement pixel par pixel était réalisé en faisant un défilement motif par motif, puis en finissant le travail avec un registre de décalage. Le défilement motif par motif était géré comme expliqué ci-dessus, avec un ''viewport''. ===Les glitchs graphiques sur les bords de l'écran=== Malgré leur support matériel, il arrive que le défilement au pixel près cause des glitchs graphiques sur les bords de l'écran. La raison est qu'avec un défilement par pixel, les motifs aux bords de l'écran sont partiellement affichés. Par exemple, un motif sur le bord gauche ait ses pixels gauche en-dehors de l'écran, ses pixels droits dans l'écran. Idem mais sur le bord droit : un motif a ses pixels de gauche dans l'écran, ceux de droite en-dehors. Le problème est que de tels motifs peuvent ne pas être affichés si le VDC ne le permet pas. En général, les motifs partiellement en-dehors de l'écran ne sont pas affichés, ce qui cause des glitchs graphiques. Les VDC de l'époque ne pouvaient pas afficher un motif si ses coordonnées sont en-dehors de l'écran. En général, la coordonnée d'un motif est définie par rapport à une origine placée sur le pixel le plus en haut et le plus à gauche du motif. Dans ce cas, les motifs à gauche de l'écran ont une origine qui est en-dehors de l'écran, même si quelques pixels de droite sont affichés. Le motif n'est alors pas affiché. Ces pixels à droite disparaissent, ce qui fait qu'entre 0 et 7 pixels disparaissent pour un motif de 8 pixel de largeur, entre 0 et 15 pixels s'il a une largeur de 16 pixels, etc. Idem avec le défilement vertical, mais pour les motifs tout en haut de l'écran. : Si l'origine du motif est définie sur le bord droit, c'est les motifs à droite de l'écran qui disparaissent. Il y a la même chose avec les ''sprites''. Si leur origine est en-dehors de l'écran, mais que le reste du ''sprite'' est affiché, ils ne sont pas affichés. Une solution pour éviter les problèmes est de les faire rentrer d'un seul côté de l'écran, typiquement à droite si leur origine est définie à gauche. Si le défilement va dans le bon sens, aucun glitch graphique ne se manifeste. Pour cacher ces glitchs graphiques, il est possible d'ajouter des bandes noires sur les deux côtés de l'écran. Les bandes noires sont verticales et/ou horizontales, elle ont une largeur égale à un motif. Le VDC peut gérer nativement ces bandes noires, en matériel. Pour cela, il réduit simplement la résolution pour couper les bords de l'écran. {{NavChapitre | book=Les cartes graphiques | prev=Les cartes accélératrices 2D | prevText=Les cartes accélératrices 2D | next=Les accélérateurs de scanline | nextText=Les accélérateurs de scanline }} {{autocat}} omj5jz31vxzcelnzkwjs10pk8dcr8n4 764863 764862 2026-04-24T17:42:54Z Mewtow 31375 /* Le CRTC sur une carte en mode texte */ 764863 wikitext text/x-wiki Les toutes premières cartes d'affichage portaient le nom de cartes d'affichage en mode texte. Comme leur nom l'indique, elles sont spécifiquement conçues pour afficher du texte, pas des images. Elles étaient utilisées sur les ordinateurs personnels ou professionnels, qui n'avaient pas besoin d'afficher des graphismes, seulement des lignes de commandes, tableurs, traitements de textes rudimentaires, etc. Elles ont rapidement été remplacées par des cartes graphiques avec un ''framebuffer''. Il s'agit d'une avancée énorme, qui permet beaucoup plus de flexibilité dans l'affichage. L'existence de telles cartes en mode texte tient au fait que la mémoire vidéo était chère et qu'on ne pouvait pas en mettre beaucoup dans une carte d'affichage ou dans une console de jeu. Aussi, les fabricants de cartes graphiques devaient ruser. La petitesse de la mémoire faisait qu'il n'y avait pas de ''framebuffer'' proprement dit. On a vu au chapitre précédent qu'il existe des techniques de rendu 2D qui se passent de ''framebuffer'', hé bien les premières cartes d'affichage les utilisaient sous une forme détournée. ==Le rendu en mode texte== En '''mode texte''', l'écran était découpé en carré ou en rectangles de taille fixe, contenant chacun un caractère. Les caractères affichables sont des lettres, des chiffres, ou des symboles courants, même si des caractères spéciaux sont disponibles. La carte d'affichage traitait les caractères comme un tout et il était impossible de modifier des pixels individuellement. Ceux-ci sont encodés dans un jeu de caractère spécifique (ASCII, ISO-8859, etc.), qui est généralement l'ASCII. [[File:VGAText3.png|centre|vignette|upright=1.5|]] Tous les caractères sont des images de taille fixe, que ce soit en largeur ou en hauteur. Par exemple, un caractère peut faire 8 pixels de haut et 8 pixels de large, sur les écrans cathodiques. Sur les écrans LCD, les pixels sont carrés et les caractères font 16 pixels de haut par 8 de large pour avoir un aspect rectangulaire. [[File:VGA text sample animation.gif|vignette|Illustration du mode texte.]] Les ''attributs des caractères'' sont des informations qui indiquent si le caractère clignote, sa couleur, sa luminosité, si le caractère doit être souligné, etc. Une gestion minimale de la couleur est parfois présente. Le tout est mémorisé dans un octet, à la suite du code ASCII du caractère. Le mode texte est toujours présent dans nos cartes graphiques actuelles et est encore utilisé par le BIOS, ce qui lui donne cet aspect désuet et moche des plus inimitables. ===L'architecture d'une carte d'affichage en mode texte=== Paradoxalement, les cartes d'affichage en mode texte sont de loin les moins intuitives et elles sont plus complexes que les cartes d'affichage en mode graphique. Les limitations de la technologie de l'époque rendaient plus adaptées les cartes en mode texte, notamment les limitations en termes de mémoire vidéo. La faible taille de la mémoire rendait impossible l'usage d'un ''framebuffer'' proprement dit, ce qui fait que les ingénieurs ont utilisé un moyen de contournement, qui a donné naissance aux cartes graphiques en mode texte. Par la suite, avec l'amélioration de la technologie des mémoires, les cartes d'affichage avec un ''framebuffer'' sont apparues et ont remplacé les complexes cartes d'affichage en mode texte. Les cartes d'affichage en mode texte et avec ''framebuffer'' ont une architecture assez similaire. Pour rappel, une carte graphique avec un ''framebuffer'' est composée de plusieurs composants : un circuit d’interfaçage avec le bus, un circuit de contrôle appelé le CRTC, une mémoire vidéo, un DAC qui convertit les pixels en signal analogique, et quelques circuits annexes. [[File:Architecture interne d'une carte d'affichage en mode graphique.png|centre|vignette|upright=2.0|Architecture interne d'une carte d'affichage en mode graphique]] Une carte en mode texte a les mêmes composants, avec quelques modifications. Le '''tampon de texte''' (''text buffer'') est la mémoire vidéo. Dans celle-ci, les caractères à afficher sont placés les uns à la suite des autres. Chaque caractère est stocké en mémoire avec deux octets : un octet pour le code ASCII, suivi d'un octet pour les attributs. L'avantage du mode texte est qu'il utilise très peu de mémoire vidéo : on ne code que les caractères et non des pixels indépendants, et un caractère correspond à beaucoup de pixels. Le CRTC est modifié de manière tenir compte de l'organisation du tampon de texte. De plus, quelques circuits sont ensuite utilisés pour faire la conversion texte-image, comme on le verra plus bas. Le circuit de conversion texte-pixel est une petite mémoire ROM appelée la '''mémoire de caractère''', qui mémorise, pour chaque caractère, sa représentation sous forme de pixels. La carte graphique contient aussi un circuit chargé de gérer les attributs des caractères : l'ATC (''Attribute Controller''), aussi appelé le '''contrôleur d'attributs'''. Il est situé juste en aval du tampon de texte. [[File:Architecture interne d'une carte d'affichage en mode texte.png|centre|vignette|upright=2.0|Architecture interne d'une carte d'affichage en mode texte]] ===La table des caractères=== Les images de chaque caractère sont mémorisées dans une mémoire : la '''table des caractères''', aussi appelée mémoire des caractères dans les schémas au-dessus. Dans cette mémoire, chaque caractère est représenté par une matrice de pixels, avec un bit par pixel. Certaines cartes graphiques permettent à l'utilisateur de créer ses propres caractères en modifiant cette table, ce qui en fait une mémoire ROM/EEPROM ou RAM. On pourrait croire que la table des caractères telle que si l'on envoie le code ASCII sur l'entrée d'adresse, on récupère en sortie l'image du caractère associé. Mais cette solution simple est irréaliste : un simple caractère monochrome de 8 pixels de large et de 8 pixels de haut demanderait près de 64 pixels en sortie, soit facilement plusieurs centaines de bits, ce qui est impraticable, surtout pour les mémoires de l'époque. En réalité, la mémoire de caractère a une sortie de 1 pixel, le pixel en question étant pris dans l'image du caractère sélectionné. L'entrée d'adresse s'obtient alors en concaténant trois informations : le code ASCII pour sélectionner le caractère, le numéro de la ligne et le numéro de la colonne pour sélectionner le bit dans l'image du caractère. Les deux numéros sont fournis par le CRTC, comme on le verra plus bas. <noinclude>[[File:VGAText6.png|centre|vignette|upright=2.0|Représentation d'un caractère à l'écran et dans la table de caractère.]]</noinclude> ===Le CRTC sur une carte en mode texte=== Le mode texte impose de modifier le CRTC de manière à ce qu'il adresse le tampon de texte correctement. Il contient toujours deux compteurs, pour localiser la ligne et la colonne du pixel à afficher, mais doit transformer cela en adresse de caractère. Le CRTC doit sélectionner le caractère à afficher, puis sélectionner le pixel dans celui-ci, ce qui demande la collaboration de la mémoire de caractères et le tampon de texte. Le CRTC va déduire à quel caractère correspond le pixel choisit, et le récupérer dans le tampon de texte. Là, le code du caractère est envoyé à la mémoire de caractère, et le CRTC fournit de quoi sélectionner le numéro de ligne et le numéro de colonne. Le pixel récupéré dans la mémoire de caractère est alors envoyé à l'écran. Concrètement, les calculs à faire pour déterminer le caractère et pour trouver les numéros de ligne/colonne sont très simples, sans compter que les deux sont liés. Prenons par exemple un écran dont les caractères font tous 12 pixels de large et 8 pixels de haut. Le pixel de coordonnées X (largeur) et Y (hauteur) correspond au caractère de position X/12 et Y/8. Le reste de la première division donne la position de la colonne pour la mémoire de caractère, alors que le reste de la seconde division donne le numéro de ligne. Si les caractères ont une largeur et une hauteur qui sont des puissances de deux, les divisions se simplifient : la position du caractère dans la mémoire se calcule alors à partir des bits de poids forts des compteurs X et Y, alors que les bits de poids faible permettent de donner le numéro de ligne et de colonne pour la mémoire de caractère. Dans le diagramme ci-dessus, les 3 bits de poids faible des registres X et Y de balayage des pixels servent à adresser le pixel parmi les 8x8 du bloc correspondant au caractère à afficher. L'index de ce caractère est lu dans le tampon de texte, adressé par les bits restant des registres X et Y. <noinclude>[[File:Character generator scheme.svg|centre|vignette|upright=2.0|Balayage des pixels par le CRTC pour un mode texte avec des caractères de 8x8 pixels.]]</noinclude> <noinclude>[[File:MC6845.svg|vignette|Motorola 6845]]</noinclude> Un exemple de CRTC est le ''Motorola 6845''. Ce VDP génère l'adresse à lire dans la mémoire vidéo, ainsi que les signaux de synchronisation horizontale et verticale, mais ne fait pas grand-chose d'autre. Lire la mémoire vidéo, extraire les pixels et envoyer le tout à l'écran n'est pas de son ressort. Il gère le mode texte uniquement, mais on peut supporter le mode graphique en trichant. Il supporte le mode entrelacé et le mode non-entrelacé, et est compatible aussi bien avec les moniteurs en PAL qu'en NTSC. Il contient 18 registres dont le contenu permet de configurer le VDP, pour configurer la résolution, la fréquence d'affichage, et d'autres choses encore. [[File:Motorola MC6845P.jpg|centre|vignette|Motorola MC6845P]] D'autres CRTC plus évolués gèrent à la fois le mode texte et le mode graphique, on peut les configurer de manière à choisir lequel utiliser. Il est ainsi possible de prendre un VDP CRTC pour le mettre avec une mémoire assez petite pour gérer uniquement des graphiques en mode texte. Ou au contraire, de prendre un VDP CRTC et de le combiner avec une mémoire importante pour l'utiliser comme ''framebuffer''. ===Le défilement du texte=== Faire défiler du texte est une opération très courante. Concrètement, cela fait descendre d'une ou plusieurs lignes dans le texte, ce qui demande de bouger tout le texte à l'écran. Le défilement ne se fait pas ligne de pixel par ligne de pixel, mais ligne par ligne, voire par paquets de plusieurs lignes. Par exemple, si un caractère de texte fait 8 pixels de haut, alors on saute les lignes par paquets de 8. Il s'agit presque toujours de défilement vertical. Le texte est généralement défilé de haut en bas, verticalement, le défilement horizontal étant plus rare. Même sur les écrans de l'époque, qui avaient des colonnes limitées à 80/100 caractères, le texte était conçu de manière à ce que les lignes de texte ne débordent pas de l'écran. Aussi, les optimisations qui nous intéressent sont surtout les optimisations du défilement vertical. Défiler du texte est une opération très courante qui gagne à être optimisé au niveau de la carte graphique. Les toutes premières cartes graphiques MBA (monochromes) et CGA n'incorporaient pas de défilement vertical optimisé, mais les cartes suivantes, EGA et VGA, le faisaient. Les optimisations en question sont nombreuses, mais nous allons en voir deux. La première optimisation que nous allons voir réutilise les techniques vues dans le chapitre sur le rendu 2D. Pour cela, il utilise un tampon de texte organisé en lignes de texte consécutives. Le tampon de texte mémorise plus de lignes que ce qui est affiché à l'écran. Ce qui est visible à l'écran est une portion du tampon de texte, appelée le ''viewport''. Ainsi, les lignes à afficher au-dessus ou en dessous du ''viewport'' sont déjà en mémoire vidéo. Il y a juste à fournir un registre qui pointe vers la position du ''viewport'' dans le tampon de texte, ce qui permet de faire bouger le ''viewport'' à volonté. Une autre solution, plus économe en RAM, fait usage d'un VDC à co-processeur. Pour rappel, ce sont des VDC qui incorporent un processeur qui exécute un programme d'affichage. Le programme, appelé la ''display list'', afficher une image à l'écran, ou du texte, ou tout ce qu'il faut afficher. Chaque instruction de la ''display list'' dit quoi afficher sur une ligne à l'écran. Ici, elle dit quoi afficher sur une ligne de texte, une ligne de caractère, et non une ligne de pixels comme dans les chapitres précédents. Un exemple de VDC à co-processeur en mode texte est celui des '''ordinateurs Amstrad PCW'''. Il s'agissait d'ordinateurs qui ne géraient que le mode texte, ils ne pouvaient pas afficher d'image pixel par pixel, ils n'avaient pas de ''framebuffer''. Le texte à afficher à l'écran n'était pas stocké dans un tableau unique, ligne par ligne, dans l'ordre de rendu, comme c'est le cas sur les autres cartes en mode texte. A la place, chaque ligne était stocké en mémoire séparément les unes des autres, ou presque. L'affichage était gouverné par une ''display list'' qui disait quelle ligne afficher, et dans quel ordre. La ''display list'' était une liste d'adresses, chacun pointant vers le début d'une ligne en mémoire vidéo. Toutes les lignes faisaient la même taille, ce qui fait que la ''display list'' avait juste à encoder l'adresse de départ de la ligne pour l'afficher correctement. Le processeur du VDC lisait la ''display list'' adresse par adresse et rendait les lignes dans l'ordre précisé par la ''display list''. Le défilement était alors simple à implémenter : il suffisait de modifier le contenu de la ''display list''. Par exemple, pour défiler d'une ligne vers le cas, on décalait son contenu de la ''display list'' d'un cran et on modifiait la ligne la plus en haut. L'avantage est que modifier une ''display list'' est plus rapide que de faire défiler l'ensemble du ''text buffer''. La ''display list'' était stockée dans une mémoire RAM spécialisée de 512 octets, ce qui permettait de stocker 256 adresses de 16 bits chacune. La ''display list'' avait 256 lignes, ce qui collait exactement à la résolution de 720 par 256 pixels de l'Amstrad PCW. LA RAM qui mémorisait la ''display list'' s'appelait la '''''roller RAM'''''. Elle était utilisée par le processeur 280 de la machine pour gérer le rendu de l'affichage. Le VDC utilisé était en effet très simple et se résumait sans doute à un vulgaire CRTC en mode texte. ==Le rendu en mode semi-graphique== [[File:Level 1 teletext test.png|vignette|Rendu d'une image en mode semi-graphique.]] Le rendu en mode texte ne permet en théorie de n'afficher que du texte. Cependant, il est possible d'émuler un rendu graphique à partir du mode texte, en trichant un petit peu. On a alors un mode de rendu appelé '''mode semi-graphique'''. Il y en a deux sous-types, appelés ''rendu graphique en bloc'' et ''pseudo-graphique'', qui seront détaillés ci-dessous. Les mode semi-graphiques sont en soi des techniques logicielles, qui ne demandent pas de support particulier de la part du matériel. Ils servent cependant d'introduction propédeutique au rendu en motifs qui sera vu à la fin du chapitre. La triche n'est possible que sur les cartes en mode texte sur lesquelles les caractères sont configurables, c’est-à-dire qu'on peut préciser à quoi ressemblent les caractères. Sur de telles cartes en mode texte, on peut fournir un dessin rectangulaire de quelques pixels de côté à la carte graphique et lui dire : ceci est le caractère numéro 40. L'idée est de remplacer les caractères par des dessins basiques, des '''motifs''', qui sont assemblés pour fabriquer des "sprites", qui sont eux-même assemblés pour former l'image finale. ==Le rendu à motif (''tiles'')== Le '''rendu en motifs''' est un proche cousin du mode texte. Il n'est cependant pas spécialisé pour du texte, mais permet de compresser des images complètes. Il a été utilisé sur des consoles de jeu, afin d'outrepasser les contraintes en mémoire RAM. les consoles 8 bits avaient peu de mémoire et ne pouvaient pas utiliser de ''framebuffer'', même en utilisant la technique de la palette indicée. Elles ne pouvaient pas non plus utiliser de tampon de ligne, car le processeur n'était pas assez puissant pour. Alors, elles utilisaient le rendu en motifs pour rendre des images avec peu de mémoire vidéo. ===Le stockage des ''sprites'' et de l’arrière-plan : les tiles=== [[File:Tile set.png|vignette|Tile set de Ultima VI.]] Le rendu en motifs force une certaine redondance à l'intérieur de l'arrière-plan et des ''sprites''. L'idée est que les ''sprites'' et l'arrière-plan sont fabriqués à partir de motifs, aussi appelés ''tiles''. Concrètement, ce sont des dessins carrés de 8, 16, 32 pixels de côtés, qui sont assemblés pour fabriquer un ''sprite'' ou l'arrière-plan. L'ensemble des motifs est mémorisée dans un fichier unique, appelé le ''tile set'', le ''tilemap'', ou encore la '''table des motifs'''. La table des motifs est placée dans la cartouche de jeu, souvent dans une mémoire ROM dédiée. Ci-contre, vous voyez la table des motifs du jeu Ultima VI. Les motifs sont numérotés, un numéro identifiant un motif parmi toutes les autres. L'image ne mémorise pas des pixels, mais des numéros de motifs. Le gain est assez appréciable : avec des motifs de 8 pixels de côté, au lieu de stocker X * Y pixels, on stocke X/8 * Y/8 numéros de motifs par image. La mémoire vidéo n'est donc pas un ''framebuffer'', mais un '''tampon de motifs'''. L'image à afficher à l'écran est reconstituée par la carte graphique, lors de l'affichage, en plusieurs étapes. Un avantage est que les motifs peuvent être utilisés en plusieurs endroits, ce qui garantit une certaine redondance. L'arrière-plan, qui est généralement l'image la plus redondante. Par exemple, un ciel est composé de motifs bleus identiques. Idem quand il faut rendre plusieurs petits ennemis identiques à l'écran : on n'utilise qu'un seul motif pour tous les ennemis. Pareil si un motifs est utilisé dans plusieurs ''sprites'', il n'est stockée qu'une seule fois. Il s'agit donc d'une forme de compression d'image qui profite d'une certaine redondance. Ajoutons à cela que les numéros de motifs prennent moins de place que la couleur d'un pixel, et les gains sont encore meilleurs. La consommation mémoire est déportée de l'image vers la mémoire qui stocke les motifs, une mémoire ROM intégrée dans la cartouche de jeu.''' '''. ===L'architecture d'une carte d'affichage en rendu à motifs=== Pour les consoles de 2ème, 3ème et 4ème génération, l'usage de motifs était obligatoire et tous les jeux vidéo utilisaient cette technique. Les cartes graphiques des consoles de jeux de cette époque étaient conçues pour gérer les motifs. Le matériel affichait l'image finale ligne par ligne, pixel par pixel comme le ferait un CRTC. Sauf qu'il détermine : dans quelle motif se trouve le pixel à afficher, où se trouve le pixel dans le motif (quelle ligne, quelle colonne). Une fois cela fait, le VDC accède à la mémoire vidéo pour récupérer le numéro de motif. Une fois le numéro de motif connu, il lit la table des potifs en mémoire ROM, sur la cartouche. Puis, il sélectionne le pixel à afficher dans ce motif, et l'envoie à la palette indicée, puis à l'écran. [[File:VDC à rendu à motif, sans gestion des sprites.png|centre|vignette|upright=2|VDC à rendu à motif, sans gestion des sprites]] Les motifs sont des équivalents des caractères dans le mode texte. Un motif peut être vu comme une sorte de super-caractère. Une carte d'affichage en mode texte et une carte en rendu à motifs sont d'ailleurs très similaires. Le tampon de motifs est l'équivalent pour le rendu à motifs du tampon de texte en mode texte. La table des motifs est l'équivalent de la table des caractères, les deux convertissent un caractère/''tile'' en pixels. La méthode d'adressage est fortement similaire, l'utilisation l'est aussi. La seule différence est leur contenu, la table des caractères stockant des caractères, la table des motifs stockant des motifs graphiques. Une optimisation permettait de lire certains motifs dans les deux sens à l'horizontale, de faire une sorte d'opération miroir. Ce faisant, on pouvait créer un objet symétrique en mémorisant seulement un motif. Par exemple, la moitié droite est générée par une opération miroir sur la partie gauche. Mais cette optimisation était assez rare, car elle demandait d'ajouter des circuits dans un environnement où le moindre transistor était cher. De plus, les objets symétriques sont généralement assez rares. Les ''sprites'' sont presque toujours gérés avec le rendu à motifs, pour des raisons de performance. Les ''sprites'' les plus simples sont un seul motif, mais les autres ''sprites'' sont formés en assemblant plusieurs motifs. Typiquement, un ''sprite'' prend de 2 à 4 motifs. Par exemple, un ''sprite'' de 16 pixels de haut et 8 pixels de large est composé de deux motifs de 8 pixels de côté. Pour cela, les registres pour les ''sprites'' mémorisent des numéros de motif, pas des pixels. [[File:Carte 2D avec un rendu en tile.png|centre|vignette|upright=2|Carte 2D avec un rendu en tile]] ===Le défilement avec des motifs=== Le défilement se marie assez mal avec un rendu à base de motifs. La solution la plus simple fait du défilement motif par motif, par sauts de 8 pixels. L'implémentation est la même qu'avec le défilement, à savoir qu'on utilise un ''viewport'' matériel. La différence est que la mémoire vidéo contient des motifs et non des pixels, idem pour le ''viewport''. Le résultat à l'écran n'est pas fluide du tout, il donne un défilement saccadé et désagréable. Pour corriger cela, il a existé des techniques pour implémenter du défilement du défilement pixel par pixel avec un rendu à motifs. Un défilement de ce type est appelé un '''défilement fluide''', ou encore du '''défilement pixel par pixel'''. La première implémentation du défilement fluide avec des motifs était purement logicielle, le VDC faisait lui du défilement motif par motif. Sur PC, la première implémentation a été trouvée par John Carmack, le programmeur derrière les moteurs des jeux IDSoftware comme DOOM, Quake, Wolfenstein 3D, etc. Il a inventé la technique de l'''Adaptive tile refresh'' qui permet justement d'avoir un défilement fluide sur des cartes sans gestion hardware du défilement. D'autres solutions logicielles similaires existaient sur console. Elles utilisaient 8 copies de chaque motif, chacun étant décalé d'un pixel. Le motif adéquat était choisi suivant un décalage dépendant du défilement. Mais il est possible de faire du défilement pixel par pixel avec un rendu à motifs, en ajoutant du hardware spécifique au VDC. Elles étaient implémentées sur les consoles de 4ème génération et antérieures, mais pas sur les anciens PC. Une des toute première console à gérer le défilement pixel par pixel était l'Intellivision, une des toutes premières consoles, précisément une console de deuxième génération. Elle avait des motifs de 8 pixels de côté, et permettait de défiler au pixel près. Pour cela, elle disposait d'un '''registre de décalage''' contenant une valeur allant de 0 à 7, qui indiquait de combien de pixels il fallait décaler l'image sur l'écran. Pour décaler d'une valeur plus grande, il fallait recourir au logiciel. Le logiciel devait alors faire défiler l'image en la déplaçant en mémoire vidéo. Il s'agissait donc d'une implémentation partielle du défilement avec des motifs. Le logiciel faisait du défilement motif par motif, et pouvait finir le travail en ajustant le tout pour obtenir un défilement pixel par pixel. Les consoles suivantes géraient le défilement pixel par pixel d'une manière plus optimisée, en gérant à la fois le registre de décalage et le défilement motif par motif. Le défilement pixel par pixel était réalisé en faisant un défilement motif par motif, puis en finissant le travail avec un registre de décalage. Le défilement motif par motif était géré comme expliqué ci-dessus, avec un ''viewport''. ===Les glitchs graphiques sur les bords de l'écran=== Malgré leur support matériel, il arrive que le défilement au pixel près cause des glitchs graphiques sur les bords de l'écran. La raison est qu'avec un défilement par pixel, les motifs aux bords de l'écran sont partiellement affichés. Par exemple, un motif sur le bord gauche ait ses pixels gauche en-dehors de l'écran, ses pixels droits dans l'écran. Idem mais sur le bord droit : un motif a ses pixels de gauche dans l'écran, ceux de droite en-dehors. Le problème est que de tels motifs peuvent ne pas être affichés si le VDC ne le permet pas. En général, les motifs partiellement en-dehors de l'écran ne sont pas affichés, ce qui cause des glitchs graphiques. Les VDC de l'époque ne pouvaient pas afficher un motif si ses coordonnées sont en-dehors de l'écran. En général, la coordonnée d'un motif est définie par rapport à une origine placée sur le pixel le plus en haut et le plus à gauche du motif. Dans ce cas, les motifs à gauche de l'écran ont une origine qui est en-dehors de l'écran, même si quelques pixels de droite sont affichés. Le motif n'est alors pas affiché. Ces pixels à droite disparaissent, ce qui fait qu'entre 0 et 7 pixels disparaissent pour un motif de 8 pixel de largeur, entre 0 et 15 pixels s'il a une largeur de 16 pixels, etc. Idem avec le défilement vertical, mais pour les motifs tout en haut de l'écran. : Si l'origine du motif est définie sur le bord droit, c'est les motifs à droite de l'écran qui disparaissent. Il y a la même chose avec les ''sprites''. Si leur origine est en-dehors de l'écran, mais que le reste du ''sprite'' est affiché, ils ne sont pas affichés. Une solution pour éviter les problèmes est de les faire rentrer d'un seul côté de l'écran, typiquement à droite si leur origine est définie à gauche. Si le défilement va dans le bon sens, aucun glitch graphique ne se manifeste. Pour cacher ces glitchs graphiques, il est possible d'ajouter des bandes noires sur les deux côtés de l'écran. Les bandes noires sont verticales et/ou horizontales, elle ont une largeur égale à un motif. Le VDC peut gérer nativement ces bandes noires, en matériel. Pour cela, il réduit simplement la résolution pour couper les bords de l'écran. {{NavChapitre | book=Les cartes graphiques | prev=Les cartes accélératrices 2D | prevText=Les cartes accélératrices 2D | next=Les accélérateurs de scanline | nextText=Les accélérateurs de scanline }} {{autocat}} pr7gpo4f57osjmelba7dris994xg8bf Les cartes graphiques/La microarchitecture des processeurs de shaders 0 81538 764883 763456 2026-04-24T17:56:13Z Mewtow 31375 /* L'Operand Collector et les caches de register reuse */ 764883 wikitext text/x-wiki La conception interne (aussi appelée microarchitecture) des processeurs de ''shaders'' possède quelques idiosyncrasies. Mais avant d'expliquer lesquelles, nous devons prévenir d'une chose importante : dans ce chapitre, nous ne parlerons que des GPU de l'époque DirectX 10 et après, pas des GPU de l'époque DirectX 9. La raison est que leur jeu d'instruction a franchement évolué, avec le passage d'architectures VLIW à des architectures SIMD. Et cela a eu des conséquences assez profondes sur le jeu d'instruction et leur microarchitecture. Nous n'allons parler des GPU de type SIMD dans ce chapitre. Un chapitre dédié sera consacré aux GPU de type VLIW. Pour rappel, un processeur de shader supporte plusieurs types d'instructions. Au minimum, il supporte des ''instructions SIMD''. Mais il peut aussi gérer des ''instructions scalaires'', à savoir qu'elles travaillent sur des entiers/flottants isolés, en dehors d'un vecteur SIMD. Typiquement, il y a plusieurs types d'instructions scalaires : les calculs entiers, les calculs flottants simples, les calculs flottants complexes dit transcendantaux (calculs trigonométriques, des exponentielles, des logarithmes, des racines carrées ou racines carrées inverse). En clair, un processeur de shader doit savoir faire des calculs. Et il a des circuits dédiés pour ça, appelés des unités de calcul. Les unités de calcul sont souvent classées en deux types : les ALU et les FPU. Les premières font des calculs sur des opérandes entiers, alors que les secondes font des calculs flottants. Au passage, le terme ALU signifie ''Arithmetic and Logic Unit'', alors que FPU signifie ''Floating Point Unit'', les deux termes étant assez parlants. Mais un GPU utilise non seulement des ALU et des FPU, mais aussi des regroupements de plusieurs ALU/FPU. Voyons cela en détail. ==Les unités de calcul d'un processeur de shader SIMD== Un processeur de shader contient un grand nombre d'unités de calcul très différentes. Le cœur est une unité de calcul SIMD, qui se charge des instructions SIMD. A cela, il faut souvent rajouter une ALU ou une FPU, parfois des unités de calcul flottantes spécialisées pour les opérations complexes, comme des opérations trigonométriques ou transcendantales. ===Les unités de calcul SIMD=== [[File:SIMD2.svg|vignette|Une unité de calcul SIMD.]] Un processeur de shader incorpore une unité de calcul SIMD, qui effectue plusieurs calculs en parallèle. Elle regroupe plusieurs ALU flottantes regroupées ensemble et avec quelques circuits pour gérer les débordements et d'autres situations. En théorie, une unité de calcul SIMD regroupe autant d'unité de calcul qu'il y a d'entiers/flottants dans un vecteur. Par exemple, pour additionner deux vecteurs contenant chacun 16 flottants, il faut utilise 16 additionneurs flottants. Ce qui fait qu'une opération sur un vecteur est traité en une seule fois, en un cycle d'horloge. Une contrainte importante est que toutes les sous-ALU effectuent la même opération : ce ne sont pas des ALU séparées qu'on peut commander indépendamment, mais une seule ALU regroupant des circuits de calcul distinct. Le cout en circuit est d'autant plus grand que les vecteurs sont longs et le cout est approximativement proportionnel à la taille des vecteurs. Entre des vecteurs de 128 et 256 bits, l'unité de calcul utilisera globalement deux fois plus de circuits avec 256 bits qu'avec 128. Même chose pour les registres, mais c'est là un cout commun à toutes les architectures. Il y a quelques unités de calcul SIMD où le calcul se fait en deux fois, car on n'a que la moitié des unités de calcul. Par exemple, pour un vecteur de 32 flottants, on peut utiliser 16 unités de calcul, mais le temps de calcul se fait en deux cycles d'horloge. Les opérations sur les vecteurs sont donc faites en deux fois : une première passe pour les 16 premiers éléments, une seconde passe pour les 16 restants. L'implémentation demande cependant qu'une instruction de calcul soit décodée en deux micro-opérations. Par exemple, une instruction SIMD sur des vecteurs de 32 éléments est exécutée par deux micro-instructions travaillant sur des vecteurs de 16 éléments. On économise ainsi pas mal de circuits, mais cela se fait au détriment de la performance globale. L'avantage est que cela se marie bien avec l'abandon des opérations pour lesquelles masques dont tous les bits sont à 0. Par exemple, prenons une instruction travaillant sur 16 flottants, exécutée en deux fois sur 8 flottants. Si le masque dit que les 8 premières opérations ne sont pas à exécuter, alors l'ALU ne fera que le calcul des 8 derniers flottants. Pour cela, le décodeur doit lire le registre de masque lors du décodage pour éliminer une micro-instruction si besoin, voire les deux si le masque est coopératif. ===Plusieurs unités SIMD, liées au format des données=== Il faut préciser qu'il y a une séparation entre unités SIMD flottantes simple et double précision. Pour le dire plus clairement, il y a des unités SIMD pour les flottants 32 bits, d'autres pour les flottants 64 bits, et même d'autres pour les flottants 16 bits. Les flottants 64 bits sont utilisés dans les applications GPGPU, les flottants 16 et 32 bits le sont dans le rendu 3D, et les flottants 16 bits pour tout ce qui lié à l'IA. Malheureusement, on doit utiliser des ALU flottantes séparées pour chaque taille, le format des flottants n'aidant pas. Depuis plus d'une décennie, les cartes graphiques ont des unités SIMD à la fois pour les calculs entiers et flottants. Elles sont censées être séparées. Pour NVIDIA, avant l'architecture Turing, les unités SIMD entières et flottantes sont décrites comme séparées dans leurs ''white papers'', avec des unités INT32 et FLOAT32 séparées, combinées à d'autres unités de calcul. L'architecture Volta a notamment des unités INT32, FLOAT32 et FLOAT64 séparées. A partir de l'architecture Ampere, il semblerait que les unités SIMD soient devenues capables de faire à la fois des calculs flottants et entiers, pour la moitié d'entre elles. Mais il se pourrait simplement qu'elles soient physiquement séparées, mais reliées aux reste du processeur de manière à ne pas être utilisables en même temps. Il est cependant possible que sur d'anciennes architectures, les unités entières et flottantes partagent des circuits, notamment pour ce qui est de la multiplication. En effet, une unité de calcul flottante contient des circuits pour faire des calculs entiers pour additionner/multiplier les mantisses et les exposants. Il est possible d'utiliser ce circuit Un exemple est le cas de l'architecture GT200 d'NVIDIA, sur laquelle les "pseudo-ALU" entières SIMD étaient limitées à des multiplications d'opérandes 24 bits, ce qui correspond à la taille d'une mantisse d'un flottant 32 bits. Le design exact des ALU n'est pas connu. ===Les unités de calcul scalaires=== Les GPU modernes incorporent une '''unité de calcul entière scalaire''', séparée de l'unité de calcul SIMD. Elle gère des calculs scalaires, à savoir qu'elle ne travaille pas sur des vecteurs. Elle gère divers calculs, comme des additions, soustractions, comparaisons, opérations bit à bit, etc. Elle exécute les instructions de calcul entière sur des nombres entiers isolés, de plus en plus fréquentes dans les shaders. Elle est parfois accompagnée d'une unité de calcul pour les branchements. Par branchements, on veut parler des vrais branchements similaires à ceux des CPU, qui effectuent des tests sur des entiers et effectuent des branchements conditionnels. Ils n'ont rien à voir avec les instructions à prédicat qui elles sont spécifiques à l'unité de calcul vectorielles. Ce sont des instructions séparées, totalement distinctes Les processeurs de shaders incorporent aussi une '''unité de calcul flottante scalaire''', utilisée pour faire des calculs sur des flottants isolés. L'unité de calcul gère généralement des calculs simples, comme les additions, soustractions, multiplications et divisions. Il s'agit typiquement d'une unité de calcul spécialisée dans l’opération ''Multiply-And-Add'' (une multiplication suivie d'une addition, opération très courante en 3D, notamment dans le calcul de produits scalaires), qui ne gère pas la division. L'unité de calcul flottante est souvent accompagnée d'une unité de calcul spécialisée qui gère les calculs transcendantaux, avec une gestion des calculs trigonométriques, de produits scalaires ou d'autres opérations. Elle porte le nom d''''unité de calcul spéciale''' (''Special Function Unit''), ou encore d'unité de calcul transcendantale, et elle a d'autres appellations. Elle est composée de circuits de calculs accompagnés par une table contenant des constantes nécessaires pour faire les calculs. Rappelons que les registres SIMD et les registres scalaires sont séparés et ne sont pas adressés par les mêmes instructions. Les registres scalaires sont placés dans un banc de registre physiquement séparé du banc de registres SIMD. Le banc de registre scalaire est relié à sa propre ALU scalaire, il y a vraiment une séparation physique entre registres scalaires et SIMD. Il existe cependant un système d'interconnexion qui permet d'envoyer un scalaire aux unités SIMD, ce qui est utile pour les opérations de produits scalaire ou autres. ==L'intérieur d'un processeur de shader== : Cette section sera surtout des rappels, pour ceux qui ont déjà lu un cours d'architecture des ordinateurs, et connait la notion de pipeline. En plus des unités de calcul, un processeur contient d'autres circuits, et un processeur de shader ne fait pas exception. Un processeur est composé de quatre circuits principaux : * les unités de calcul, qui font des calculs et d'autres opérations ; * les registres pour mémoriser les opérandes des calculs et leurs résultats ; * une unité mémoire pour échanger des données entre VRAM et registres ; * une unité de contrôle qui exécute les instructions. Les unités de calcul, les registres et l'unité mémoire sont souvent regroupés sous le terme de '''chemin de données'''. Le terme dit clairement que c'est la partie du processeur qui gère les données, les manipule, fait des calculs, etc. A côté du chemin de données, il y a une unité de contrôle, qui commande ce chemin de données pour qu'il fasse les instructions demandées. L'unité de contrôle lit les instructions depuis la mémoire vidéo, et configure le chemin de données, pour qu'il exécute l'instruction demandée. L'unité de contrôle sera détaillée dans la section suivante. ===Le chemin de données d'un processeur de shader=== Un processeur de shader contient au minimum une unité SIMD, et une unité scalaire. Il est possible d'utiliser les deux en même temps, grâce aux instructions à ''co-issue''. Elles sont surtout utiles pour exécuter des instructions scalaires en parallèle d'instruction SIMD, mais guère plus. Notez que j'ai dit : "au minimum une unité SIMD et une unité scalaire", car les processeurs de shaders modernes dupliquent les unités de calcul, pour des raisons qu'on expliquera dans la suite du chapitre. Il n'est pas rare qu'un processeur de shader dispose d'une dizaine d'unités SIMD et de 2 ou 3 unités scalaires. Nous avons vu les registres dans le chapitre précédent, aussi je ne vais pas revenir dessus. Je vais juste préciser que les registres sont regroupés dans des '''bancs de registres'''. Ce sont de petites mémoires dont chaque adresse contient un registre. En général, il y a un banc de registre pour les scalaires et un autre pour les vecteurs SIMD. Les deux sont séparés car ils ne sont pas utilisés par les mêmes instructions. Et c'est plus pratique à implémenter. L''''unité d'accès mémoire''' s'occupe des lectures et écriture en général, et elle prend en charge les accès aux textures, le filtrage de textures et tout un tas de fonctionnalités liées aux textures. La seule différence entre un accès aux textures et une lecture/écriture en mémoire est que les circuits de filtrage de texture sont contournés dans une lecture/écriture normale. Dans ce qui suit, nous allons l'appeler l'unité de texture par souci de simplification. ===L'unité de contrôle d'un processeur de shader=== L'unité de contrôle d'un GPU a quelques petites différences avec celles d'un CPU moderne. Les unités de contrôle des GPU n'utilisent pas les optimisations des CPU modernes, tant utiles pour du calcul séquentiel : pas d’exécution dans le désordre, de renommage de registres, et autres techniques avancées. A la place, elles utilisent des techniques alternatives qu'on décrira pdans la suite du chapitre, qui sont peu gourmandes en transistors. En conséquence, les unités de contrôle sont très simples, prennent peu de place, utilisent peu de transistors. La majeure partie du processeur est dédié aux unités de calcul et aux registres. [[File:Cpu-gpu.svg|centre|vignette|upright=2.0|Comparaison entre l'architecture d'un processeur généraliste et d'un processeur de shaders.]] Un processeur de shader a une unité de contrôle assez classique, composée de plusieurs circuits. * une unité de ''Fetch'' qui calcule l'adresse de la prochaine instruction ; * un cache d'instruction dans lequel on récupère la prochaine instruction, en présentant son adresse ; * une unité de décodage d'instruction, qui traduit l'instruction en signaux de commande à destination de l'unité de calcul et des registres ; * une unité d’''issue'', aussi appelée le ''scoreboard'', qu'on détaillera dans ce qui suit. Le tout est illustré ci-dessous, avec le chemin de données. Vous remarquerez que dans le chemin de données, il y a aussi une unité pour enregistres les résultats dans les registres, qui effectue pas mal de traitements importants qu'on ne peut pas détailler ici. Vous remarquerez aussi que l'unité qui calcule l'adresse de la prochaine instruction est un peu complexe. Mais laissons cela de côté pour le moment. [[File:Vortex microarchitecture.png|centre|vignette|upright=2.5|Exemple de microarchitecture d'un processeur de shader.]] ===Le pipeline d'un processeur de shader=== Un point important est que les processeurs de shaders utilisent la technique du '''pipeline'''. Les unités vues précédemment fonctionnent indépendamment des autres. Elles n'attendent pas que l'instruction soit terminée pour commencer à traiter la suivante. Concrètement, la première unité traite l'instruction courante, pendant que la suivante traite l'instruction précédente, et ainsi de suite : * la première unité calcule l'adresse de l'instruction numéro N; * le cache d'instruction lit l'instruction numéro N-1 ; * l'unité de décodage décode l'instruction numéro N-2 ; * le ''scoreboard'' analyse l'instruction numéro N-3 ; * les unités de calcul exécutent l'instruction numéro N-4 ; * l'unité d'enregistrement écrit le résultat de l'instruction numéro N-5 dans les registres. Faire ainsi maximise les performances, car cela permet d'exécuter plusieurs instructions en même temps, à des étapes différentes. Le débit d'instruction est maximisé, les shaders s'exécutent plus vite. Le nombre d'étapes exact dépend du processeur. Il arrive que des processeurs fusionnent des étapes en un seul circuit. Par exemple, l'unité de décodage et le ''scoreboard'' peuvent être regroupés dans une seule étape, de même que l'accès aux registres et le calcul dans l'ALU. D'autres processeurs scindent certaines étapes en plusieurs sous-circuits séparés. Par exemple, il peuvent scinder leurs ALU en plusieurs sous-ALU, chacune exécutant un morceau de calcul. Et cela permet d'expliquer pourquoi un processeur de ''shaders'' SIMD contient beaucoup d'unités de calcul, identiques, ou non. Les instructions prennent plusieurs cycles d'horloge à s’exécuter, ce qui fait qu'une instruction occupe une unité de calcul pendant 2 à 20 cycles, rarement plus. Cependant, le processeur peut démarrer une nouvelle instruction par cycle d'horloge. Et cela permet malgré tout de démarrer une nouvelle instruction dans une unité de calcul libre. Pendant qu'une instruction en est à son second ou troisième cycle dans une ALU, il est possible de démarrer une nouvelle instruction dans une ALU inoccupée, sans voir recours à la ''co-issue''. s'il y en a une. Par exemple, reprenons l'exemple de l'unité de ''vertex shader'' de la Geforce 6800, mentionné au-dessus. Elle dispose d'une unité de calcul SIMD MAD, et d'une unité de texture, ainsi que d'une unité de calcul scalaire transcendantale. Il en en théorie possible de faire en même temps : un calcul dans l'ALU SIMD, une lecture de texture dans l'unité mémoire, un calcul trigonométrique dans l'unité transcendantale. Il suffit de lancer la lecture de texture à un cycle, l’instruction MAD au cycle suivant, et l'instruction spéciale deux cycles après. ===Le ''scoreboard'' d'un processeur de shader=== Exécuter plusieurs instructions en même temps pose un problème quand deux instructions consécutives sont dépendantes l'une de l'autre. Un cas classique est quand une instruction a besoin du résultat de la précédente. Dans ce cas, l'instruction accède aux registres alors que la première n'a pas encore écrit dedans, ce qui pose un problème. Il s'agit d'une dépendance dite RAW (''Read After Write'') typique, que la carte graphique doit gérer automatiquement. La seconde instruction ne doit pas démarrer tant que la précédente n'a pas enregistré son résultat dans les registres. Le ''scoreboard'' gère ce genre de problèmes. Il détecte les dépendances entre instructions et les gère sans intervention extérieure. Pour cela, il vérifie si les opérandes de l'instruction sont en cours de calcul. Pour cela, il regarde quels registres l'instruction lit/écrit, et vérifie s'ils sont en cours d'utilisation. Pour savoir quels registres sont en cours d'utilisation, rien de plus simple : quand il démarre une instruction, le ''scoreboard'' marque ses registres comme en cours d'utilisation. Le ''scoreboard'' se contente de bloquer l'instruction tant qu'elle ne peut pas s'exécuter. Et les instructions suivantes sont aussi bloquées dans l'étage où elles sont. Rien ne progresse dans le pipeline tant que l'instruction fautive est bloquée. Cependant, les processeurs de shaders disposent de plusieurs optimisations concernant ce genre de situations. Voyons cela en détail. Et au-delà de ça, le ''scoreboard'' bloque l'exécution d'une instruction si les conditions ne sont pas remplies. Notamment, il vérifie qu'il y a une unité de calcul libre pour exécuter l'instruction. Si ce n'est pas le cas, l'instruction est bloquée. Au-delà de ça, il existe d'autres dépendances liées au fait que deux instructions utilisent les mêmes registres. Mais avec 4096 registres par ''shader'', elles sont plus rares, ce qui fait qu'on les laisse volontairement de côté. ===Exemple et résumé final=== Pour finir, nous allons voir un exemple final, celui des GPU Radeon X1000 series, de microarchitecture R500, Terascale. Leur microarchitecture est résumée dans le schéma ci-dessous. La portion gauche du schéma montre plusieurs choses. Le GPU contient un processeur de commande, appelé l'''ultra threaded dispatcher'' sur ces GPU. Il alimente plusieurs processeurs de shaders, ici appelés des ''compute unit'' (CU). De nombreux circuits sont partagés entre plusieurs processeurs. Par exemple, ils partagent un cache L2, dans lequel ils viennent récupérer les données nécessaires. Le GPU contient aussi des contrôleurs mémoire, qui lisent ou écrivent des données en mémoire vidéo. Les contrôleurs mémoire servent surtout d'interface entre la mémoire vidéo et le cache L2, mais ils peuvent aussi envoyer des données lue aux processeurs de shaders. Le focus de droite montre ce qu'il y a dans un processeur de shader. Déjà, l'unité de contrôle est en haut et est nommée ''Fetch, Decode, Schedule'' : ''Schedule'' est un synonyme de ''Issue''. L'unité mémoire est appelée la ''Load Store Unit'' (LSU), elle communique avec la mémoire vidéo et les registres. A côté, on trouve une unité de calcul SIMD et une unité de calculs scalaire. Pour ce qui est des mémoires, elle montre qu'il y a une petite mémoire locale généraliste, complétée avec deux bancs de registres : un pour les données scalaires, un pour les vecteurs SIMD. * Les registres pour les scalaires sont appelés les ''Scalar General Purpose Registers'' (GPR). * Les registres pour les vecteurs SIMD sont appelés les ''Vector General Purpose Registers'' (VGPR). * La mémoire locale généraliste, appelée la mémoire partagée (LDS). Niveau interconnexions, les flèches montrent plusieurs choses. Premièrement, l'unité mémoire est reliée aux bancs de registres, ainsi qu'à la mémoire locale. Les accès à la mémoire locale passent par l'unité mémoire, qui sert d'intermédiaire obligatoire. L'unité SIMD est connectée aux registres SIMD, l'unité scalaire est reliée au banc de registres scalaire. Rien d'étonnant. L'unité SIMD peut aussi lire des scalaires pour certaines instructions SIMD verticales, ce qui fait qu'elle est aussi connecté au banc de registres scalaires. [[File:MIAOW GPU diagram.png|centre|vignette|upright=2|Microarchitecture d'un GPU, avec un focus sur un processeur de shader.]] ==Le ''multithreading'' matériel des processeurs de shaders== L'unité d'''issue'' détecte les dépendances de données, et bloque les instructions si elles ne doivent pas s'exécuter. L'inconvénient est que, quand une instruction est bloquée, les instructions suivantes sont aussi bloquées dans l'étage où elles sont. Rien ne progresse dans le pipeline tant que l'instruction fautive est bloquée. Heureusement, les GPU et les CPU disposent de techniques pour surmonter ce blocage, afin de continuer à exécuter des instructions. Les CPU disposent de techniques d'exécution dans le désordre, de renommage de registre, et bien d'autres. Mais leur implémentation demande un budget en transistor conséquent, que les GPU ne peuvent pas se permettre. A la place, ils utilisent une technique appelée le '''''multithreading'' matériel''', qui vient du monde des CPU. Vous connaissez sans doute l'''hyperthreading'' d'Intel ? C'est une version basique du ''multithreading'' matériel. L'idée est d'exécuter plusieurs programmes en même temps sur le même processeur, le processeur commutant de l'un à l'autre suivant les besoins. Par exemple, si un programme est bloqué par un accès mémoire, d'autres programmes exécutent des calculs dans l'unité de calcul en parallèle de l'accès mémoire. Pour un GPU, les programmes en question sont des instances de shader qui travaillent sur des données différentes. Ces instances de shader portent les noms de ''warp'' dans la terminologie NVIDIA, mais on peut aussi parler de ''threads'' pour utiliser la même terminologie que pour les CPUs. Un processeur de ''shader'' commute donc régulièrement d'un ''warp'' à l'autre, suivant les besoins. Dans ce qui va suivre, nous allons voir dans quelles situations un processeur de ''shader'' change de ''thread''/''warp'' en cours d'exécution. Suivant le GPU, les situations ne sont pas les mêmes. Il existe trois techniques de ''multithreading'' matériel : le ''Fine Grained Multithreading'', le ''Coarse Grained Multithreading'' et le ''Simultaneous MultiThreading''. Dans ce qui suit, nous utiliserons l'abréviation FGMT pour parler du ''Fine Grained Multithreading'', de CGMT pour parler du ''Coarse Grained Multithreading'' et de SMT pour le ''Simultaneous MultiThreading''. Les GPU ont d'abord implémenté le CGMT dans la période DirectX 9, puis sont passé au FGMT, avant de passer au SMT sur les générations récentes. Aussi, nous allons les voir dans l'ordre. ===Le ''Coarse Grained Multithreading'' de l'époque DirectX 9=== Les processeurs de shader sont connectés à une mémoire vidéo très lente, avec un temps d'accès élevé, qui se rattrape avec un débit binaire important. La conséquence est qu'un accès à une texture, c'est long : si celle-ci est lue depuis la mémoire vidéo, le temps d'attente est d'une bonne centaine de cycles d'horloges. Pour limiter la casse, les unités de texture incorporent un cache de texture, mais cela ne suffit pas toujours à alimenter les processeurs de shaders en données. Et ces derniers ne peuvent pas recourir à des techniques avancées communes sur les CPU, comme l’exécution dans le désordre : le cout en circuit serait trop important. [[File:Coarse Grained Multithreading.png|thumb|Coarse Grained Multithreading.]] Fort heureusement, les processeurs de shaders utilisent le ''multithreading'' matériel pour masquer la latence des accès mémoire. L'idée est que si un ''thread'' démarre un accès mémoire, il est mis en pause pendant l'accès mémoire, et laisse sa place à un autre ''thread''. Ainsi, pendant qu'un ''thread'' est bloqué par un accès mémoire, un autre ''thread'' utilise les unités de calcul en parallèle. Cela permet de masquer la latence des accès mémoire. : Notons qu'avec cette technique, les lectures mettent en pause le ''thread'' qui les exécute. On parle alors de '''lectures bloquantes'''. Nous verrons que les processeurs de shader plus récents exécutent des lectures non-bloquantes, mais ce sera pour la suite. La technique ne donne de bons résultats que si les accès mémoire sont peu fréquents, ou que le nombre de ''threads'' est élevé. Plus les accès mémoire sont fréquents, plus il faut un nombre de ''threads'' important pour masquer la latence. A l'époque, il était rare que les ''vertex shader'' accèdent à des textures, alors que les pixels shaders ne faisaient que ça. Ls processeurs de shaders de la Geforce 6 géraient au maximum 4 ''threads'' simultanés, alors que les processeurs de pixel shaders en géraient facilement plus d'une centaine. Les cartes concurrentes d'ATI supportaient 128 ''threads'' maximum, par processeur de pixel shader. L'implémentation de cette technique est assez simple, au premier abord. Déjà, il y a un ''Program Counter'' par ''thread''. À chaque cycle, un multiplexeur choisit le ''Program Counter'' - le thread - qui a la chance de charger ses instructions. Le choix du ''program counter'' sélectionné est le fait de l''''unité d'ordonnancement'''. L'unité d'ordonnancement sait quels ''threads'' sont en cours d'exécution et lesquels sont en pause. Pour cela, elle intègre une petite mémoire qui mémorise l'état de chaque ''thread''. [[File:Architecture d'un processeur multithreadé.png|centre|vignette|upright=2|Architecture d'un processeur multithreadé]] La technique impose cependant que les registres soient dupliqués, pour que chaque ''thread'' ait ses propres registres rien qu'à lui. Sans cela, impossible de passer rapidement d'un ''thread'' à l'autre à chaque cycle. Un processeur de ''shader'' peut exécuter entre 16 et 32 ''threads''/''warps'', ce qui multiplie le nombre de registres par 16/32. Et il y a la même chose avec d'autres structures matérielles, comme les files de lecture/écriture de l'unité d'accès mémoire. [[File:Aperçu de l'architecture d'un processeur multithreadé.png|centre|vignette|upright=2|Aperçu de l'architecture d'un processeur multithreadé]] : La technique générale porte le nom de ''Coarse Grained Multithreading''. C'est une forme de ''Multithreading'' où on change de programme quand un évènement bien précis a lieu. Les GPU en utilisaient une version où les évènements en question sont des accès mémoire. En théorie, la technique s'adapte pour d'autres opérations que les accès mémoire, tant que celles-ci prennent beaucoup de temps. Mais je ne saurais dire si les GPU l'appliquaient pour autre chose que les accès mémoire. ===Interlude propédeutique : le ''Fine Grained Multithreading''=== [[File:Fine Grained Multithreading.png|thumb|Fine Grained Multithreading]] Peu avant les années 2010, les processeurs de shaders ont subit quelques changements, afin d'augmenter leur performance. Notamment, le nombre d'étapes du pipeline a augmenté, histoire d’exécuter plus d'instructions simultanément. Et cela a commencé à poser quelques problèmes : les situations où deux instructions utilisent les mêmes registres a augmenté, les dépendances de données sont devenues un problème. Et pour résoudre ces problèmes, les GPU ont basculé du CGMT vers une forme de ''multithreading'' qu'on ne trouve que sur les GPU, ou presque. Et pour la comprendre, nous allons devoir faire un léger détour par une forme de ''multithreading'' très similaire, utilisée sur les CPU. Il s'agit du ''Fine Grained Multithreading'' (FGMT). Avec le FGMT, le processeur de shader change de ''thread'' à chaque cycle d'horloge. Le processeur fait donc une rotation, à chaque cycle, parmi les ''threads'' actifs. Les ''threads bloqués'' par un accès mémoire ne sont pas pris en compte. Par exemple, imaginons que le processeur gère 32 ''threads'' simultanés, mais que 8 d'entre eux soient en pause lors d'un accès mémoire. Dans ce cas, il changera de ''thread'' tous les 24 cycles, car il ne prend en compte que les ''threads'' non-bloqués. Faire ainsi a de nombreux avantages, notamment pour ce qui est des dépendances entre instructions. En changeant de ''thread'' à chaque cycle, on "espace" les instructions d'un même ''thread''. Par exemple, si on a 8 ''threads'' qui s'exécutent en même temps, alors il y a 8 cycles d'horloges entre deux instructions d'un même ''thread''. La première instruction a alors eu tout le temps pour enregistrer son résultat dans les registres, avant même que la seconde instruction lise ses opérandes. Le processeur peut alors utiliser un ''scoreboard'' très limité, très simple, pour détecter les rares dépendances de données qui restent, voire peut se passer complétement de ''scoreboard'' ! ===Le ''Multithreading'' commandé par le ''scoreboard'' des années 2005-2010=== [[File:Full multithreading.png|thumb|Full multithreading]] Sur les GPU récents, le processeur de shader ne change pas de ''thread'' à chaque cycle. Il préfère exécuter plusieurs instructions consécutives d'un même ''thread'', dans des cycles d'horloge consécutifs. Il ne change de ''thread'' que quand une dépendance de donnée bloque une instruction. C'est donc le ''scoreboard'' qui commande le changement de ''thread'', là où le changement de ''thread'' était réalisé sans lui avec le CGMT ou le FGMT. L'implémentation matérielle sépare le processeur de ''shader'' en deux sections séparées par une mémoire tampon qui met en attente les instructions. Les instructions sont chargées et décodées, puis sont placées dans une ou plusieurs '''files d'instruction'''. Le cas le plus simple à comprendre utilise une file d'instruction par ''thread''. A chaque cycle, l'unité d'émission vérifie plusieurs instructions, une par file d'instruction. Il choisit alors une instruction prête, puis l'envoie aux unités de calcul. L'instruction peut venir de n'importe quelle file d'instruction. Mais pour que cela fonctionne, il faut que les files d'instructions soient remplies, ce qui implique que le processeur doit avoir chargée des instructions en avance. Plus haut, nous avions dit que l'unité de chargement mémorise plusieurs ''program counter'', un par ''thread'', et choisit à chaque cycle l'un d'entre eux pour charger une instruction. Le choix en question est synchronisé avec l'émission des instructions. Si un ''thread'' émet une instruction, ce même ''thread'' charge une instruction au même moment. Sauf si la file d'instruction du ''thread'' est déjà pleine, auquel cas un autre ''thread'' est choisi. Précisons que le grand nombre de registres et de ''threads'' fait qu'un ''scoreboard'' classique, tel que décrit dans les cours d'architecture des ordinateurs, devient rapidement impraticable. Aussi, une implémentation alternative est utilisée, bien que les détails ne soient pas connus à ce jour. Quelques brevets donnent des détails d'implémentation, mais on ne sait pas s'ils sont à jour. Les curieux peuvent tenter de lire le brevet américain numéro #7,634,621, nommé ''"Register File Allocation"'', déposé par NVIDIA durant décembre 2009. [[File:FGMT sur un processeur de shaders.png|centre|vignette|upright=2|FGMT sur un processeur de shaders]] L'usage d'un ''scoreboard'' permet de nombreuses optimisations, qui portent notamment sur les lectures, qui interagissent avec le FGMT. L'optimisation en question s'appelle les '''lectures non-bloquantes'''. Elle fonctionne si la lecture est suivie par d'autres instructions qui n’accèdent pas à la mémoire, par exemple des instructions de calculs. L'idée est d'exécuter ces instructions en avance, pendant que la lecture récupère la donnée. C'est possible car la lecture utilise l'unité mémoire et le cache, mais laisse libre les unités de calcul et les registres. En clair, pendant qu'on lit une texture, on fait des calculs en parallèle dans les ALU. Mais la technique n'est possible que si les instructions de calcul n'utilisent pas la donnée en cours de lecture. Heureusement, le ''scoreboard'' détecte si cela arrive en surveillant les registres. La lecture charge une donnée dans un registre, appelé le registre de destination (sous entendu, de destination de la lecture). Les instructions qui n'utilisent pas ce registre peuvent s'exécuter sans problèmes : elles sont indépendantes de la lecture. Mais dès qu'une instruction souhaite lire ou écrire dans ce registre, elle est bloquée par le ''scoreboard'' et le processeur change de ''thread''. Détecter les dépendances demande juste de mémoriser le registre de destination dans un registre temporaire, et de regarder si l'instruction à exécuter utilise ce registre. Une différence avec le CGMT est le moment où un ''thread'' est bloqué par une lecture. Avec des lectures bloquantes, un ''thread'' est bloqué dès que la lecture est lancée. Et ce même si les instructions suivantes sont indépendantes de la lecture. Par contre, avec les lectures non-bloquantes, un ''thread'' n'est pas bloqué à ce moment-là. Il continue son exécution jusqu'à ce qu'une instruction accède à la donnée lue. Si la lecture s'est déjà terminée, alors la donnée est disponible et le ''thread'' continue de s'exécuter. Mais si la lecture est encore en cours, alors le processeur bloque l'instruction et change de ''thread''. Une autre optimisation possible est l'usage de l''''émission multiple'''. Avec elle, le ''scoreboard'' peut émettre deux instructions lors du même cycle d'horloge, si elles utilisent des unités de calcul différentes. Les deux instructions doivent faire partie du même ''thread'', mais certains GPU acceptent qu'elles soient de deux ''threads'' différents, tout dépend du GPU. Par exemple, il est possible qu'une instruction d'un ''thread'' utilise l'unité de calcul SIMD, alors que l'autre lance une lecture de texture. Ou encore, les deux peuvent lancer des calculs SIMD, mais dans deux unités SIMD séparées. ===L'encodage explicite des dépendances sur les GPU post-2010=== Depuis environ 2010, les GPU n'utilisent plus de ''scoreboard'' proprement dit. A la place, les GPU modernes déportent la détection des dépendances de données à la compilation. L'idée est que chaque instruction contient quelques bits pour dire au processeur : tu peux lancer 1, 2, 3 instructions à la suite sans problème. La technique porte le nom d''''anticipation de dépendances explicite''' (''Explicit-Dependence lookahead''). Un exemple historique assez ancien est le processeur Tera MTA (''MultiThreaded Architecture''), qui utilisait cette technique. Les GPU NVIDIA modernes utilisent plusieurs bits par instruction pour gérer les dépendances de données. Un premier mécanisme est utilisé pour bloquer l'émission d'une nouvelle instruction pendant x cycles. Il utilise un '''''stall counter''''', qui mémorise le nombre de cycles d'attente. Une instruction peut initialiser le ''stall counter'' avec une valeur de base, qui indique combien de cycles attendre. Le ''stall counter'' est décrémenté à chaque cycle d'horloge et une nouvelle instruction s'exécute seulement quand le compteur atteint 0. Il est utilisé quand une instruction productrice prenant X cycles est suivie par une instruction consommatrice, le ''stall counter'' est alors initialisé à la valeur X. La méthode précédente ne fonctionne que pour les instructions dont le compilateur peut prédire la durée. Les accès mémoire et certains calculs complexes ne sont pas dans ce cas. Pour les gérer, les GPU modernes utilisent un autre mécanisme, basé sur des '''compteurs de dépendances'''. Il y en a entre 5 et 10 selon le GPU. Une instruction dite productrice réserve un de ces compteurs, l'incrémente quand elle démarre son exécution/est émise, le décrémente quand la dépendance est résolue. Les instructions consommatrices, qui utilisent le résultat de l'instruction productrice, attendent que le compteur tombe à zéro pour s'exécuter. Elles précisent quels compteurs regarder avec un '''masque de compteurs de dépendance''', encodé directement dans l'instruction elle-même. Précisément, chaque instruction productrice se réserve deux compteurs, pour gérer les trois types de dépendances de données (RAW, WAR et WAW). Le premier compteur est décrémenté quand le résultat est écrit dans les registres, ce qui gère naturellement les dépendances RAW et WAW. Le second est décrémenté quand l'instruction a lu ses opérandes, ce qui gère les dépendances WAR. Les autres instructions regardent l'un ou l'autre des compteurs selon leur situation. Il arrive que le switch de ''thread'' soit déclenché par des bits intégrés dans l'instruction. Par exemple, sur les GPU NVIDIA modernes, chaque instruction contient un bit '''''yield''''' qui indique qu'il faut changer de ''thread'' une fois l'instruction émise. En clair, il indique que l'instruction risque de durer longtemps, a des dépendances avec la mémoire ou autre chose qui fait qu'il est préférable de changer de ''thread''. ==Le banc de registres d'un processeur de ''shader''== Les GPU disposent d'un grand nombre de registres. Les normes de DirectX et Open GL imposent que les shaders modernes gèrent au moins 4096 registres généraux par instance de shader, avec des registres spécialisés en plus. En soi, 4096 est énorme ! Mais au-delà de ces normes, le FGMT implique de dupliquer des registres par le nombre de ''threads hardware'' simultanés. Avec le FGMT, les registres devront être dupliqués pour que chaque ''thread'' ait ses propres registres rien qu'à lui. Sans cela, impossible de passer rapidement d'un ''thread'' à l'autre à chaque cycle. Maintenant, faisons quelques calculs d'épiciers. Un processeur de ''shader'' peut exécuter entre 16 et 32 ''threads''/''warps'', ce qui multiplie le nombre de registres par 16/32. En multipliant par les 4096 registres nécessaires, cela fait 128 kilooctets de mémoire rien que pour les registres. Et c'est pour un seul cœur ! Si on multiplie par le nombre de cœurs, on trouve que les cartes graphiques modernes ayant plusieurs processeurs de ''shaders'' ont facilement entre 32 768 et 65 536 registres de 32 bits, ce qui est énorme ! Il y a plus de mémoire gaspillée dans les registres que dans le cache L1 ou L2 ! Et ce grand nombre de registres par cœur pose quelques problèmes. Les registres sont regroupés dans une petite mémoire SRAM, adressable, appelée le '''banc de registre'''. Et comme toutes les mémoires, plus ce banc de registres est grand, plus il est lent. En conséquence, lire un opérande dans les registres prend beaucoup de temps. Du moins, c'est le cas sans optimisations. Et les GPU implémentent de nombreuses parades pour limiter le nombre de registres réellement présents dans leur silicium. ===L'allocation dynamique/statique des registres par ''thread''=== Les GPU modernes n'implémentent pas le nombre maximal de registres demandés. Par exemple, si je prends les GPU AMD de type RDNA 4, il peuvent gérer 16 ''threads'' hardware simultanés, chacun ayant accès à 256 registres, registres faisant 128 octets chacun. On s'attend à avoir un banc de registre de 16 * 256 * 128 octets, soit 512 Kilo-octets. En somme, un banc de registre de la taille du cache L1. Sauf que les GPUs en question intègrent moins de registres que prévu ! Ils ont précisément une taille de 192 kilo-octets, soit 96 registres pour chacun des 16 ''threads''. En effet, 256 registres est un nombre maximal, que la plupart des ''shaders'' n'utilise pas totalement. La plupart des ''shaders'' utilise entre 64 et 128 registres, rarement moins, rarement plus. Aussi, le GPU partitionne le banc de registres à la demande entre les ''threads'', en leur donnant seulement une partie des registres. Le partitionnement peut être pseudo-statique, à savoir que le banc de registre est découpé en parts égales pour chaque ''thread'', ou dynamique avec un nombre de registre variant d'un ''thread'' à l'autre, selon les besoins. Prenons l'exemple d'un '''partitionnement pseudo-statique''', avec l'exemple des GPU AMD RDNA 1 et 2. Leur banc de registre fait 1024 registres, de 128 octets chacun, soit 128 KB au total. Le GPU gère 16 ''threads'' simultanés maximum. Avec un seul ''thread'' d'exécuté, le ''thread'' unique peut utiliser les 1024 registres du banc de registre pour lui tout seul. Avec deux ''threads'', chacun aura droit à 512 registres, soit la moitié du cas précédent. Avec 16 ''thread'' simultanés, chaque ''thread'' a accès à 64 registres, pas plus. Et ainsi de suite : le nombre de registre par ''thread'' est égal à la taille du banc de registre divisée par le nombre de ''threads''. A l'heure où j'écris ces lignes, courant 2025, les GPU Intel se contentent d'un partitionnement statique très limité. Avant les GPU d'architecture Battlemage, il n'y avait pas de partitionnement du banc de registre, tous les ''threads'' avaient 128 registre à leur disposition. Les GPU Battlemage et ses successeurs ont introduit un partitionnement limité, avec deux modes : un mode sans partitionnement où tous les ''threads'' ont accès à 128 registres, un mode avec partitionnement qui divise le nombre de ''thread'' par deux et leur donne chacun 256 registres. Pas de possibilité de diviser plus le nombre de ''threads''. Les GPU AMD et NVIDIA sont eux plus compétents niveau partitionnement statique. Par exemple, les GPU RDNA 4 supportent les partitionnements suivants : * 16 ''threads'' avec 96 registres chacun ; * 12 ''threads'' avec 120 registres chacun ; * 10 ''threads'' avec 144 registres chacun ; * 9 ''threads'' avec 168 registres chacun ; * 8 ''threads'' avec 192 registres chacun ; * 7 ''threads'' avec 216 registres chacun ; * 6 ''threads'' avec 240 registres chacun ; * 5 ''threads'' avec 256 registres chacun. Le partitionnement pseudo-statique est simple à implémenter, il ne demande pas beaucoup de circuits pour fonctionner. Il est rapide et a de bonnes performances pour le rendu graphique en rastérisation. La raison est qu'en rastérisation, les différents ''threads'' sont souvent des copies/instances d'un même ''shader'' qui travaillent sur des données différentes. Leur donner le même nombre de registres colle bien avec cet état de fait. Cependant, si les différents ''threads'' sont des ''shaders'' différents, les choses ne sont pas optimales. Un ''shader'' utilisera plus de registres que l'autre, leur donner le même nombre de registres n'est pas optimal. Par exemple, imaginons que l'on a deux shaders, nommés shaders 1 et 2, aux besoins différents, l'un étant gourmand en registres et l'autre très économe. Dans ce cas, il faudrait partitionner le banc de registre pour donner plus de registre au premier et moins au second. Il s'agit là d'un '''partitionnement dynamique'''. Le partitionnement dynamique est plus optimal pour gérer des ''shaders'' déséquilibrés niveau registres, mais a une implémentation matérielle plus complexe. Il a été introduit assez tard, car il a fallu attendre que le rayctracing se démocratise. En effet, le partitionnement dynamique du banc de registre est surtout utile pour le raytracing. Exécuter simultanément des shaders déséquilibrés en registres est peu fréquent avec la rastérisation, beaucoup plus courant avec le raytracing. NVIDIA et AMD ont des implémentations différentes du partitionnement dynamique. Les GPU AMD RDNA 4 allouent un nombre minimal de registre à chaque ''thread'', mais ils peuvent demander d'avoir accès à plus de registres si besoin. Quand un ''thread'' a besoin de plus de registres, il exécute une instruction dédiée, qui sert à demander plus de registres, ou au contraire à en libérer s'ils sont inutilisés. La demande d'allocation de nouveaux registres se fait par blocs de 16 à 32 registres, suivant comment est configuré le processeur. Précisons que l'instruction d'allocation n'est disponible que pour les ''compute shaders'' et pas les ''shaders'' graphiques. L'instruction d'allocation de registre précédent peut échouer dans certains cas. Si assez de registres sont disponibles, à savoir inutilisés par d'autres ''threads'', l'instruction réussit. Dans le cas contraire, elle échoue et le ''shader'' est mis en pause avant de retenter cette demande plus tard. Le résultat de l'instruction, échec ou réussite, est mémorisé dans le registre d'état. La technique a pour défaut que certaines situations peuvent mener à un blocage complet du processeur, où chaque ''thread'' ne peut plus poursuivre son exécution, faute de registres disponibles. Des méthodes pour éviter cette situation sont implémentés sur ces GPU, mais la documentation n'est pas très explicite. Sur les GPU NVIDIA, il y a aussi une instruction d'allocation de registre, mais elle fonctionne différemment. Elle permet d'échanger des registres entre ''threads''. Une première différence est que tous les ''threads'' commencent avec une allocation égale des registres. Les ''threads'' démarrent tous avec le même nombre de registres. Un ''thread'' peut libérer des registres, qui sont alors alloués à un autre ''thread'', le ''thread'' en question pouvant être choisit par le ''thread'' qui libère les registres. ===Le banc de registre est multiport de type externe=== Le banc de registre doit permettre de lire deux vecteurs SIMD par opération, soit deux lectures simultanées. Pour cela, le banc de registre contient deux ports de lecture, chacun permettant de lire un opérande dans le banc de registre. Mais plus le nombre de ports augmente, plus la consommation énergétique du banc de registre augmente, sans compter que celui-ci devient plus lent. Les processeurs peuvent utilisent des bancs de registres ayant réellement deux ports par banc de registre. Un port de lecture est implémenté avec un composant appelé un multiplexeur, connecté à tous les registres. [[File:Mémoire multiport faite avec des MUX-DEMUX.png|centre|vignette|upright=2|Mémoire multiport faite avec des MUX-DEMUX]] Les GPU ne peuvent pas se permettre un tel luxe. Leur banc de registre doit alimenter plusieurs unités de calcul en même temps, en parallèle. Le nombre de ports serait plus proche de 4 à 10 ports de lectures. La solution précédente aurait un budget en transistor et un budget thermique trop important. À la place, ils utilisent une autre méthode : ils simulent un banc de registre à plusieurs ports avec un ou plusieurs bancs de registres à un port. On parle alors de '''multiport externe'''. [[File:Mémoire multiport à multiportage externe.png|centre|vignette|upright=2.5|Mémoire multiport à multiportage externe.]] Il existe plusieurs méthodes de multiport externe. Mais celle utilisée sur les GPU simule un banc de registre multiport à partir de plusieurs bancs de registres à un port. Le banc de registre est en réalité formé de plusieurs banques, de plusieurs bancs de registre séparés, chacun mono-port. L'idée est que si l'on accède à deux banques en même temps, on peut lire deux opérandes, une par port/banc de registre. Par contre, si les deux opérandes à lire sont la même banque, il y a un '''conflit d'accès aux banques'''. [[File:Mémoire à multiports par banques.png|centre|vignette|upright=2|Mémoire à multiports par banques.]] ===L'''Operand Collector'' et les caches de ''register reuse''=== Sans conflit d'accès à une banque, les deux opérandes sont disponibles immédiatement. Par contre, en cas de conflit d'accès aux banques, les deux opérandes sont lus l'une après l'autre. En clair, le premier opérande doit être mis en attente quelque part pendant que la seconde est en cours de lecture. Et le problème survient souvent, surtout avec les opérations FMA qui utilisent trois opérandes, encore plus avec les rares opérations qui demandent 4 à 5 opérandes. Pour gérer les conflits d'accès aux banques, les GPU utilise un circuit dédié, appelé le '''collecteur d'opérandes''' (''operand collector''). Le rôle du collecteur d'opérandes est d'accumuler les opérandes en attente, son nom est assez transparent. Il accumule les opérandes en attente, puis les envoie aux unités de calcul quand elles sont toutes prêtes, toutes lues depuis le banc de registres. Les opérandes sont mis en attente dans des entrées, qui contiennent la donnée, l'identifiant du ''thread''/''warp'' pour ne pas confondre des opérandes entre ''threads'', et deux bits d'occupation. Les deux bits d'occupation indiquent si l'entrée est vide, réservée pour un opérande en cours de lecture ou occupée par un opérande. Le collecteur d'opérande est souvent accompagné de '''registres temporaires''', qui mémorisent le résultat d'une instruction précédente. Il y a un registre temporaire par ALU, le résultat fournit par une ALU est mémorisé dans le registre temporaire associé. Une instruction peut lire une opérande dans un registre temporaire, ce qui permet de lire le résultat d'une instruction précédente sans passer par le banc de registres. Le collecteur d'opérande est alors configuré pour récupérer les opérandes adéquats dans les registres temporaires adéquats. : Pour faire une comparaison avec les processeurs modernes, ces registres sont une forme de ''data forwarding'', de contournement, mais qui est rendue explicite pour le logiciel. Une optimisation des GPU récent vise à réduire les accès aux bancs de registres en utilisant une mémoire cache spécialisée. Il s'agit de l'''operand reuse cache'', aussi appelés '''''register reuse cache'''''. L'idée est que quand un opérande est lu depuis le banc de registres, elle peut être stockée dans ce cache pour des utilisations ultérieures. Les architectures Volta, Pascal et Maxwell disposent de 4 caches de ce type, chacun stockant 8 données/opérandes/résultats Il s'agit en réalité de pseudo-caches, car ils sont partiellement commandés par le logiciel. Une instruction précise qu'un opérande doit être stocké dans un ''register reuse cache'', pour une utilisation ultérieure. Pour cela, elle incorpore quelques bits pour préciser qu'elle doit être placée dans le cache. Les bits font en quelque sorte partie du mode d'adressage. Si l'instruction immédiatement suivante lit ce registre dans le même ''slot'' d'opérande lira l'opérande dans le cache. La technique est donc assez limitée, mais elle a des résultats pas négligeables. Les ''register reuse cache'' et le collecteur opérandes sont sans doute fusionnés en un seul circuit, plutôt que d'utiliser deux circuits séparés. La raison est que les deux doivent mémoriser des opérandes les mettre en attente pour une utilisation ultérieure, et sont placés juste après le banc de registre. NVIDIA a publié deux brevets à propos de ces deux techniques, mais rien n'indique que c'est exactement cette technique qui utilisée dans les cartes modernes. Il faut dire que le nombre de banques a changé suivant les cartes graphiques. * [https://patents.google.com/patent/US7834881B2/en Operand collector architecture ] * [https://patents.google.com/patent/US20130159628A1/en Methods and apparatus for source operand collector caching ] <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les processeurs de shaders | prevText=Les processeurs de shaders | next=Les caches d'un processeur de shader | netxText=Les caches d'un processeur de shader }}{{autocat}} </noinclude> 0eg9vums6qk9r1jrxuk51nwosru2ura Les cartes graphiques/Avant les GPUs : les cartes accélératrices 3D 0 81913 764870 763961 2026-04-24T17:48:27Z Mewtow 31375 /* L'usage de plusieurs unités géométriques en parallèle */ 764870 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu les bases du rendu 3D. Nous avons parlé de textures, de rastérisation, des calculs d'éclairage, et de bien d'autres choses. Vers la fin du chapitre, nous avons parlé des shaders, des programmes informatiques exécutés sur la carte graphique. Mais ils n'ont pas été toujours présents ! Les anciennes cartes graphiques faisaient sans shaders. Elles étaient autrefois appelées des '''cartes accélératrices 3D''', encore que la terminologie ne soit pas très précise.Nous les opposerons aux cartes graphiques capables d'exécuter des shaders, qui sont couramment appelées des '''Graphic Processing Units''', des GPUs. L'introduction des shaders a grandement modifié l'architecture des cartes graphiques. Il a fallu ajouter des processeurs pour exécuter les shaders, qui n'étaient pas là avant. Par contre, les circuits déjà présents ont été conservés, intégrés aux processeurs de shaders, ou remplacés par ceux-ci. D'un point de vue pédagogique, il est préférable de voir les cartes accélératrices 3D, avant de voir comment elles ont évolués vers des GPUs. Et nous allons voir cela dans deux chapitres. Ce chapitre portera sur les cartes accélératrices 3D, sans shaders, alors que le suivant expliquera comment s'est passée la transition vers les GPUs. : Nous allons nous concentrer sur les cartes graphiques à placage de texture inverse, le placage de texture direct ayant déjà été abordé dans le chapitre précédent. ==L'architecture d'une carte graphique 3D== Une carte accélératrice 3D est un carte d'affichage à laquelle on aurait rajouté des circuits de rendu 3D. Elle incorpore donc tous les circuits présents sur une carte d'affichage : un VDC, une interface avec le bus, une mémoire vidéo, des circuits d’interfaçage avec l'écran, un contrôleur DMA, etc. Le VDC s'occupe de l'affichage et éventuellement du rendu 2D, mais ne s'occupe pas du traitement de la 3D. Du moins, c'est le cas sur les cartes à placage de texture inverse. Le placage de texture direct utilise au contraire un VDC avec accélération 2D très performant, comme nous l'avons vu au chapitre précédent. Mais nous mettons ce cas particulier de côté. La carte accélératrice 3D reçoit des commandes graphiques, qui proviennent du pilote de la carte graphique, exécuté sur le processeur. les commandes en question sont très variées, avec des commandes de rendu 3D, de rendu 2D, de décodage/encodage vidéo, des transferts DMA, et bien d'autres. Mais nous allons nous concentrer sur les commandes de rendu 3D, qui demandent à la carte accélératrice 3D de faire une opération de rendu 3D. Pour cela, elles précisent quel tampon de sommet utiliser, quelles textures utiliser, quels shaders sont nécessaires, etc. La carte accélératrice 3D traite ces commandes grâce à deux circuits : des circuits de rendu 3D, et un chef d'orchestre qui dirige ces circuits de rendu pour qu'ils exécutent la commande demandée. Le chef d'orchestre s'appelle le '''processeur de commandes''', et il sera vu en détail dans quelques chapitres. Pour le moment, nous allons juste dire qu'il s'occupe de la logistique, de la répartition du travail. Pour les commandes de rendu 3D, il commande les différentes étapes du pipeline graphique et s'assure que les étapes s’exécutent dans le bon ordre. [[File:Architecture globale d'une carte 3D.png|centre|vignette|upright=2|Architecture globale d'une carte 3D]] Les circuits de rendu 3D regroupent des circuits hétérogènes, aux fonctions fort différentes. Dans le cas le plus simple, il y a un circuit pour chaque étape du pipeline graphique. De tels circuits sont appelés des '''unités de traitement graphique'''. On trouve ainsi une unité pour le placage de textures, une unité de traitement de la géométrie, une unité de rasterization, une unité d'enregistrement des pixels en mémoire appelée ROP, etc. Les anciennes cartes graphiques fonctionnaient ainsi, mais on verra que les cartes graphiques modernes font un petit peu différemment. Pour simplifier les explications, nous allons séparer la carte graphique en deux gros circuits bien distincts. En réalité, ils sont souvent séparés en sous-circuits plus petits, mais laissons cela de côté pour le moment. * Les '''unités géométriques''' pour les calculs géométriques ; * Les '''pipelines de pixel''' qui rastérisent l'image, plaquent les textures, et autres. Les unités géométriques manipulent des triangles, sommets ou polygones, donc des données géométriques. Les unités de pixel font tout le reste, mais le gros de leur travail est de manipuler des pixels ou des texels. Dans ce chapitre, on considère que les deux sont des circuits fixes, nous verrons leur évolution vers des processeurs programmables dans le prochain chapitre. ===Les circuits de traitement des pixels=== Parlons un peu plus en détail des pipelines de pixels. Pour mieux comprendre ce qu'elles font, il est intéressant de regarder ce qu'il y a dans un pipeline de pixel. Un pipeline de pixel effectue plusieurs opérations les unes à la suite, dans un ordre bien précis. Et cela explique l'usage du terme "pipeline" pour les désigner. Et ces opérations sont souvent réalisées par des circuits séparés, qui sont : * Un '''rastériseur''' qui fait le lien entre triangles et pixels ; * Une '''unité de texture''' qui lit les textures et les plaque sur les modèles 3D ; * Un '''ROP''' (''Raster Operation Pipeline''), qui gère grossièrement le tampon de profondeur (''z-buffer''). Le circuit de '''rastérisation''' prend en charge la rastérisation proprement dite. Pour rappel, la rastérisation projette une scène 3D sur l'écran. Elle fait passer d'une scène 3D à un écran en 2D avec des pixels. Lors de la rastérisation, chaque sommet est associé à un ou plusieurs pixels, à savoir les pixels qu'il occupe à l'écran. Elle fournit aussi diverses informations utiles pour la suite du pipeline graphique : la profondeur du sommet associé au pixel, les coordonnées de textures qui permettent de colorier le pixel. L'étape de '''placage de texture''' lit la texture associée au modèle 3D et identifie le texel adéquat avec les coordonnées textures, pour colorier le pixel. On travaille pixel par pixel, on récupère le texel associé à chaque pixel. Soit l'inverse du placage de texture direct, qui traversait une texture texel par texel, pour recopier le texel dans le pixel adéquat. Après l'étape de placage de textures, la carte graphique enregistre le résultat en mémoire. Lors de cette étape, divers traitements de '''post-traitement''' sont effectués et divers effets peuvent être ajoutés à l'image. Un effet de brouillard peut être ajouté, des tests de profondeur sont effectués pour éliminer certains pixels cachés, l'antialiasing est ajouté, on gère les effets de transparence, etc. Un chapitre entier sera dédié à ces opérations. [[File:Unité post-géométrie d'une carte graphique sans elimination des surfaces cachées.png|centre|vignette|upright=1.5|Unité post-1.5éométrie d'une carte graphique sans elimination des surfaces cachées]] ===Les circuits d'élimination des pixels cachés=== L'élimination des surfaces cachées élimine les triangles invisibles à l'écran, car cachés par un objet opaque. En théorie, elle est prise en charge à la toute fin du pipeline, dans les ROPs, car cela permet de gérer la transparence. En effet, on ne sait pas si une texture transparente sera plaquée sur le triangle ou non. En clair, on doit éliminer les triangles invisibles après le placage de textures, et donc dans les ROP. Les ROPs se chargent à la fois de l’élimination des pixels cachées et de la transparence, les deux s’influençant l'un l'autre. [[File:Unité post-géométrie d'une carte graphique avec elimination des surfaces cachées dans les ROPs.png|centre|vignette|upright=2|Unité post-géométrie d'une carte graphique avec élimination des surfaces cachées dans les ROPs]] Il y a cependant des cas où on sait d'avance que les textures ne sont pas transparentes. Dans ce cas, la carte graphique utilise les circuits d'élimination des pixels cachés juste après la rastérisation. Cela permet d'éliminer à l'avance les triangles dont on sait qu'ils ne seront pas rendus. [[File:Unité post-géométrie d'une carte graphique.png|centre|vignette|upright=2|Unité post-géométrie d'une carte graphique]] Les deux possibilités coexistent sur les cartes graphiques modernes. Une carte graphique moderne peut éliminer les surfaces cachées avant et après la rastérisation, grâce à des techniques d''''''early-z''''' dont nous parlerons plus tard, dans un chapitre dédié sur la rastérisation. ===Les circuits d'éclairage=== Les explications précédentes décrivent une carte graphique qui ne gère pas les techniques d'éclairage, et nous allons remédier à cela immédiatement. L'éclairage a été pris en charge avant même l'arrivée des shaders, dès les années 2000. Par contre, les cartes accélératrices pour PC géraient uniquement l'éclairage par sommet. Elles utilisaient un circuit non-programmable, appelé le '''circuit de ''Transform & Lightning''''', qui effectue les calculs d'éclairage par sommet (le L de T&L), en plus des calculs de transformation (le T de T&L). La première carte graphique à avoir intégré un circuit de T&L était la Geforce 256, la Geforce 1. L'unité de T&L a rapidement été remplacée par les ''vertex shader'', dont nous reparlerons d'ici quelques chapitres. Dès la Geforce 3, ce remplacement été effectué. L'unité de T&L calcule une couleur RGB pour chaque sommet/triangle, appelée la '''couleur de sommet'''. Une fois calculée par l'unité de T&L, la couleur de sommet est envoyée à l'unité de rastérisation. L'unité de rastérisation calcule la couleur des pixels à partir des trois couleurs de sommet. Pour cela, il y a deux méthodes principales, qui correspondent à l'éclairage plat et l'éclairage de Gouraud, qu'on a vu dans le chapitre précédent. Les cartes accélératrices utilisaient généralement l'éclairage de Gouraud. L'éclairage de Gouraud effectue une interpolation, à savoir une sorte de moyenne pondérée de la couleur des trois sommets. L'éclairage de Gouraud demande donc d'ajouter un circuit d'interpolation pour les couleurs des sommets. Il fait normalement partie du circuit de rastérisation, comme on le verra dans le chapitre dédié sur la rastérisation. Pour donner un exemple, la console de jeu Playstation 1 gérait l'éclairage de Gouraud directement en matériel, mais seulement partiellement. Elle n'avait pas de circuit de T&L, ni de ''vertex shaders'', mais intégrait une unité de rastérisation qui interpolait les couleurs de chaque sommet. Enfin, il faut prendre en compte les textures. Pour cela, le pixel texturé est multiplié par la luminosité/couleur calculée par l'unité géométrique. Il y a donc un '''circuit de combinaison''' situé après l'unité de texture qui effectue la combinaison/multiplication. Le circuit de combinaison est parfois configurable, à savoir qu'on peut remplacer la multiplication par une addition ou d'autres opérations. Un tel circuit de combinaison s'appelle alors un '''''combiner''''', dans la vieille nomenclature graphique de l'époque des années 90-2000. [[File:Implémentation de l'éclairage par sommet avec des combiners.png|centre|vignette|upright=2|Implémentation de l'éclairage par sommet avec des combiners]] Il a existé quelques rares cartes graphiques capables de faire de l'éclairage par pixel en matériel. Un exemple de carte graphique capable de faire cela est celle de la Nintendo DS, la PICA200. Créée par une startup japonaise, elle incorporait un circuit de T&L, un éclairage de Phong, du ''cel shading'', des techniques de ''normal-mapping'', de ''Shadow Mapping'', de ''light-mapping'', du ''cubemapping'', de nombreux effets de post-traitement (bloom, effet de flou cinétique, ''motion blur'', rendu HDR, et autres). Pour l'éclairage de Phong, il faut ajouter une unité qui fasse les calculs d'éclairage par pixel, et renvoie son résultat. La couleur de pixel calculée est ensuite combinée avec une texture, avec un ''combiner''. Du moins, si la carte accélératrice supporte les textures... Il faut aussi que le rastériseur interpole les normales, et non des couleurs de sommets comme avec l'éclairage de Gouraud. Les normales sont fournies par l'unité de T&L, ce qui demande une modification assez importante des unités de T&L et du rastériseur. [[File:Implémentation de l'éclairage par pixel avec des combiners.png|centre|vignette|upright=2|Implémentation de l'éclairage par pixel avec des combiners]] Voyons maintenant le ''bump-mapping'' et le ''normal-mapping''. Pour rappel, les deux dernières mémorisent des informations d'éclairage dans une texture en mémoire vidéo. La texture contient des informations de relief pour le ''bump-mapping'', des normales précalculées pour le ''normal-mapping''. Pour cela, l'unité d'éclairage par pixel doit être reliée à l'unité de texture, mais l'implémentation matérielle n'est pas aisée. [[File:Normal mapping matériel.png|centre|vignette|upright=2|Normal mapping matériel]] ==Les cartes graphiques avec plusieurs unités parallèles== Plus haut, nous avons décrit une carte graphique basique, très basique, avec seulement quatre unités. Une unité pour les calculs géométriques, un rastériseur, une unité pour les pixels/textures et un ROP. Cependant, les cartes graphiques ayant cette architecture sont très rares, pour ne pas dire inexistantes. Il n'est pas impossible que les toutes premières cartes graphiques aient suivi à la lettre cette architecture, mais même cela n'est pas sur. La raison : toutes les cartes graphiques dupliquent les circuits précédents pour gagner en performance, mais aussi pour s'adapter aux contraintes du rendu 3D. ===L'amplification des pixels et son impact sur les cartes graphiques=== Un triangle prend une certaine place à l'écran, il recouvre un ou plusieurs pixels lors de l'étape de rastérisation. Le nombre de pixels recouvert dépend fortement du triangle, de sa position, de sa profondeur, etc. Un triangle peut donner quelques pixels lors de l'étape de rastérisation, alors qu'un autre va couvrir 10 fois de pixels, un autre seulement trois fois plus, un autre seulement un pixel, etc. Le cas où un triangle ne recouvre qu'un seul pixel est rare, encore que la tendance commence à changer avec les jeux vidéos récents de la décennie 2020 utilisant l'Unreal Engine et la technologie Nanite. La conséquence est qu'il y a plus de travail à faire sur les pixels que sur les sommets, ce qui a reçu le nom d''''amplification des pixels'''. La conséquence est qu'une unité géométrique prendra un triangle en entrée, l'enverra au rastériseur, qui fournira en sortie un ou plusieurs pixels à éclairer/texturer. Et cette règle un triangle = 1,N pixels fait qu'il y a un déséquilibre entre les calculs géométriques et ce qui suit, que ce soit le placage de textures, l'éclairage par pixel ou l'enregistrement des pixels dans le ''framebuffer''. Et ce déséquilibre a un impact sur la manière dont un conçoit une carte graphique, ancienne comme moderne. S'il y a une seule unité de texture/pixels, alors le rastériseur envoie chaque pixel à texturer/éclairé un par un à l'unité de pixel. Le rastériseur produits ces pixels un par un, avec un algorithme adapté pour. L'unité géométrique attendra le temps que la rastérisation ait fini de traiter tous les pixels du triangle précédent. Elle calculera le prochain triangle pendant ce temps, mais cela ne fera que limiter la casse si beaucoup de pixels sont générés. Mais il est possible de profiter de l'amplification des pixels pour gagner en performances. L'idée est que le rastériseur produit plusieurs pixels en même temps, qui sont envoyés à plusieurs unités de texture et d'éclairage par pixel. Un exemple est illustré ci-dessous, avec une seule unité géométrique, mais quatre unités de texture, quatre unités d'éclairage par pixel, et quatre ROPs. Le rastériseur est conçu pour générer quatre pixels d'un seul coup si nécessaire. [[File:Architecture d'un GPU tenant compte de l'amplification des pixels.png|centre|vignette|upright=2.5|Architecture d'un GPU tenant compte de l'amplification des pixels]] La carte graphique précédente a des performances optimales quand un triangle recouvre 4 pixels : tout est fait en une seule passe. Si un triangle ne recouvre que 1, 2 ou 3 pixels, alors le rastériseur produira 1, 2 ou 3 et certaines unités suivant le rastériseur seront inutilisées. Mais si un triangle recouvre plus de 4 pixels, alors les pixels sont générés, texturés, éclairés et enregistrés en RAM par paquets de 4. En clair, la carte graphique peut s'adapter à l'amplification des pixels, mais pas parfaitement. Les GPU récents ont résolu partiellement ce problème avec un système de ''shaders'' unifiés, mais qu'on ne peut pas expliquer pour le moment. Pour donner un exemple du monde réel, les premières cartes graphique de l'entreprise SGI était de ce type. SGI a été une entreprise pinière dans le domaine du rendu en 3D, qui a opéré dans les années 80-90, avant de progressivement décliner et fermer. Elle a conçu de nombreux systèmes de type ''workstation'', donc destinés aux professionnels, avec des cartes graphiques dédiées. le grand public n'avait pas accès à ce genre de matériel, qui était très cher, vu qu'on n'était qu'au tout début de l'informatique. Nous ne détaillerons pas ces systèmes, car ils géraient leur mémoire vidéo d'une manière assez bizarre : elle était éclatée en plusieurs morceaux fusionnés chacun avec un ROP... Mais ils avaient tous une unité géométrique unique reliée à un rastériseur, qui alimentait plusieurs unités de texture/pixel et ROPs. Plus proche de nous, certaines cartes graphiques pour PC étaient aussi dans ce cas. Les toutes premières cartes graphiques pour PC n'avaient même pas de circuits géométriques, et se contentaient d'un rastériseur, d'unités de texture et de ROPs. Par la suite, la Geforce 256 a introduit une unité géométrique appelée l'unité de T&L. Les cartes graphiques de l'époque ont suivi le mouvement et ont aussi intégrée une unité géométrique presque identique. La Geforce 256 avait une unité géométrique, mais 4 unités de texture, 4 unités d'éclairage par pixel et 4 ROPs. ===Le multitexturing : dupliquer les unités de texture=== Le '''''multi-texturing''''' est une technique très importante pour le rendu 3D moderne. L'idée est de permettre à plusieurs textures de se superposer sur un objet. Divers effets graphiques demandent d'ajouter des textures par-dessus d'autres textures, pour ajouter des détails, du relief, sur une surface pré-existante. Un exemple intéressant vient des jeux de tir : ajouter des impacts de balles sur les murs. Pour cela, on plaque une texture d'impact de balle sur le mur, à la position du tir. Il s'agit là d'un exemple de ''decals'', des petites textures ajoutées sur les murs ou le sol, afin de simuler de la poussière, des impacts de balle, des craquelures, des fissures, des trous, etc. Le ''multi-texturing'' implique que calculer un pixel implique de lire plusieurs textures. En général, un pixel avec ''multi-texturing'' demande de lire deux textures, rarement plus. La carte graphique doit alors être capable d'accéder à deux textures en même temps, ou du moins faire semblant que. De plus, elle doit combiner les deux textures pour générer le pixel voulu, ce qui demande d'ajouter un circuit qui combine deux texels (des pixels de texture) pour donner un pixel. La solution la plus simple est de doubler les unités de texture et de combiner les textures dans l'unité d'éclairage par pixel. Résultat : pour une unité d'éclairage par pixel, on a deux unités de textures. La Geforce 2 et 3 utilisaient cette solution, dont le seul défaut est que la seconde unité de texture était utilisée seulement pour les objets sur lesquels le ''multi-texturing'' était utilisé. Les cartes ATI, le concurrent de l'époque de NVIDIA, aujourd'hui racheté par AMD, triplait les unités de texture. Mais cette possibilité était peu utilisée, la majorité des jeux se dépassant pas deux texture max par pixel. C'est sans doute pour cette raison que ce triplement a été abandonné à la génération suivante, les Radeon 9000 et 8500 se contentant de doubler les unités de texture. {|class="wikitable" |- ! Nom de la carte graphique !! Unités géométriques !! Unité de texture !! Unités de pixel !! ROPs |- ! Geforce 2 d'entrée de gamme | 1 || 2 || 4 || 2 |- ! Geforce 2 milieu/haut de gamme, Geforce 3 | 1 || 4 || 8 || 4 |- ! Radeon R100 bas de gamme | 1 || 1 || 3 || 1 |- ! Radeon R100 autres | 1 || 2 || 6 || 2 |} ===L'usage de plusieurs unités géométriques=== Pour encore augmenter les performances, il est possible d'utiliser plusieurs circuits de calcul géométriques, plusieurs unités géométriques. Et ce peu importe que ces unités soient des processeurs ou des circuits fixes non-programmables. Et pour cela, il existe deux grandes implémentations : utiliser plusieurs processeurs placés en série, ou les mettre en parallèle. Comprendre la première implémentation demande de faire quelques rappels sur les calculs géométriques. ====L'usage d'un pipeline géométrique proprement dit==== Pour rappel, le pipeline géométrique regroupe les quatre étapes suivantes : * L'étape de '''chargement des sommets/triangles''', qui sont lus depuis la mémoire vidéo et injectés dans le pipeline graphique. * L'étape de '''transformation''' effectue deux changements de coordonnées pour chaque sommet. ** Premièrement, elle place les objets au bon endroit dans la scène 3D, ce qui demande de mettre à jour les coordonnées de chaque sommet de chaque modèle. C'est la première étape de calcul : l'''étape de transformation des modèles 3D''. ** Deuxièmement, elle effectue un changement de coordonnées pour centrer l'univers sur la caméra, dans la direction du regard. C'est l'étape de ''transformation de la caméra''. * La phase d''''éclairage''' (en anglais ''lighting'') attribue une couleur à chaque sommet, qui définit son niveau de luminosité : est-ce que le sommet est fortement éclairé ou est-il dans l'ombre ? * La phase d''''assemblage des primitives''' regroupe les sommets en triangles. * Les phases de '''''clipping''''' ou le '''''culling''''' agissent sur des sommets/triangles/primitives, même si elles sont souvent regroupées dans l'étape de rastérisation. Si on met de côté le chargement des sommets/triangles, il est possible de faire tous ces calculs en bloc, dans un seul processeur ou une seule unité de T&L. Mais une autre idée, plus simple, attribue un processeur/circuit pour chaque étape. En faisant cela, on peut traiter plusieurs triangles/sommets en même temps, chacun étant dans une étape différente, chacun dans un processeur/circuit. Ceux qui auront déjà lu un cours d'architecture des ordinateurs reconnaitront la fameuse technique du pipeline, mais appliquée ici à un algorithme plus conséquent. Les processeurs sont en série, et chaque processeur reçoit les résultats du processeur précédent, et envoie son résultat au processeur suivant. Sauf en début ou en bout de chaine, évidemment. Pour donner un exemple, les premières cartes graphiques de SGI utilisaient 10/12 processeurs enchainés l'un à la suite de l'autre. Les 4 premiers géraient les étapes de transformation, les 6 suivants faisaient les opérations de clipping/culling, les deux derniers faisaient la rastérisation proprement dite. Pour lisser les transferts de données, il est possible d'ajouter des mémoires FIFOs entre les processeurs. Comme ça, si un processeur est bloqué par un calcul un peu trop long, cela ne bloque pas les processeurs précédents. A la place, le processeur précédent accumule des résultats dans la mémoire FIFOs, qui seront consommé ultérieurement. En théorie, on peut s'attendre à ce que la performance soit multipliée par le nombre de processeurs. En réalité, les étapes sont rarement équilibrées, certaines étapes prennent beaucoup plus de temps que les autres, ce qui fait que la répartition des calculs n'est pas idéale : certains processeurs attendent que le processeur suivant ait finit son travail. De plus, l'organisation en pipeline entraine des couts de transmission/communication entre étapes, notamment si on utilise des mémoires FIFOs entre processeurs, ce qui est toujours le cas. Cette implémentation n'a été utilisée que sur les toutes premières cartes graphiques, avant l'apparition des PC grand public. Les systèmes SGI, utilisés pour des stations de travail, utilisaient cette architecture, par exemple. Mais elle est totalement abandonnée depuis les années 90. ====L'usage de plusieurs unités géométriques en parallèle==== La seconde solution utilise plusieurs unités géométriques en parallèle. Chaque unité géométrique traite un triangle/sommet de bout en bout, en faisant transformation, éclairage, etc. Mais vu qu'il y en a plusieurs, on peut traiter plusieurs triangles/sommets : un dans chaque unité géométrique. C'est la solution retenue sur toutes les cartes graphiques depuis les années 90. Mais la présence de plusieurs unités géométriques a deux conséquences : il faut alimenter plusieurs unités géométriques en triangles/sommets, il faut gérer l'envoi des triangles au rastériseur. Les deux demandent des solutions distinctes. La répartition du travail sur les unités géométriques est déléguée au processeur de commandes. Il utilise les unités géométriques à tour de rôle : on envoie le premier triangle à la première unité, le second triangle à la seconde unité, le troisième triangle à la troisième, etc. Il s'agit de ce que l'on appelle l''''algorithme du tourniquet''', qui est assez efficace malgré sa simplicité. Il marche assez bien quand tous les triangles/sommets mettent approximativement le même temps pour être traités. Si le temps de calcul varie beaucoup d'un triangle/sommet à l'autre, une solution toute simple détecte quels sont les processeurs de shaders libres et ceux occupés. Il suffit alors d'appliquer l'algorithme du tourniquet seulement sur les processeurs de shaders libres, qui n'ont rien à faire. Un autre problème survient cette fois-ci en sortie des unités géométriques. Comment connecter plusieurs unités géométriques au reste de la carte graphique ? Évidemment, la carte graphique contient plusieurs unités de texture/pixel et plusieurs ROPs. Elle tient compte de l'amplification des pixels, ce qui fait qu'il y a moins d'unités géométriques que d'autres circuits, entre 2 à 8 fois moins environ. Pour créer une carte graphique avec plusieurs unités géométriques, il y a plusieurs solutions, que nous allons détailler dans ce qui suit. Pour les explications, nous allons prendre l'exemple de cartes graphiques avec 2 unités géométriques et 8 unités de texture/pixel, et autant de ROPs. La première solution serait simplement de dupliquer les circuits précédents, en gardant leurs interconnexions. Pour l'exemple, on aurait 2 unités géométriques, chacune connectée à 4 unités de textures/pixels. L'unité géométrique est suivie par un rastériseur qui alimente 4 unités de texture/pixel, comme c'était le cas dans la section précédente. L'implémentation est alors très simple : on a juste à dupliquer les circuits et à modifier le processeur de commande. Il faut aussi modifier les connexions des ROPs à la mémoire vidéo. Mais les interconnexions avec le rastériseur ne sont pas modifiées. Un désavantage est que l'amplification des pixels n'est pas gérée au mieux. Imaginez que l'on ait deux triangles à rastériser, qui génèrent 8 pixels en tout : un qui génère 6 pixels à la rastérisation, l'autre seulement 2. Il n'est pas possible de traiter les 8 pixels générés. Le triangle générant deux pixels va alimenter deux unités de texture/pixels et en laisser deux inutilisées, l'autre triangle sera traité en deux fois (4 pixels, puis 2). La duplication bête et méchante n'utilise donc pas à la perfection les unités de texture/pixel. Une autre solution permet de gérer à la perfection l'amplification des pixels. Elle consiste à utiliser un seul rastériseur à haute performance, sur lequel on connecte les unités géométriques et les unités de texture/pixel. L'idée est que le rastériseur peut recevoir N triangles à la fois et alimenter M unités de texture/pixels. Le rastériseur unique s'occupe de faire plusieurs rastérisations de triangles à la fois, et répartit automatiquement les pixels générés sur les unités de texture/pixel. Pour donner un exemple, le GPU Geforce 6800 de NVIDIA avait 6 unités géométriques, 16 unités faisant à la fois placage de textures et éclairage par pixel, et 16 ROPs. Un point important avec ce GPU est qu'il n'avait qu'un seul rastériseur, détail sur lequel on reviendra dans ce qui suit ! <noinclude>[[File:GeForce 6800.png|centre|vignette|upright=2.5|GeForce 6800, les unités géométriques sont ici appelées les ''vertex processor'', les unités de texture/pixel sont les ''fragment processors'', les ROPs sont les ''pixel blending units''.]]</noinclude> ==Les cartes graphiques en mode immédiat et à tuile== Il est courant de dire qu'il existe deux types de cartes graphiques : celles en mode immédiat, et celles avec un rendu en tuiles (''tiles''). Il s'agit là des deux types principaux de cartes graphiques à l'heure actuelle, mais quelques architectures faisaient autrement dans le passé. Une autre classification, plus générale, sépare les cartes graphiques en cartes graphiques ''sort-last'', ''sort-first'' et ''sort-middle''. Les cartes graphiques en mode immédiat correspondent aux cartes graphiques en mode immédiat, alors que le rendu à tuile est une sous-catégorie des cartes graphiques ''sort-middle''. La différence entre les deux est liée à la manière dont les pixels/primitives sont réparties sur l'écran. Leur existence est liée au fait que les API graphiques imposent que les triangles envoyées à la carte graphique soient traités dans l'ordre. Le tampon de sommets contient en effet une liste de sommets/triangles, qui sont censés être traités dans l'ordre d'arrivée. Et si je dis censé être, c'est parce que la carte graphique ne va pas forcément traiter les triangles/pixels dans l'ordre. A la place, elle va traiter des triangles/pixels en parallèle, et il n'est pas garantit que les résultats sortent des circuits dans l'ordre d'arrivée. Après tout, certains triangles sont traités plus rapidement que d'autres, idem pour les pixels. La carte graphique doit donc remettre les résultats dans l'ordre. L'endroit du pipeline où se fait cette remise en ordre est ce qui fait la différence entre cartes graphioques ''sort last'' et ''sort middle''. ===Les trois types de cartes graphiques : ''sort-first'', ''sort-middle'' et ''sort-last''=== Les cartes graphiques ''sort-first'' ont plusieurs pipelines séparés, chacun traitant une partie de l'écran. Ils déterminent la position des triangles à l'écran, puis répartissent les triangles dans les pipelines adéquats. Par exemple, on peut imaginer un GPU ''sort-first'' avec quatre unités séparées, chacune traitant un quart de l'écran. Au tout début du rendu, une unité de répartition détermine la position d'un triangle à l'écran, et l'envoie à l'unité adéquate. Si le triangle est dans le coin inférieur gauche, il sera envoyé à l'unité dédiée à ce coin. S'il est situé au milieu de l'écran, il sera envoyé aux quatre unités, chacune ne traitant les pixels que pour son coin à elle. Les cartes graphiques ''sort-middle'' découpent l'écran en carrés de 4, 8, 16, 32 pixels de côté , qui sont rendus séparément les uns des autres. Les morceaux d'image en question sont appelés des ''tiles'' en anglais, mot que nous avons décidé de ne pas traduire pour ne pas le confondre avec les tuiles du rendu 2D. Il y a une assignation stricte entre une unité de pixel/texture et une ''tile''. Par exemple, sur un système avec deux unités de texture/pixel, la première unité traitera les ''tiles'' paires, l'autre unité les ''tiles'' impaires. Les cartes graphiques ''sort-last'' sont l'extrême inverse. Ils ont des unités banalisées qui se moquent de l'endroit où se trouve un pixel à l'écran. Leurs unités géométriques traitent des polygones sans se préoccuper de leur place à l'écran. Le rastériseur envoie les pixels aux unités de textures/ROPs sans se soucier de leur place à l'écran. Encore que quelques optimisations s'en mêlent pour profiter au mieux des caches de texture et des caches intégrés aux ROPs, mais l'essentiel est qu'il n'y a pas de répartition fixe. Il n'y a pas de logique du type : ce pixel ou ce triangle est à tel endroit à l'écran, on l'envoie vers telle unité de texture/ROP. Ce sont les ROPs qui se chargent d'enregistrer les pixles finaux au bon endroit dans le ''framebuffer''. La gestion de la place des pixels à l'écran se fait donc à la toute fin du pipeline, d'où le nom de ''sort-last''. Pour résumer, les trois types de cartes graphiques se distinguent suivant l'endroit où les triangles/pixels sont répartis suivant leur place à l'écran. Avec le ''sort-first'', ce sont les triangles qui sont triés suivant leur place à l'écran. Le tri a donc lieu avant les unités géométriques. Avec le ''sort-middle'', ce sont les fragments générés par la rastérisation qui sont triés suivant leur place à l'écran, d'où l'existence de ''tiles''. Le tri a lieu entre les unités géométriques et le rastériseur. Les unités géométriques se moquent de la place à l'écran des primitives qu'ils traitent, mais pas les rastériseurs et les unités de texture. Enfin, avec le ''sort-last'', ce sont les pixels finaux qui sont triés selon leur place à l'écran, seuls les ROPs se préoccupent de cette place à l'écran. Concrètement, les cartes graphiques de type ''sort-first'' sont très rares, l'auteur de ce cours n'en connait aucun exemple. Les deux autres types de cartes graphiques sont eux beaucoup plus communs. Reste à voir ce qu'il y a à l'intérieur d'une carte graphique ''sort-middle'' et/ou ''sort-last''. Pour simplifier les explications, nous allons regrouper les circuits de traitement des pixels dans un seul gros circuits appelé le rastériseur, par abus de langage. La carte graphique est donc composée de deux circuits : l'unité géométrique et le mal-nommé rastériseur. Les cartes graphiques ajoutent des mémoires caches pour la géométrie et les textures, afin de rendre leur accès plus rapide. [[File:Carte graphique, généralités.png|centre|vignette|upright=2|Carte graphique, généralités]] ===Les cartes graphiques ''sort-last'', en mode immédiat=== Les cartes graphiques en mode immédiat implémentent le pipeline graphique d'une manière assez évidente. L'unité géométrique envoie des triangles au rastériseur, qui lui-même envoie les pixels à l'unité de texture, qui elle-même envoie le pixel texturé au ROP. Elles effectuent le rendu 3D triangle par tringle, pixel par pixel. Un point important est que pendant que le pixel N est dans les ROP, les pixels N+1 est dans l'unité de texture, le pixel N+2 est dans le rastériseur et le triangle suivant est dans l'unité géométrique. En clair, on n'attend pas qu'un triangle soit affiché pour en démarrer un autre. Un problème est qu'un triangle dans une scène 3D correspond souvent à plusieurs pixels, ce qui fait que la rastérisation prend plus de temps de calcul que la géométrie. En conséquence, il arrive fréquemment que le rastériseur soit occupé, alors que l'unité de géométrie veut lui envoyer des données. Pour éviter tout problème, on insère une petite mémoire entre l'unité géométrique et le rastériseur, qui porte le nom de '''tampon de primitives'''. Elle permet d'accumuler les sommets calculés quand le rastériseur est occupé. [[File:Carte graphique en rendu immédiat.png|centre|vignette|upright=2|Carte graphique en rendu immédiat]] Le tout peut s'adapter à la présence de plusieurs unités géométriques, de plusieurs unités de texture ou processeurs de shaders, tant qu'on conserve un rastériseur unique. Il suffit alors d'adapter le tampon de primitive et le rastériseur. Si on veut rajouter des unités de texture ou des processeurs de pixel shaders, le tampon de primitives n'est pas concerné : il suffit que le rastériseur ait plusieurs sorties, une par unité de texture/pixel shader. Par contre, la présence de plusieurs unités géométriques impacte le tampon de primitive. Avec plusieurs unités géométriques, il y a deux solutions : soit on garde un tampon de primitive unique partagé, soit il y a un tampon de primitive par unité géométrique. Avec la première solution, toutes les unités géométriques sont reliées à un tampon de primitives unique. Le tampon de primitive est conçu pour qu'on puisse écrire plusieurs primitives dedans en même temps. Le rastériseur n'a pas à être modifié. Une autre solution utilise un tampon de primitive par unité géométrique. Le rastériseur peut alors piocher dans plusieurs tampons de primitive, ce qui demande de modifier le rastériseur. Il y a alors un système d'arbitrage, pour que le rastériseur pioche des primitives équitablement dans tous les tampons de primitive, pas question que l'un d'entre eux soit ignoré durant trop longtemps. ===Les cartes graphiques ''sort-middle'' des années 90=== Voyons maintenant les architectures ''sort-middle'' utilisée dans les années 80-90, à une époque où les cartes graphiques grand public n'existaient pas encore. Les cartes graphiques de l’entreprise SGI sont dans ce cas, mais aussi le Pixel Planes 5, et de nombreux autres systèmes graphiques. Elles utilisaient un rendu à ''tile'' assez original. Dans ce qui suit, nous allons décrire l'architecture des systèmes SGI, qui sont représentatifs. L'idée était que l'image était découpée en un nombre de ''tiles'' qui variait selon le système utilisé, mais qui était au minimum de 5 et pouvait aller jusqu'à 20. Et chaque ''tile'' avait sa propre unité de traitement, qui contenait un rastériseur, une unité de texture, un ROP, etc. En clair, la carte graphique contenait entre 5 et 20 unités de traitement séparées, chacune dédiée à une ''tile''. Les triangles sortant des unités géométriques étaient envoyés à toutes les unités de traitement, sans exception. Une fois le triangle réceptionné, l'unité de traitement déterminait si le triangle s'affichait dans la ''tile'' associée ou non. Si c'est le cas, le rastériseur rastérise le triangle, génère les pixels, les textures sont lues, puis le tout est enregistré en mémoire vidéo. Si ce n'est pas le cas, elle abandonne le polygone/triangle reçu. Si le triangle est partiellement dans la ''tile'', le rastériseur génère les pixels qui sont dans la ''tile'', par les autres. Précisons que les cartes de ce style incorporaient un tampon de primitive, ce qui permettait de simplifier la conception de la carte graphique. Sur la carte ''Infinite Reality'', le tampon de primitive faisait 4 méga-octets de RAM, ce qui permettait de mémoriser 65 536 sommets. Sur la carte ''Reality Engine'', il y avait même plusieurs tampons de primitives, un par unité géométrique. Les polygones sortaient des unités géométriques, étaient accumulés dans les tampons de primitives, puis étaient ''broadcastés'' à toutes les unités de traitement. Pour cela, le bus en bleu dans le schéma précédent est en réalité un réseau ''crossbar'' avec un système de ''broadcast''. Une caractéristique de ces architectures est qu'elles mettent le ''framebuffer'' à part de la mémoire vidéo. De plus, ce ''framebuffer'' est lui-même découpée en ''tile''. Sur la carte ''Reality Engine'', le ''framebuffer'' est découpé en 5 à 20 sous-''framebuffer'', un par ''tile''. Et chaque mini-''framebuffer'' est placé dans l'unité de traitement de la ''tile'' associée ! Ainsi, au lieu de connecter 5-20 ROPs à une mémoire vidéo unique, chaque ROP contient une '''''RAM tile''''', qui mémorise la ''tile'' en cours de traitement. Évidemment, cela pose quelques problèmes pour la connexion au VDC, en raison de l'absence de ''framebuffer'' unique, mais rien d'insurmontable. L'architecture est illustrée ci-dessous. : Le Pixel Planes 5 avait un système similaire, mais avait en plus un ''framebuffer'' complet, dans lequel les sous-''framebuffer'' étaient recopiés pour obtenir l'image finale. [[File:Architecture des premières cartes graphiques SGI.png|centre|vignette|upright=2|Architecture des premières cartes graphiques SGI]] Un autre détail de l'architecture est lié à la mémoire pour les textures. Les concepteurs de SGI ont décidé de séparer les textures dans une mémoire à part du reste de la mémoire vidéo. Il n'y a pour ainsi dire pas de mémoire vidéo proprement dit : la géométrie à rendre est dans une mémoire à part, idem pour les textures, et pour le ''framebuffer''. On s'attendrait à ce que la mémoire de texture soit reliée aux 5-20 unités de texture, mais les concepteurs ont décidé de faire autrement. A la place, chaque unité de texture contient une copie de la mémoire de texture, qui est donc dupliquée en 5-20 exemplaires ! Difficile de comprendre la raison de ce choix, mais cela simplifiait sans doute les interconnexions internes de la carte graphique, au prix d'un cout en RAM assez important. ===Les cartes graphiques à rendu à ''tile''=== Les cartes graphiques de SGI, vus précédemment, disposent d'une unité de traitement par ''tile''. Faire ainsi permet de nombreuses optimisations, comme éclater le ''framebuffer'' en plusieurs ''RAM tile''. Mais le cout en matériel est conséquent. Pour économiser des circuits, l'idéal serait d'utiliser moins d'unités de traitement pour les pixels/fragments/textures. Mais pour cela, il faut profondément modifier l'architecture précédente. On perd forcément le lien entre une unité de traitement et une ''tile''. Et cela impose de revoir totalement la manière dont les unités géométriques communiquent avec les unités de traitement. La solution retenue est celle des cartes graphiques à rendu en ''tile'' proprement dit, aussi appelés ''cartes graphiques TBR'' (''Tile Based Rendering''). Les plus simples n'utilisent qu'une seule unité de traitement et n'ont qu'une seule ''RAM tile''. En conséquence, les ''tiles'' sont rendues l'une après l'autre. Au lieu de rendre chaque triangle/polygone l'un après l'autre, la géométrie est intégralement rendue avant de faire la rastérisation. Les triangles sont enregistrés dans la mémoire vidéo et regroupés par ''tile'', avant la rastérisation. La mémoire vidéo contient donc plusieurs paquets de triangles, avec un paquet par ''tile''. Les paquets/''tiles'' sont envoyées au rastériseur un par un, la rastérisation se fait ''tile'' par ''tile''. La ''RAM tile'' existe toujours, même si son utilité est différente. La ''RAM tile'' accélère le rendu d'une ''tile'', car tout ce qui est nécessaire pour rendre une ''tile'' est mémorisé dedans : la ''tile'', le tampon de profondeur, le tampon de stencil et plein d'autres trucs. Pas besoin d’accéder à un gigantesque z-buffer pour toute l'image, juste d'un minuscule z-buffer pour la ''tile'' en cours de traitement, qui tient totalement dans la SRAM. : Il faut noter que les ''tiles'' sont généralement assez petites : 16 ou 32 pixels de côté, rarement plus. En comparaison, les ''tiles'' faisaient 128 pixels de côté pour les cartes de SGI. [[File:Carte graphique en rendu par tiles.png|centre|vignette|upright=2|Carte graphique en rendu par tiles]] Il est possible pour une carte graphique TBR de traiter plusieurs ''tiles'' en même temps, en parallèle, dans des unités séparées. Un exemple est celui du GPU ARM Mali 400, qui dispose d'une unité géométrique (un processeur de ''vertex''), mais 4 processeurs de pixels. Il peut donc traiter quatre ''tiles'' en même temps, chacune étant rendue dans un processeur de pixel dédié. Les 4 processeurs de pixels ont chacun leur propre ''RAM tile'' rien qu'à eux. La présence d'une ''RAM tile'' a de nombreux avantages et impacte grandement l'architecture de la carte graphique. En premier lieu, les ROPs sont drastiquement modifiés. De nombreux GPU TBR n'ont même pas de ROPs ! A la place, les ROPs sont émulés par les processeurs de pixel shader. Les ''pixel shaders'' peuvent lire ou écrire directement dans le ''framebuffer'', sur les GPU TBR, ce qui leur permet d'émuler les ROPs avec des instructions mathématique/mémoire. Le ''driver'' patche automatiquement les ''pixel shader'' pour ajouter de quoi émuler les ROPs à la fin des ''pixel shaders''. Cela garantit une économie de circuits non-négligeable. La présence d'une ''RAM tile'' fait que le tampon de profondeur disparait. Par contre, les cartes graphiques de type TBR doivent enregistrer les triangles en mémoire vidéo, et les trier par paquets. Cela compense partiellement, totalement, ou sur-compense, les économies liées à la ''RAM tile''. Le regroupement des triangles par ''tile'' s'accompagne de quelques optimisations assez sympathiques. Par exemple, les GPU TBR modernes peuvent trier les triangles selon leur profondeur, directement lors du regroupement en paquets. L'avantage est que cela permet à l'élimination des pixels cachés de fonctionner au mieux. L'élimination des pixels cachés fonctionne à la perfection quand les triangles sont triés du plus proche au plus lointain, pour les objets opaques. Les cartes graphiques en mode immédiat ne peuvent pas faire ce tri, mais les cartes graphiques TBR peuvent le faire, soit totalement, soit partiellement. Un autre avantage est que l’antialiasing est plus rapide. Pour ceux qui ne le savent pas, l'antialiasing est une technique qui améliore la qualité d’image, en simulant une résolution supérieure. Une image rendue avec antialiasing aura la même résolution que l'écran, mais n'aura pas certains artefacts liés à une résolution insuffisante. Et l'antialiasing a lieu dans et après la rastérisation, et augmente la résolution du tampon de profondeur et du z-buffer. Les cartes graphiques en mode immédiat disposent d'optimisations pour limiter la casse, mais les ROP font malgré tout beaucoup d'accès mémoire. Avec le rendu en tiles, l'antialising se fait dans la ''RAM tile'', n'a pas besoin de passer par la mémoire vidéo et est donc plus rapide. ===Des compromis différents=== Les cartes graphiques des ordinateurs de bureau ou portables sont toutes en mode immédiat, alors que celles des appareils mobiles, smartphones et autres équipements embarqués ont un rendu en ''tiles''. Les raisons à cela sont multiples, mais la principale est que le rendu en ''tiles'' marche beaucoup mieux pour le rendu en 2D, comparé aux architectures en mode immédiat, ce qui se marie bien aux besoins des smartphones et autres objets connectés. La performance d'une carte graphique est limitée par la quantité d'accès mémoire par seconde. Autant dire que les économiser est primordial. Et les cartes en mode immédiat et par tile ne sont pas égales de ce point de vue. En mode immédiat, le tampon de primitives évite de passer par la mémoire vidéo, mais le z-buffer et le ''framebuffer'' sont très gourmand en accès mémoire. Avec les architectures à tile, c'est l'inverse : la géométrie est enregistrée en mémoire vidéo, mais le tampon de profondeur n'utilise pas la RAM vidéo. Au final, les deux architectures sont optimisées pour deux types de rendus différents. Les cartes à rendu en tile brillent quand la géométrie n'est pas trop compliquée, et que la résolution est grande ou que l'antialising est activé. Les cartes en mode immédiat sont douées pour les scènes géométriquement lourdes, mais avec peu d'accès aux pixels. Le tout est limité par divers caches qui tentent de rendre les accès mémoires moins fréquents, sur les deux types de cartes, mais sans que ce soit une solution miracle. ==La performance des anciennes cartes graphiques 3D== Intuitivement, la performance d'une carte graphique dépend de la performance de chacun de ses circuits : processeur de commande, mémoire vidéo, circuits de rendu 3D, VDC, etc. En pratique, il est rare qu'on soit limité par le VDC ou le processeur de commande. Les seules limitations viennent des circuits de rendu 3D et de la mémoire vidéo. Nous ne pouvons pas aborder la performance de la mémoire vidéo pour le moment. Tout ce que l'on peut dire est qu'il faut qu'elle soit assez rapide pour alimenter le rendu 3D en données. Les circuits de rendu 3D doivent lire des triangles et textures en mémoire vidéo, qui doit être assez rapide pour ça et ne pas les faire attendre. Pour le reste, voyons la performance des circuits de rendu 3D. Il ne nous est là aussi pas possible de détailler ce qui impacte la performance d'un GPU moderne. Dès que des processeurs de shaders sont impliqués, parler de performance demande de connaitre sur le bout des doigts les processeurs de shaders, ce qu'on n'a pas encore vu à ce stade du cours. Par contre, on peut détailler ce qu'il en était pour les anciennes cartes 3D, sans processeurs de shaders. Elles contenaient des ROPs, des unités de texture, un rastériseur et une unité géométrique (l'unité de T&L). Étudions d'abord la performance des unités de texture et des ROPs. Cela nous permettra de parler d'un paramètre qui avait son importance sur les anciennes cartes graphiques, avant les années 2000 : le ''fillrate''. Le '''''fill rate''''', ou taux de remplissage, est une ancienne mesure de performance autrefois utilisée pour comparer les cartes graphiques entre elles. Il s'agit d'une mesure assez approximative, au même titre que la fréquence d'horloge. Concrètement, plus il est élevé, meilleures seront les performances, en théorie. Mais attention : les petites différences de ''fillrate'' ne suffisent pas à rendre un verdict. De plus, il existe deux types distincts de ''fillrate'' : le ''Texture Fillrate'' et le ''Pixel Fillrate''. Voyons d'abord le ''Pixel Fillrate''. ===Le ''pixel fillrate'' : la performance des ROPs=== Le '''''pixel fillrate''''' est le nombre maximal de pixels que la carte graphique peut écrire en mémoire vidéo par seconde. Il est exprimé en ''Méga-Pixels par seconde'' ou en ''Giga-Pixels par seconde'', souvent abréviés en GP/s et MP/s. C'est une unité que vous croisez sans doute pour la première fois et qui mérite quelques explications. Premièrement, dans méga-pixels par seconde, il y a mégapixels. Il s'agit d'une unité pour compter le nombre de pixels d'une image. Un mégapixel signifie tout simplement un million de pixels, un gigapixel signifie un milliard de pixels. Je précise bien un million et un milliard, ce ne sont pas des multiples de 1024, comme on est habitué à en voir en informatique. Le nombre de pixels d'une image augmente avec la résolution utilisée, mais il reste de l'ordre du mégapixel, guère plus. Voici un tableau avec les résolutions les plus utilisées et le nombre de pixels associé. {|class="wikitable" |- ! Résolution !! Nombre de pixels |- | colspan="2" | |- | colspan="2" | Résolutions anciennes en 4:3 |- | 640 × 480 || 307 200 <math>\approx</math> 0,3 MP |- | 800 × 600 || 480 000 = 0,48 MP |- | 1 024 × 768 || 786 432 <math>\approx</math> 0,8 MP |- | 1 280 × 960 || 1 228 800 <math>\approx</math> 1,2 MP |- | 1 600 × 1 200 || 1 920 000 = 1,92 MP |- | colspan="2" | |- | colspan="2" | Résolutions modernes en 16:9 |- | 1 920 × 1 080 || 2 073 600 <math>\approx</math> 2 MP |- | 3 840 × 2 160 (4k) || 8 294 400 <math>\approx</math> 8.3 MP |} Maintenant, regardons ce qui se passe si on veut rendre plusieurs images par secondes. Intuitivement, on se dit qu'il faudra un ''pixel fillrate'' minimal pour cela. Et il se trouve qu'on peut le calculer aisément. Prenons par exemple une image en 1600 × 1200, de 1,92 mégapixels. Si on veut avoir 60 images par secondes, avec cette résolution, cela fait 1,92 * 60 mégapixels par secondes. En clair, le ''pixel fillrate'' minimal se calcule en multipliant la résolution par le ''framerate''. Le ''pixel fillrate'' minimal tourne autour de la centaine de mégapixels par seconde, voire approche le gigapixel par seconde en haute résolution. Les images font entre 1 et 10 mégapixels, pour environ 100 FPS, l'intervalle colle parfaitement. Maintenant, comparons un peu avec ce dont sont capables les GPUs. Les toutes premières cartes graphiques commerciales avaient un ''pixel fillrate'' proche de la centaine de méga-pixels par seconde. Pour donner un exemple, la Geforce 256 avait un ''pixel fillrate'' de 480 MP/s, la Geforce 3 faisait entre 700 et 960 MP/s selon le modèle. De nos jours, le ''pixel fillrate'' est de l'ordre de la centaine de Gigapixels. Pour donner un exemple, les Geforce RTX 5000 ont un ''pixel fillrate'' de 82.3GP/s pour la RTX 5050, à 423.6 GP/S pour la RTX 5090. Les GPU ont un ''pixel fillrate'' qui dépasse de très loin la valeur minimale, ce qui est franchement étrange. La raison à cela est que le ''pixel fillrate'' minimal se calcule sous l'hypothèse que chaque pixel de l'image finale ne sera écrit qu'une seule fois. Mais dans les faits, il est fréquent qu'un pixel soit dessiné plusieurs fois avant d'obtenir l'image finale. La raison principale est liée aux surfaces cachées. Si un objet est derrière un autre, il arrive que celui-ci soit dessiné dans le ''framebuffer'', avant que l'objet devant soit re-dessiné par-dessus. Des pixels ont alors été écrits, puis ré-écrits. Le fait de dessiner un pixel plusieurs fois porte un nom. Il s'agit d'un phénomène d''''''overdraw''''', ou sur-dessinage en français. Le sur-dessinage fait que le ''pixel fillrate'' minimal ne suffit pas en pratique. Pour éviter tout problème, le ''pixel fillrate'' du GPU doit être supérieur au ''pixel fillrate'' minimal, d'environ un ordre de grandeur. L'élimination des surfaces cachées réduit l'''overdraw'', mais elle ne fait pas de miracles. En pratique, le sur-dessinage ne concerne qu'une partie assez mineure des pixels de l'image, et un pixel est rarement écrit plus d'une dizaine de fois. Et les GPus modernes ont un ''pixel fillrate'' tellement démentiel qu'il n'est presque jamais un facteur limitant. Le ''pixel fillrate'' d'un GPU dépend de plusieurs choses : le nombre de ROPs, leur fréquence d'horloge exprimée en MHz/GHz, la bande passante mémoire, et bien d'autres. En théorie, la bande passante mémoire n'est pas un point limitant, les concepteurs du GPU prévoient une mémoire suffisamment rapide pour qu'elle puisse encaisser le ''pixel fillrate'' maximal, tout en ayant encore de la marge pour lire des textures et la géométrie. En clair, le ''pixel fillrate'' est surtout dépendant des ROPs, de leur nombre, de leur vitesse, de leur implémentation. Le ''pixel fillrate'' du GPU est difficile à calculer, mais l'approximation la plus utilisée est la suivante. Elle part du principe qu'un ROP peut écrire un pixel par cycle d'horloge. Ce n'est pas forcément le cas, tout dépend de l'implémentation des ROPs. Certains GPU performants ont des ROPs capables d'écrire des blocs de 8*8 pixels d'un seul coup en mémoire vidéo, alors que d'anciens GPU font avec des ROPs limités, seulement capables d'écrire un pixel tout les 10 cycles d'horloge. Toujours est-il qu'avec cette hypothèse, le ''pixel fillrate'' est égal au nombre de ROPs, multiplié par leur fréquence d'horloge. Je précise "leur" fréquence d'horloge, car il est possible de faire fonctionner l'unité de T&L, les ROPs, les unités de texture et le rastériseur à des fréquences différentes. C'est parfaitement possible, le cout en performance est parfois assez faible, mais le gain en consommation d'énergie est souvent important. Et justement, il a existé des GPU sur lesquels les ROPs avaient une fréquence inférieure à celle du reste du GPU. Dans ce cas, c'est la fréquence des ROPs qui est importante. Mais rassurez-vous : sur la majorité des GPUs actuels, les ROPs vont à la même fréquence que le reste du GPU. ===Le ''texture fillrate'' : la performance des unités de texture=== Le '''''texture fillrate''''' est l'équivalent du ''pixel fillrate'', mais pour les textures. Pour rappel, une texture est avant tout une image, composée de pixels. Pour éviter toute confusion, ces pixels de textures sont appelés ''des texels''. Le ''texture fillrate'' est le nombre de texels que la carte graphique peut plaquer par seconde, dans le meilleur des cas. Il est mesuré en mégatexels par secondes, voire en gigatexels par secondes. L'interprétation de ce chiffre dépend de si on le mesure en entrée ou en sortie des unités de texture. En effet, les unités de texture intègrent des fonctionnalités de filtrage de texture, qui lissent les textures. Ces techniques lisent plusieurs texels et les mélangent pour fournir le texel final, celui envoyé aux unités de ''shader'' ou aux ROPs. La coutume est de le mesurer en sortie des unités de texture. Le nombre en entrée dépend grandement de la bande passante mémoire et du filtrage de texture utilisé, pas celui en sortie. Le ''texture fillrate'' en sortie est le nombre maximal d'opérations de placage de texture par seconde. Là encore, on peut l'estimer en multipliant le nombre d'unités de texture par leur fréquence. Il s'agit évidemment d'une approximation assez peu fiable, car les unités de texture peuvent mettre plusieurs cycles pour plaquer une texture, les filtrer, etc. Le ''texture fillrate'' est bien plus important que le ''pixel fillrate'', surtout pour les GPU modernes. Un point important est que le ''texture fillrate'' a longtemps été égal au ''pixel fillrate''. C'était le cas avant la Geforce 2 de NVIDIA. Les cartes graphiques avaient autant d'unités de texture que de ROP, et les deux fonctionnaient à la même fréquence. Les deux ont commencés à diverger quand le multi-texturing est arrivé, avec la Geforce 2, justement. Le nombre d'unités de texture a doublé comparé aux ROPs, ce qui fait que le ''texture fillrate'' est rapidement devenu le double du ''pixel fillrate''. Sur les GPU modernes, le ''texture fillrate'' est le triple, quadruple, voire octuple du ''pixel fillrate''. ===La performance de l'unité géométrique=== Pour l'unité géométrique, l'équivalent au ''fillrate'' est le '''''polygon throughput'''''. C'est nombre de sommets que l'unité géométrique peut traiter par seconde, exprimé en ''méga-sommets par secondes'', en millions de sommets par seconde. Il dépend de la fréquence et du nombre d'unités géométriques, mais n'est pas exactement le produit des deux. Il varie beaucoup d'une carte graphique à l'autre, mais une approximation souvent utilisée prend le quart du produit fréquence * nombre d'unités géométriques. Il faut noter que cette mesure de performance a survécu à l'arrivée des shaders. Les GPU anciens, avant DirectX 10, avaient des processeurs séparés pour les ''vertex shaders'' et les ''pixel shaders''. Mais les calculs géométriques restaient séparés des autres calculs, ils avaient des unités géométriques dédiées. Quand les processeurs de shaders dit unifiés sont arrivés, la séparation entre géométrie et autres calculs a cédé et cet indicateur a simplement disparu. ===Les autres circuits=== Pour les autres circuits, il n'y a malheureusement pas d'indicateur de performance clair et net comme peut l'être le ''fillrate''. La raison à cela se comprend assez bien quand on regarde comment se calcule le ''fillrate''. C'est juste le produit de la fréquence et d'un nombre d'unités, en l’occurrence des unités de texture ou des ROPs. Le produit signifie que ces unités travaillent en parallèle et qu'elles peuvent chacune traiter un pixel/texel indépendamment des autres. Par contre, sur les anciens GPUs de l'époque, le rastériseur et l'unité géométrique sont un seul et unique circuit. Le nombre d'unité est donc égal à 1, et il ne nous reste plus que la fréquence. {{NavChapitre | book=Les cartes graphiques | prev=Le rendu d'une scène 3D : concepts de base | prevText=Le rendu d'une scène 3D : concepts de base | next=L'évolution vers la programmabilité : les GPUs | nextText=L'évolution vers la programmabilité : les GPUs }} {{autocat}} quybbun06905c5kqsl2p3os9n59jj09 764880 764870 2026-04-24T17:55:36Z Mewtow 31375 /* Les autres circuits */ 764880 wikitext text/x-wiki Dans le chapitre précédent, nous avons vu les bases du rendu 3D. Nous avons parlé de textures, de rastérisation, des calculs d'éclairage, et de bien d'autres choses. Vers la fin du chapitre, nous avons parlé des shaders, des programmes informatiques exécutés sur la carte graphique. Mais ils n'ont pas été toujours présents ! Les anciennes cartes graphiques faisaient sans shaders. Elles étaient autrefois appelées des '''cartes accélératrices 3D''', encore que la terminologie ne soit pas très précise.Nous les opposerons aux cartes graphiques capables d'exécuter des shaders, qui sont couramment appelées des '''Graphic Processing Units''', des GPUs. L'introduction des shaders a grandement modifié l'architecture des cartes graphiques. Il a fallu ajouter des processeurs pour exécuter les shaders, qui n'étaient pas là avant. Par contre, les circuits déjà présents ont été conservés, intégrés aux processeurs de shaders, ou remplacés par ceux-ci. D'un point de vue pédagogique, il est préférable de voir les cartes accélératrices 3D, avant de voir comment elles ont évolués vers des GPUs. Et nous allons voir cela dans deux chapitres. Ce chapitre portera sur les cartes accélératrices 3D, sans shaders, alors que le suivant expliquera comment s'est passée la transition vers les GPUs. : Nous allons nous concentrer sur les cartes graphiques à placage de texture inverse, le placage de texture direct ayant déjà été abordé dans le chapitre précédent. ==L'architecture d'une carte graphique 3D== Une carte accélératrice 3D est un carte d'affichage à laquelle on aurait rajouté des circuits de rendu 3D. Elle incorpore donc tous les circuits présents sur une carte d'affichage : un VDC, une interface avec le bus, une mémoire vidéo, des circuits d’interfaçage avec l'écran, un contrôleur DMA, etc. Le VDC s'occupe de l'affichage et éventuellement du rendu 2D, mais ne s'occupe pas du traitement de la 3D. Du moins, c'est le cas sur les cartes à placage de texture inverse. Le placage de texture direct utilise au contraire un VDC avec accélération 2D très performant, comme nous l'avons vu au chapitre précédent. Mais nous mettons ce cas particulier de côté. La carte accélératrice 3D reçoit des commandes graphiques, qui proviennent du pilote de la carte graphique, exécuté sur le processeur. les commandes en question sont très variées, avec des commandes de rendu 3D, de rendu 2D, de décodage/encodage vidéo, des transferts DMA, et bien d'autres. Mais nous allons nous concentrer sur les commandes de rendu 3D, qui demandent à la carte accélératrice 3D de faire une opération de rendu 3D. Pour cela, elles précisent quel tampon de sommet utiliser, quelles textures utiliser, quels shaders sont nécessaires, etc. La carte accélératrice 3D traite ces commandes grâce à deux circuits : des circuits de rendu 3D, et un chef d'orchestre qui dirige ces circuits de rendu pour qu'ils exécutent la commande demandée. Le chef d'orchestre s'appelle le '''processeur de commandes''', et il sera vu en détail dans quelques chapitres. Pour le moment, nous allons juste dire qu'il s'occupe de la logistique, de la répartition du travail. Pour les commandes de rendu 3D, il commande les différentes étapes du pipeline graphique et s'assure que les étapes s’exécutent dans le bon ordre. [[File:Architecture globale d'une carte 3D.png|centre|vignette|upright=2|Architecture globale d'une carte 3D]] Les circuits de rendu 3D regroupent des circuits hétérogènes, aux fonctions fort différentes. Dans le cas le plus simple, il y a un circuit pour chaque étape du pipeline graphique. De tels circuits sont appelés des '''unités de traitement graphique'''. On trouve ainsi une unité pour le placage de textures, une unité de traitement de la géométrie, une unité de rasterization, une unité d'enregistrement des pixels en mémoire appelée ROP, etc. Les anciennes cartes graphiques fonctionnaient ainsi, mais on verra que les cartes graphiques modernes font un petit peu différemment. Pour simplifier les explications, nous allons séparer la carte graphique en deux gros circuits bien distincts. En réalité, ils sont souvent séparés en sous-circuits plus petits, mais laissons cela de côté pour le moment. * Les '''unités géométriques''' pour les calculs géométriques ; * Les '''pipelines de pixel''' qui rastérisent l'image, plaquent les textures, et autres. Les unités géométriques manipulent des triangles, sommets ou polygones, donc des données géométriques. Les unités de pixel font tout le reste, mais le gros de leur travail est de manipuler des pixels ou des texels. Dans ce chapitre, on considère que les deux sont des circuits fixes, nous verrons leur évolution vers des processeurs programmables dans le prochain chapitre. ===Les circuits de traitement des pixels=== Parlons un peu plus en détail des pipelines de pixels. Pour mieux comprendre ce qu'elles font, il est intéressant de regarder ce qu'il y a dans un pipeline de pixel. Un pipeline de pixel effectue plusieurs opérations les unes à la suite, dans un ordre bien précis. Et cela explique l'usage du terme "pipeline" pour les désigner. Et ces opérations sont souvent réalisées par des circuits séparés, qui sont : * Un '''rastériseur''' qui fait le lien entre triangles et pixels ; * Une '''unité de texture''' qui lit les textures et les plaque sur les modèles 3D ; * Un '''ROP''' (''Raster Operation Pipeline''), qui gère grossièrement le tampon de profondeur (''z-buffer''). Le circuit de '''rastérisation''' prend en charge la rastérisation proprement dite. Pour rappel, la rastérisation projette une scène 3D sur l'écran. Elle fait passer d'une scène 3D à un écran en 2D avec des pixels. Lors de la rastérisation, chaque sommet est associé à un ou plusieurs pixels, à savoir les pixels qu'il occupe à l'écran. Elle fournit aussi diverses informations utiles pour la suite du pipeline graphique : la profondeur du sommet associé au pixel, les coordonnées de textures qui permettent de colorier le pixel. L'étape de '''placage de texture''' lit la texture associée au modèle 3D et identifie le texel adéquat avec les coordonnées textures, pour colorier le pixel. On travaille pixel par pixel, on récupère le texel associé à chaque pixel. Soit l'inverse du placage de texture direct, qui traversait une texture texel par texel, pour recopier le texel dans le pixel adéquat. Après l'étape de placage de textures, la carte graphique enregistre le résultat en mémoire. Lors de cette étape, divers traitements de '''post-traitement''' sont effectués et divers effets peuvent être ajoutés à l'image. Un effet de brouillard peut être ajouté, des tests de profondeur sont effectués pour éliminer certains pixels cachés, l'antialiasing est ajouté, on gère les effets de transparence, etc. Un chapitre entier sera dédié à ces opérations. [[File:Unité post-géométrie d'une carte graphique sans elimination des surfaces cachées.png|centre|vignette|upright=1.5|Unité post-1.5éométrie d'une carte graphique sans elimination des surfaces cachées]] ===Les circuits d'élimination des pixels cachés=== L'élimination des surfaces cachées élimine les triangles invisibles à l'écran, car cachés par un objet opaque. En théorie, elle est prise en charge à la toute fin du pipeline, dans les ROPs, car cela permet de gérer la transparence. En effet, on ne sait pas si une texture transparente sera plaquée sur le triangle ou non. En clair, on doit éliminer les triangles invisibles après le placage de textures, et donc dans les ROP. Les ROPs se chargent à la fois de l’élimination des pixels cachées et de la transparence, les deux s’influençant l'un l'autre. [[File:Unité post-géométrie d'une carte graphique avec elimination des surfaces cachées dans les ROPs.png|centre|vignette|upright=2|Unité post-géométrie d'une carte graphique avec élimination des surfaces cachées dans les ROPs]] Il y a cependant des cas où on sait d'avance que les textures ne sont pas transparentes. Dans ce cas, la carte graphique utilise les circuits d'élimination des pixels cachés juste après la rastérisation. Cela permet d'éliminer à l'avance les triangles dont on sait qu'ils ne seront pas rendus. [[File:Unité post-géométrie d'une carte graphique.png|centre|vignette|upright=2|Unité post-géométrie d'une carte graphique]] Les deux possibilités coexistent sur les cartes graphiques modernes. Une carte graphique moderne peut éliminer les surfaces cachées avant et après la rastérisation, grâce à des techniques d''''''early-z''''' dont nous parlerons plus tard, dans un chapitre dédié sur la rastérisation. ===Les circuits d'éclairage=== Les explications précédentes décrivent une carte graphique qui ne gère pas les techniques d'éclairage, et nous allons remédier à cela immédiatement. L'éclairage a été pris en charge avant même l'arrivée des shaders, dès les années 2000. Par contre, les cartes accélératrices pour PC géraient uniquement l'éclairage par sommet. Elles utilisaient un circuit non-programmable, appelé le '''circuit de ''Transform & Lightning''''', qui effectue les calculs d'éclairage par sommet (le L de T&L), en plus des calculs de transformation (le T de T&L). La première carte graphique à avoir intégré un circuit de T&L était la Geforce 256, la Geforce 1. L'unité de T&L a rapidement été remplacée par les ''vertex shader'', dont nous reparlerons d'ici quelques chapitres. Dès la Geforce 3, ce remplacement été effectué. L'unité de T&L calcule une couleur RGB pour chaque sommet/triangle, appelée la '''couleur de sommet'''. Une fois calculée par l'unité de T&L, la couleur de sommet est envoyée à l'unité de rastérisation. L'unité de rastérisation calcule la couleur des pixels à partir des trois couleurs de sommet. Pour cela, il y a deux méthodes principales, qui correspondent à l'éclairage plat et l'éclairage de Gouraud, qu'on a vu dans le chapitre précédent. Les cartes accélératrices utilisaient généralement l'éclairage de Gouraud. L'éclairage de Gouraud effectue une interpolation, à savoir une sorte de moyenne pondérée de la couleur des trois sommets. L'éclairage de Gouraud demande donc d'ajouter un circuit d'interpolation pour les couleurs des sommets. Il fait normalement partie du circuit de rastérisation, comme on le verra dans le chapitre dédié sur la rastérisation. Pour donner un exemple, la console de jeu Playstation 1 gérait l'éclairage de Gouraud directement en matériel, mais seulement partiellement. Elle n'avait pas de circuit de T&L, ni de ''vertex shaders'', mais intégrait une unité de rastérisation qui interpolait les couleurs de chaque sommet. Enfin, il faut prendre en compte les textures. Pour cela, le pixel texturé est multiplié par la luminosité/couleur calculée par l'unité géométrique. Il y a donc un '''circuit de combinaison''' situé après l'unité de texture qui effectue la combinaison/multiplication. Le circuit de combinaison est parfois configurable, à savoir qu'on peut remplacer la multiplication par une addition ou d'autres opérations. Un tel circuit de combinaison s'appelle alors un '''''combiner''''', dans la vieille nomenclature graphique de l'époque des années 90-2000. [[File:Implémentation de l'éclairage par sommet avec des combiners.png|centre|vignette|upright=2|Implémentation de l'éclairage par sommet avec des combiners]] Il a existé quelques rares cartes graphiques capables de faire de l'éclairage par pixel en matériel. Un exemple de carte graphique capable de faire cela est celle de la Nintendo DS, la PICA200. Créée par une startup japonaise, elle incorporait un circuit de T&L, un éclairage de Phong, du ''cel shading'', des techniques de ''normal-mapping'', de ''Shadow Mapping'', de ''light-mapping'', du ''cubemapping'', de nombreux effets de post-traitement (bloom, effet de flou cinétique, ''motion blur'', rendu HDR, et autres). Pour l'éclairage de Phong, il faut ajouter une unité qui fasse les calculs d'éclairage par pixel, et renvoie son résultat. La couleur de pixel calculée est ensuite combinée avec une texture, avec un ''combiner''. Du moins, si la carte accélératrice supporte les textures... Il faut aussi que le rastériseur interpole les normales, et non des couleurs de sommets comme avec l'éclairage de Gouraud. Les normales sont fournies par l'unité de T&L, ce qui demande une modification assez importante des unités de T&L et du rastériseur. [[File:Implémentation de l'éclairage par pixel avec des combiners.png|centre|vignette|upright=2|Implémentation de l'éclairage par pixel avec des combiners]] Voyons maintenant le ''bump-mapping'' et le ''normal-mapping''. Pour rappel, les deux dernières mémorisent des informations d'éclairage dans une texture en mémoire vidéo. La texture contient des informations de relief pour le ''bump-mapping'', des normales précalculées pour le ''normal-mapping''. Pour cela, l'unité d'éclairage par pixel doit être reliée à l'unité de texture, mais l'implémentation matérielle n'est pas aisée. [[File:Normal mapping matériel.png|centre|vignette|upright=2|Normal mapping matériel]] ==Les cartes graphiques avec plusieurs unités parallèles== Plus haut, nous avons décrit une carte graphique basique, très basique, avec seulement quatre unités. Une unité pour les calculs géométriques, un rastériseur, une unité pour les pixels/textures et un ROP. Cependant, les cartes graphiques ayant cette architecture sont très rares, pour ne pas dire inexistantes. Il n'est pas impossible que les toutes premières cartes graphiques aient suivi à la lettre cette architecture, mais même cela n'est pas sur. La raison : toutes les cartes graphiques dupliquent les circuits précédents pour gagner en performance, mais aussi pour s'adapter aux contraintes du rendu 3D. ===L'amplification des pixels et son impact sur les cartes graphiques=== Un triangle prend une certaine place à l'écran, il recouvre un ou plusieurs pixels lors de l'étape de rastérisation. Le nombre de pixels recouvert dépend fortement du triangle, de sa position, de sa profondeur, etc. Un triangle peut donner quelques pixels lors de l'étape de rastérisation, alors qu'un autre va couvrir 10 fois de pixels, un autre seulement trois fois plus, un autre seulement un pixel, etc. Le cas où un triangle ne recouvre qu'un seul pixel est rare, encore que la tendance commence à changer avec les jeux vidéos récents de la décennie 2020 utilisant l'Unreal Engine et la technologie Nanite. La conséquence est qu'il y a plus de travail à faire sur les pixels que sur les sommets, ce qui a reçu le nom d''''amplification des pixels'''. La conséquence est qu'une unité géométrique prendra un triangle en entrée, l'enverra au rastériseur, qui fournira en sortie un ou plusieurs pixels à éclairer/texturer. Et cette règle un triangle = 1,N pixels fait qu'il y a un déséquilibre entre les calculs géométriques et ce qui suit, que ce soit le placage de textures, l'éclairage par pixel ou l'enregistrement des pixels dans le ''framebuffer''. Et ce déséquilibre a un impact sur la manière dont un conçoit une carte graphique, ancienne comme moderne. S'il y a une seule unité de texture/pixels, alors le rastériseur envoie chaque pixel à texturer/éclairé un par un à l'unité de pixel. Le rastériseur produits ces pixels un par un, avec un algorithme adapté pour. L'unité géométrique attendra le temps que la rastérisation ait fini de traiter tous les pixels du triangle précédent. Elle calculera le prochain triangle pendant ce temps, mais cela ne fera que limiter la casse si beaucoup de pixels sont générés. Mais il est possible de profiter de l'amplification des pixels pour gagner en performances. L'idée est que le rastériseur produit plusieurs pixels en même temps, qui sont envoyés à plusieurs unités de texture et d'éclairage par pixel. Un exemple est illustré ci-dessous, avec une seule unité géométrique, mais quatre unités de texture, quatre unités d'éclairage par pixel, et quatre ROPs. Le rastériseur est conçu pour générer quatre pixels d'un seul coup si nécessaire. [[File:Architecture d'un GPU tenant compte de l'amplification des pixels.png|centre|vignette|upright=2.5|Architecture d'un GPU tenant compte de l'amplification des pixels]] La carte graphique précédente a des performances optimales quand un triangle recouvre 4 pixels : tout est fait en une seule passe. Si un triangle ne recouvre que 1, 2 ou 3 pixels, alors le rastériseur produira 1, 2 ou 3 et certaines unités suivant le rastériseur seront inutilisées. Mais si un triangle recouvre plus de 4 pixels, alors les pixels sont générés, texturés, éclairés et enregistrés en RAM par paquets de 4. En clair, la carte graphique peut s'adapter à l'amplification des pixels, mais pas parfaitement. Les GPU récents ont résolu partiellement ce problème avec un système de ''shaders'' unifiés, mais qu'on ne peut pas expliquer pour le moment. Pour donner un exemple du monde réel, les premières cartes graphique de l'entreprise SGI était de ce type. SGI a été une entreprise pinière dans le domaine du rendu en 3D, qui a opéré dans les années 80-90, avant de progressivement décliner et fermer. Elle a conçu de nombreux systèmes de type ''workstation'', donc destinés aux professionnels, avec des cartes graphiques dédiées. le grand public n'avait pas accès à ce genre de matériel, qui était très cher, vu qu'on n'était qu'au tout début de l'informatique. Nous ne détaillerons pas ces systèmes, car ils géraient leur mémoire vidéo d'une manière assez bizarre : elle était éclatée en plusieurs morceaux fusionnés chacun avec un ROP... Mais ils avaient tous une unité géométrique unique reliée à un rastériseur, qui alimentait plusieurs unités de texture/pixel et ROPs. Plus proche de nous, certaines cartes graphiques pour PC étaient aussi dans ce cas. Les toutes premières cartes graphiques pour PC n'avaient même pas de circuits géométriques, et se contentaient d'un rastériseur, d'unités de texture et de ROPs. Par la suite, la Geforce 256 a introduit une unité géométrique appelée l'unité de T&L. Les cartes graphiques de l'époque ont suivi le mouvement et ont aussi intégrée une unité géométrique presque identique. La Geforce 256 avait une unité géométrique, mais 4 unités de texture, 4 unités d'éclairage par pixel et 4 ROPs. ===Le multitexturing : dupliquer les unités de texture=== Le '''''multi-texturing''''' est une technique très importante pour le rendu 3D moderne. L'idée est de permettre à plusieurs textures de se superposer sur un objet. Divers effets graphiques demandent d'ajouter des textures par-dessus d'autres textures, pour ajouter des détails, du relief, sur une surface pré-existante. Un exemple intéressant vient des jeux de tir : ajouter des impacts de balles sur les murs. Pour cela, on plaque une texture d'impact de balle sur le mur, à la position du tir. Il s'agit là d'un exemple de ''decals'', des petites textures ajoutées sur les murs ou le sol, afin de simuler de la poussière, des impacts de balle, des craquelures, des fissures, des trous, etc. Le ''multi-texturing'' implique que calculer un pixel implique de lire plusieurs textures. En général, un pixel avec ''multi-texturing'' demande de lire deux textures, rarement plus. La carte graphique doit alors être capable d'accéder à deux textures en même temps, ou du moins faire semblant que. De plus, elle doit combiner les deux textures pour générer le pixel voulu, ce qui demande d'ajouter un circuit qui combine deux texels (des pixels de texture) pour donner un pixel. La solution la plus simple est de doubler les unités de texture et de combiner les textures dans l'unité d'éclairage par pixel. Résultat : pour une unité d'éclairage par pixel, on a deux unités de textures. La Geforce 2 et 3 utilisaient cette solution, dont le seul défaut est que la seconde unité de texture était utilisée seulement pour les objets sur lesquels le ''multi-texturing'' était utilisé. Les cartes ATI, le concurrent de l'époque de NVIDIA, aujourd'hui racheté par AMD, triplait les unités de texture. Mais cette possibilité était peu utilisée, la majorité des jeux se dépassant pas deux texture max par pixel. C'est sans doute pour cette raison que ce triplement a été abandonné à la génération suivante, les Radeon 9000 et 8500 se contentant de doubler les unités de texture. {|class="wikitable" |- ! Nom de la carte graphique !! Unités géométriques !! Unité de texture !! Unités de pixel !! ROPs |- ! Geforce 2 d'entrée de gamme | 1 || 2 || 4 || 2 |- ! Geforce 2 milieu/haut de gamme, Geforce 3 | 1 || 4 || 8 || 4 |- ! Radeon R100 bas de gamme | 1 || 1 || 3 || 1 |- ! Radeon R100 autres | 1 || 2 || 6 || 2 |} ===L'usage de plusieurs unités géométriques=== Pour encore augmenter les performances, il est possible d'utiliser plusieurs circuits de calcul géométriques, plusieurs unités géométriques. Et ce peu importe que ces unités soient des processeurs ou des circuits fixes non-programmables. Et pour cela, il existe deux grandes implémentations : utiliser plusieurs processeurs placés en série, ou les mettre en parallèle. Comprendre la première implémentation demande de faire quelques rappels sur les calculs géométriques. ====L'usage d'un pipeline géométrique proprement dit==== Pour rappel, le pipeline géométrique regroupe les quatre étapes suivantes : * L'étape de '''chargement des sommets/triangles''', qui sont lus depuis la mémoire vidéo et injectés dans le pipeline graphique. * L'étape de '''transformation''' effectue deux changements de coordonnées pour chaque sommet. ** Premièrement, elle place les objets au bon endroit dans la scène 3D, ce qui demande de mettre à jour les coordonnées de chaque sommet de chaque modèle. C'est la première étape de calcul : l'''étape de transformation des modèles 3D''. ** Deuxièmement, elle effectue un changement de coordonnées pour centrer l'univers sur la caméra, dans la direction du regard. C'est l'étape de ''transformation de la caméra''. * La phase d''''éclairage''' (en anglais ''lighting'') attribue une couleur à chaque sommet, qui définit son niveau de luminosité : est-ce que le sommet est fortement éclairé ou est-il dans l'ombre ? * La phase d''''assemblage des primitives''' regroupe les sommets en triangles. * Les phases de '''''clipping''''' ou le '''''culling''''' agissent sur des sommets/triangles/primitives, même si elles sont souvent regroupées dans l'étape de rastérisation. Si on met de côté le chargement des sommets/triangles, il est possible de faire tous ces calculs en bloc, dans un seul processeur ou une seule unité de T&L. Mais une autre idée, plus simple, attribue un processeur/circuit pour chaque étape. En faisant cela, on peut traiter plusieurs triangles/sommets en même temps, chacun étant dans une étape différente, chacun dans un processeur/circuit. Ceux qui auront déjà lu un cours d'architecture des ordinateurs reconnaitront la fameuse technique du pipeline, mais appliquée ici à un algorithme plus conséquent. Les processeurs sont en série, et chaque processeur reçoit les résultats du processeur précédent, et envoie son résultat au processeur suivant. Sauf en début ou en bout de chaine, évidemment. Pour donner un exemple, les premières cartes graphiques de SGI utilisaient 10/12 processeurs enchainés l'un à la suite de l'autre. Les 4 premiers géraient les étapes de transformation, les 6 suivants faisaient les opérations de clipping/culling, les deux derniers faisaient la rastérisation proprement dite. Pour lisser les transferts de données, il est possible d'ajouter des mémoires FIFOs entre les processeurs. Comme ça, si un processeur est bloqué par un calcul un peu trop long, cela ne bloque pas les processeurs précédents. A la place, le processeur précédent accumule des résultats dans la mémoire FIFOs, qui seront consommé ultérieurement. En théorie, on peut s'attendre à ce que la performance soit multipliée par le nombre de processeurs. En réalité, les étapes sont rarement équilibrées, certaines étapes prennent beaucoup plus de temps que les autres, ce qui fait que la répartition des calculs n'est pas idéale : certains processeurs attendent que le processeur suivant ait finit son travail. De plus, l'organisation en pipeline entraine des couts de transmission/communication entre étapes, notamment si on utilise des mémoires FIFOs entre processeurs, ce qui est toujours le cas. Cette implémentation n'a été utilisée que sur les toutes premières cartes graphiques, avant l'apparition des PC grand public. Les systèmes SGI, utilisés pour des stations de travail, utilisaient cette architecture, par exemple. Mais elle est totalement abandonnée depuis les années 90. ====L'usage de plusieurs unités géométriques en parallèle==== La seconde solution utilise plusieurs unités géométriques en parallèle. Chaque unité géométrique traite un triangle/sommet de bout en bout, en faisant transformation, éclairage, etc. Mais vu qu'il y en a plusieurs, on peut traiter plusieurs triangles/sommets : un dans chaque unité géométrique. C'est la solution retenue sur toutes les cartes graphiques depuis les années 90. Mais la présence de plusieurs unités géométriques a deux conséquences : il faut alimenter plusieurs unités géométriques en triangles/sommets, il faut gérer l'envoi des triangles au rastériseur. Les deux demandent des solutions distinctes. La répartition du travail sur les unités géométriques est déléguée au processeur de commandes. Il utilise les unités géométriques à tour de rôle : on envoie le premier triangle à la première unité, le second triangle à la seconde unité, le troisième triangle à la troisième, etc. Il s'agit de ce que l'on appelle l''''algorithme du tourniquet''', qui est assez efficace malgré sa simplicité. Il marche assez bien quand tous les triangles/sommets mettent approximativement le même temps pour être traités. Si le temps de calcul varie beaucoup d'un triangle/sommet à l'autre, une solution toute simple détecte quels sont les processeurs de shaders libres et ceux occupés. Il suffit alors d'appliquer l'algorithme du tourniquet seulement sur les processeurs de shaders libres, qui n'ont rien à faire. Un autre problème survient cette fois-ci en sortie des unités géométriques. Comment connecter plusieurs unités géométriques au reste de la carte graphique ? Évidemment, la carte graphique contient plusieurs unités de texture/pixel et plusieurs ROPs. Elle tient compte de l'amplification des pixels, ce qui fait qu'il y a moins d'unités géométriques que d'autres circuits, entre 2 à 8 fois moins environ. Pour créer une carte graphique avec plusieurs unités géométriques, il y a plusieurs solutions, que nous allons détailler dans ce qui suit. Pour les explications, nous allons prendre l'exemple de cartes graphiques avec 2 unités géométriques et 8 unités de texture/pixel, et autant de ROPs. La première solution serait simplement de dupliquer les circuits précédents, en gardant leurs interconnexions. Pour l'exemple, on aurait 2 unités géométriques, chacune connectée à 4 unités de textures/pixels. L'unité géométrique est suivie par un rastériseur qui alimente 4 unités de texture/pixel, comme c'était le cas dans la section précédente. L'implémentation est alors très simple : on a juste à dupliquer les circuits et à modifier le processeur de commande. Il faut aussi modifier les connexions des ROPs à la mémoire vidéo. Mais les interconnexions avec le rastériseur ne sont pas modifiées. Un désavantage est que l'amplification des pixels n'est pas gérée au mieux. Imaginez que l'on ait deux triangles à rastériser, qui génèrent 8 pixels en tout : un qui génère 6 pixels à la rastérisation, l'autre seulement 2. Il n'est pas possible de traiter les 8 pixels générés. Le triangle générant deux pixels va alimenter deux unités de texture/pixels et en laisser deux inutilisées, l'autre triangle sera traité en deux fois (4 pixels, puis 2). La duplication bête et méchante n'utilise donc pas à la perfection les unités de texture/pixel. Une autre solution permet de gérer à la perfection l'amplification des pixels. Elle consiste à utiliser un seul rastériseur à haute performance, sur lequel on connecte les unités géométriques et les unités de texture/pixel. L'idée est que le rastériseur peut recevoir N triangles à la fois et alimenter M unités de texture/pixels. Le rastériseur unique s'occupe de faire plusieurs rastérisations de triangles à la fois, et répartit automatiquement les pixels générés sur les unités de texture/pixel. Pour donner un exemple, le GPU Geforce 6800 de NVIDIA avait 6 unités géométriques, 16 unités faisant à la fois placage de textures et éclairage par pixel, et 16 ROPs. Un point important avec ce GPU est qu'il n'avait qu'un seul rastériseur, détail sur lequel on reviendra dans ce qui suit ! <noinclude>[[File:GeForce 6800.png|centre|vignette|upright=2.5|GeForce 6800, les unités géométriques sont ici appelées les ''vertex processor'', les unités de texture/pixel sont les ''fragment processors'', les ROPs sont les ''pixel blending units''.]]</noinclude> ==Les cartes graphiques en mode immédiat et à tuile== Il est courant de dire qu'il existe deux types de cartes graphiques : celles en mode immédiat, et celles avec un rendu en tuiles (''tiles''). Il s'agit là des deux types principaux de cartes graphiques à l'heure actuelle, mais quelques architectures faisaient autrement dans le passé. Une autre classification, plus générale, sépare les cartes graphiques en cartes graphiques ''sort-last'', ''sort-first'' et ''sort-middle''. Les cartes graphiques en mode immédiat correspondent aux cartes graphiques en mode immédiat, alors que le rendu à tuile est une sous-catégorie des cartes graphiques ''sort-middle''. La différence entre les deux est liée à la manière dont les pixels/primitives sont réparties sur l'écran. Leur existence est liée au fait que les API graphiques imposent que les triangles envoyées à la carte graphique soient traités dans l'ordre. Le tampon de sommets contient en effet une liste de sommets/triangles, qui sont censés être traités dans l'ordre d'arrivée. Et si je dis censé être, c'est parce que la carte graphique ne va pas forcément traiter les triangles/pixels dans l'ordre. A la place, elle va traiter des triangles/pixels en parallèle, et il n'est pas garantit que les résultats sortent des circuits dans l'ordre d'arrivée. Après tout, certains triangles sont traités plus rapidement que d'autres, idem pour les pixels. La carte graphique doit donc remettre les résultats dans l'ordre. L'endroit du pipeline où se fait cette remise en ordre est ce qui fait la différence entre cartes graphioques ''sort last'' et ''sort middle''. ===Les trois types de cartes graphiques : ''sort-first'', ''sort-middle'' et ''sort-last''=== Les cartes graphiques ''sort-first'' ont plusieurs pipelines séparés, chacun traitant une partie de l'écran. Ils déterminent la position des triangles à l'écran, puis répartissent les triangles dans les pipelines adéquats. Par exemple, on peut imaginer un GPU ''sort-first'' avec quatre unités séparées, chacune traitant un quart de l'écran. Au tout début du rendu, une unité de répartition détermine la position d'un triangle à l'écran, et l'envoie à l'unité adéquate. Si le triangle est dans le coin inférieur gauche, il sera envoyé à l'unité dédiée à ce coin. S'il est situé au milieu de l'écran, il sera envoyé aux quatre unités, chacune ne traitant les pixels que pour son coin à elle. Les cartes graphiques ''sort-middle'' découpent l'écran en carrés de 4, 8, 16, 32 pixels de côté , qui sont rendus séparément les uns des autres. Les morceaux d'image en question sont appelés des ''tiles'' en anglais, mot que nous avons décidé de ne pas traduire pour ne pas le confondre avec les tuiles du rendu 2D. Il y a une assignation stricte entre une unité de pixel/texture et une ''tile''. Par exemple, sur un système avec deux unités de texture/pixel, la première unité traitera les ''tiles'' paires, l'autre unité les ''tiles'' impaires. Les cartes graphiques ''sort-last'' sont l'extrême inverse. Ils ont des unités banalisées qui se moquent de l'endroit où se trouve un pixel à l'écran. Leurs unités géométriques traitent des polygones sans se préoccuper de leur place à l'écran. Le rastériseur envoie les pixels aux unités de textures/ROPs sans se soucier de leur place à l'écran. Encore que quelques optimisations s'en mêlent pour profiter au mieux des caches de texture et des caches intégrés aux ROPs, mais l'essentiel est qu'il n'y a pas de répartition fixe. Il n'y a pas de logique du type : ce pixel ou ce triangle est à tel endroit à l'écran, on l'envoie vers telle unité de texture/ROP. Ce sont les ROPs qui se chargent d'enregistrer les pixles finaux au bon endroit dans le ''framebuffer''. La gestion de la place des pixels à l'écran se fait donc à la toute fin du pipeline, d'où le nom de ''sort-last''. Pour résumer, les trois types de cartes graphiques se distinguent suivant l'endroit où les triangles/pixels sont répartis suivant leur place à l'écran. Avec le ''sort-first'', ce sont les triangles qui sont triés suivant leur place à l'écran. Le tri a donc lieu avant les unités géométriques. Avec le ''sort-middle'', ce sont les fragments générés par la rastérisation qui sont triés suivant leur place à l'écran, d'où l'existence de ''tiles''. Le tri a lieu entre les unités géométriques et le rastériseur. Les unités géométriques se moquent de la place à l'écran des primitives qu'ils traitent, mais pas les rastériseurs et les unités de texture. Enfin, avec le ''sort-last'', ce sont les pixels finaux qui sont triés selon leur place à l'écran, seuls les ROPs se préoccupent de cette place à l'écran. Concrètement, les cartes graphiques de type ''sort-first'' sont très rares, l'auteur de ce cours n'en connait aucun exemple. Les deux autres types de cartes graphiques sont eux beaucoup plus communs. Reste à voir ce qu'il y a à l'intérieur d'une carte graphique ''sort-middle'' et/ou ''sort-last''. Pour simplifier les explications, nous allons regrouper les circuits de traitement des pixels dans un seul gros circuits appelé le rastériseur, par abus de langage. La carte graphique est donc composée de deux circuits : l'unité géométrique et le mal-nommé rastériseur. Les cartes graphiques ajoutent des mémoires caches pour la géométrie et les textures, afin de rendre leur accès plus rapide. [[File:Carte graphique, généralités.png|centre|vignette|upright=2|Carte graphique, généralités]] ===Les cartes graphiques ''sort-last'', en mode immédiat=== Les cartes graphiques en mode immédiat implémentent le pipeline graphique d'une manière assez évidente. L'unité géométrique envoie des triangles au rastériseur, qui lui-même envoie les pixels à l'unité de texture, qui elle-même envoie le pixel texturé au ROP. Elles effectuent le rendu 3D triangle par tringle, pixel par pixel. Un point important est que pendant que le pixel N est dans les ROP, les pixels N+1 est dans l'unité de texture, le pixel N+2 est dans le rastériseur et le triangle suivant est dans l'unité géométrique. En clair, on n'attend pas qu'un triangle soit affiché pour en démarrer un autre. Un problème est qu'un triangle dans une scène 3D correspond souvent à plusieurs pixels, ce qui fait que la rastérisation prend plus de temps de calcul que la géométrie. En conséquence, il arrive fréquemment que le rastériseur soit occupé, alors que l'unité de géométrie veut lui envoyer des données. Pour éviter tout problème, on insère une petite mémoire entre l'unité géométrique et le rastériseur, qui porte le nom de '''tampon de primitives'''. Elle permet d'accumuler les sommets calculés quand le rastériseur est occupé. [[File:Carte graphique en rendu immédiat.png|centre|vignette|upright=2|Carte graphique en rendu immédiat]] Le tout peut s'adapter à la présence de plusieurs unités géométriques, de plusieurs unités de texture ou processeurs de shaders, tant qu'on conserve un rastériseur unique. Il suffit alors d'adapter le tampon de primitive et le rastériseur. Si on veut rajouter des unités de texture ou des processeurs de pixel shaders, le tampon de primitives n'est pas concerné : il suffit que le rastériseur ait plusieurs sorties, une par unité de texture/pixel shader. Par contre, la présence de plusieurs unités géométriques impacte le tampon de primitive. Avec plusieurs unités géométriques, il y a deux solutions : soit on garde un tampon de primitive unique partagé, soit il y a un tampon de primitive par unité géométrique. Avec la première solution, toutes les unités géométriques sont reliées à un tampon de primitives unique. Le tampon de primitive est conçu pour qu'on puisse écrire plusieurs primitives dedans en même temps. Le rastériseur n'a pas à être modifié. Une autre solution utilise un tampon de primitive par unité géométrique. Le rastériseur peut alors piocher dans plusieurs tampons de primitive, ce qui demande de modifier le rastériseur. Il y a alors un système d'arbitrage, pour que le rastériseur pioche des primitives équitablement dans tous les tampons de primitive, pas question que l'un d'entre eux soit ignoré durant trop longtemps. ===Les cartes graphiques ''sort-middle'' des années 90=== Voyons maintenant les architectures ''sort-middle'' utilisée dans les années 80-90, à une époque où les cartes graphiques grand public n'existaient pas encore. Les cartes graphiques de l’entreprise SGI sont dans ce cas, mais aussi le Pixel Planes 5, et de nombreux autres systèmes graphiques. Elles utilisaient un rendu à ''tile'' assez original. Dans ce qui suit, nous allons décrire l'architecture des systèmes SGI, qui sont représentatifs. L'idée était que l'image était découpée en un nombre de ''tiles'' qui variait selon le système utilisé, mais qui était au minimum de 5 et pouvait aller jusqu'à 20. Et chaque ''tile'' avait sa propre unité de traitement, qui contenait un rastériseur, une unité de texture, un ROP, etc. En clair, la carte graphique contenait entre 5 et 20 unités de traitement séparées, chacune dédiée à une ''tile''. Les triangles sortant des unités géométriques étaient envoyés à toutes les unités de traitement, sans exception. Une fois le triangle réceptionné, l'unité de traitement déterminait si le triangle s'affichait dans la ''tile'' associée ou non. Si c'est le cas, le rastériseur rastérise le triangle, génère les pixels, les textures sont lues, puis le tout est enregistré en mémoire vidéo. Si ce n'est pas le cas, elle abandonne le polygone/triangle reçu. Si le triangle est partiellement dans la ''tile'', le rastériseur génère les pixels qui sont dans la ''tile'', par les autres. Précisons que les cartes de ce style incorporaient un tampon de primitive, ce qui permettait de simplifier la conception de la carte graphique. Sur la carte ''Infinite Reality'', le tampon de primitive faisait 4 méga-octets de RAM, ce qui permettait de mémoriser 65 536 sommets. Sur la carte ''Reality Engine'', il y avait même plusieurs tampons de primitives, un par unité géométrique. Les polygones sortaient des unités géométriques, étaient accumulés dans les tampons de primitives, puis étaient ''broadcastés'' à toutes les unités de traitement. Pour cela, le bus en bleu dans le schéma précédent est en réalité un réseau ''crossbar'' avec un système de ''broadcast''. Une caractéristique de ces architectures est qu'elles mettent le ''framebuffer'' à part de la mémoire vidéo. De plus, ce ''framebuffer'' est lui-même découpée en ''tile''. Sur la carte ''Reality Engine'', le ''framebuffer'' est découpé en 5 à 20 sous-''framebuffer'', un par ''tile''. Et chaque mini-''framebuffer'' est placé dans l'unité de traitement de la ''tile'' associée ! Ainsi, au lieu de connecter 5-20 ROPs à une mémoire vidéo unique, chaque ROP contient une '''''RAM tile''''', qui mémorise la ''tile'' en cours de traitement. Évidemment, cela pose quelques problèmes pour la connexion au VDC, en raison de l'absence de ''framebuffer'' unique, mais rien d'insurmontable. L'architecture est illustrée ci-dessous. : Le Pixel Planes 5 avait un système similaire, mais avait en plus un ''framebuffer'' complet, dans lequel les sous-''framebuffer'' étaient recopiés pour obtenir l'image finale. [[File:Architecture des premières cartes graphiques SGI.png|centre|vignette|upright=2|Architecture des premières cartes graphiques SGI]] Un autre détail de l'architecture est lié à la mémoire pour les textures. Les concepteurs de SGI ont décidé de séparer les textures dans une mémoire à part du reste de la mémoire vidéo. Il n'y a pour ainsi dire pas de mémoire vidéo proprement dit : la géométrie à rendre est dans une mémoire à part, idem pour les textures, et pour le ''framebuffer''. On s'attendrait à ce que la mémoire de texture soit reliée aux 5-20 unités de texture, mais les concepteurs ont décidé de faire autrement. A la place, chaque unité de texture contient une copie de la mémoire de texture, qui est donc dupliquée en 5-20 exemplaires ! Difficile de comprendre la raison de ce choix, mais cela simplifiait sans doute les interconnexions internes de la carte graphique, au prix d'un cout en RAM assez important. ===Les cartes graphiques à rendu à ''tile''=== Les cartes graphiques de SGI, vus précédemment, disposent d'une unité de traitement par ''tile''. Faire ainsi permet de nombreuses optimisations, comme éclater le ''framebuffer'' en plusieurs ''RAM tile''. Mais le cout en matériel est conséquent. Pour économiser des circuits, l'idéal serait d'utiliser moins d'unités de traitement pour les pixels/fragments/textures. Mais pour cela, il faut profondément modifier l'architecture précédente. On perd forcément le lien entre une unité de traitement et une ''tile''. Et cela impose de revoir totalement la manière dont les unités géométriques communiquent avec les unités de traitement. La solution retenue est celle des cartes graphiques à rendu en ''tile'' proprement dit, aussi appelés ''cartes graphiques TBR'' (''Tile Based Rendering''). Les plus simples n'utilisent qu'une seule unité de traitement et n'ont qu'une seule ''RAM tile''. En conséquence, les ''tiles'' sont rendues l'une après l'autre. Au lieu de rendre chaque triangle/polygone l'un après l'autre, la géométrie est intégralement rendue avant de faire la rastérisation. Les triangles sont enregistrés dans la mémoire vidéo et regroupés par ''tile'', avant la rastérisation. La mémoire vidéo contient donc plusieurs paquets de triangles, avec un paquet par ''tile''. Les paquets/''tiles'' sont envoyées au rastériseur un par un, la rastérisation se fait ''tile'' par ''tile''. La ''RAM tile'' existe toujours, même si son utilité est différente. La ''RAM tile'' accélère le rendu d'une ''tile'', car tout ce qui est nécessaire pour rendre une ''tile'' est mémorisé dedans : la ''tile'', le tampon de profondeur, le tampon de stencil et plein d'autres trucs. Pas besoin d’accéder à un gigantesque z-buffer pour toute l'image, juste d'un minuscule z-buffer pour la ''tile'' en cours de traitement, qui tient totalement dans la SRAM. : Il faut noter que les ''tiles'' sont généralement assez petites : 16 ou 32 pixels de côté, rarement plus. En comparaison, les ''tiles'' faisaient 128 pixels de côté pour les cartes de SGI. [[File:Carte graphique en rendu par tiles.png|centre|vignette|upright=2|Carte graphique en rendu par tiles]] Il est possible pour une carte graphique TBR de traiter plusieurs ''tiles'' en même temps, en parallèle, dans des unités séparées. Un exemple est celui du GPU ARM Mali 400, qui dispose d'une unité géométrique (un processeur de ''vertex''), mais 4 processeurs de pixels. Il peut donc traiter quatre ''tiles'' en même temps, chacune étant rendue dans un processeur de pixel dédié. Les 4 processeurs de pixels ont chacun leur propre ''RAM tile'' rien qu'à eux. La présence d'une ''RAM tile'' a de nombreux avantages et impacte grandement l'architecture de la carte graphique. En premier lieu, les ROPs sont drastiquement modifiés. De nombreux GPU TBR n'ont même pas de ROPs ! A la place, les ROPs sont émulés par les processeurs de pixel shader. Les ''pixel shaders'' peuvent lire ou écrire directement dans le ''framebuffer'', sur les GPU TBR, ce qui leur permet d'émuler les ROPs avec des instructions mathématique/mémoire. Le ''driver'' patche automatiquement les ''pixel shader'' pour ajouter de quoi émuler les ROPs à la fin des ''pixel shaders''. Cela garantit une économie de circuits non-négligeable. La présence d'une ''RAM tile'' fait que le tampon de profondeur disparait. Par contre, les cartes graphiques de type TBR doivent enregistrer les triangles en mémoire vidéo, et les trier par paquets. Cela compense partiellement, totalement, ou sur-compense, les économies liées à la ''RAM tile''. Le regroupement des triangles par ''tile'' s'accompagne de quelques optimisations assez sympathiques. Par exemple, les GPU TBR modernes peuvent trier les triangles selon leur profondeur, directement lors du regroupement en paquets. L'avantage est que cela permet à l'élimination des pixels cachés de fonctionner au mieux. L'élimination des pixels cachés fonctionne à la perfection quand les triangles sont triés du plus proche au plus lointain, pour les objets opaques. Les cartes graphiques en mode immédiat ne peuvent pas faire ce tri, mais les cartes graphiques TBR peuvent le faire, soit totalement, soit partiellement. Un autre avantage est que l’antialiasing est plus rapide. Pour ceux qui ne le savent pas, l'antialiasing est une technique qui améliore la qualité d’image, en simulant une résolution supérieure. Une image rendue avec antialiasing aura la même résolution que l'écran, mais n'aura pas certains artefacts liés à une résolution insuffisante. Et l'antialiasing a lieu dans et après la rastérisation, et augmente la résolution du tampon de profondeur et du z-buffer. Les cartes graphiques en mode immédiat disposent d'optimisations pour limiter la casse, mais les ROP font malgré tout beaucoup d'accès mémoire. Avec le rendu en tiles, l'antialising se fait dans la ''RAM tile'', n'a pas besoin de passer par la mémoire vidéo et est donc plus rapide. ===Des compromis différents=== Les cartes graphiques des ordinateurs de bureau ou portables sont toutes en mode immédiat, alors que celles des appareils mobiles, smartphones et autres équipements embarqués ont un rendu en ''tiles''. Les raisons à cela sont multiples, mais la principale est que le rendu en ''tiles'' marche beaucoup mieux pour le rendu en 2D, comparé aux architectures en mode immédiat, ce qui se marie bien aux besoins des smartphones et autres objets connectés. La performance d'une carte graphique est limitée par la quantité d'accès mémoire par seconde. Autant dire que les économiser est primordial. Et les cartes en mode immédiat et par tile ne sont pas égales de ce point de vue. En mode immédiat, le tampon de primitives évite de passer par la mémoire vidéo, mais le z-buffer et le ''framebuffer'' sont très gourmand en accès mémoire. Avec les architectures à tile, c'est l'inverse : la géométrie est enregistrée en mémoire vidéo, mais le tampon de profondeur n'utilise pas la RAM vidéo. Au final, les deux architectures sont optimisées pour deux types de rendus différents. Les cartes à rendu en tile brillent quand la géométrie n'est pas trop compliquée, et que la résolution est grande ou que l'antialising est activé. Les cartes en mode immédiat sont douées pour les scènes géométriquement lourdes, mais avec peu d'accès aux pixels. Le tout est limité par divers caches qui tentent de rendre les accès mémoires moins fréquents, sur les deux types de cartes, mais sans que ce soit une solution miracle. ==La performance des anciennes cartes graphiques 3D== Intuitivement, la performance d'une carte graphique dépend de la performance de chacun de ses circuits : processeur de commande, mémoire vidéo, circuits de rendu 3D, VDC, etc. En pratique, il est rare qu'on soit limité par le VDC ou le processeur de commande. Les seules limitations viennent des circuits de rendu 3D et de la mémoire vidéo. Nous ne pouvons pas aborder la performance de la mémoire vidéo pour le moment. Tout ce que l'on peut dire est qu'il faut qu'elle soit assez rapide pour alimenter le rendu 3D en données. Les circuits de rendu 3D doivent lire des triangles et textures en mémoire vidéo, qui doit être assez rapide pour ça et ne pas les faire attendre. Pour le reste, voyons la performance des circuits de rendu 3D. Il ne nous est là aussi pas possible de détailler ce qui impacte la performance d'un GPU moderne. Dès que des processeurs de shaders sont impliqués, parler de performance demande de connaitre sur le bout des doigts les processeurs de shaders, ce qu'on n'a pas encore vu à ce stade du cours. Par contre, on peut détailler ce qu'il en était pour les anciennes cartes 3D, sans processeurs de shaders. Elles contenaient des ROPs, des unités de texture, un rastériseur et une unité géométrique (l'unité de T&L). Étudions d'abord la performance des unités de texture et des ROPs. Cela nous permettra de parler d'un paramètre qui avait son importance sur les anciennes cartes graphiques, avant les années 2000 : le ''fillrate''. Le '''''fill rate''''', ou taux de remplissage, est une ancienne mesure de performance autrefois utilisée pour comparer les cartes graphiques entre elles. Il s'agit d'une mesure assez approximative, au même titre que la fréquence d'horloge. Concrètement, plus il est élevé, meilleures seront les performances, en théorie. Mais attention : les petites différences de ''fillrate'' ne suffisent pas à rendre un verdict. De plus, il existe deux types distincts de ''fillrate'' : le ''Texture Fillrate'' et le ''Pixel Fillrate''. Voyons d'abord le ''Pixel Fillrate''. ===Le ''pixel fillrate'' : la performance des ROPs=== Le '''''pixel fillrate''''' est le nombre maximal de pixels que la carte graphique peut écrire en mémoire vidéo par seconde. Il est exprimé en ''Méga-Pixels par seconde'' ou en ''Giga-Pixels par seconde'', souvent abréviés en GP/s et MP/s. C'est une unité que vous croisez sans doute pour la première fois et qui mérite quelques explications. Premièrement, dans méga-pixels par seconde, il y a mégapixels. Il s'agit d'une unité pour compter le nombre de pixels d'une image. Un mégapixel signifie tout simplement un million de pixels, un gigapixel signifie un milliard de pixels. Je précise bien un million et un milliard, ce ne sont pas des multiples de 1024, comme on est habitué à en voir en informatique. Le nombre de pixels d'une image augmente avec la résolution utilisée, mais il reste de l'ordre du mégapixel, guère plus. Voici un tableau avec les résolutions les plus utilisées et le nombre de pixels associé. {|class="wikitable" |- ! Résolution !! Nombre de pixels |- | colspan="2" | |- | colspan="2" | Résolutions anciennes en 4:3 |- | 640 × 480 || 307 200 <math>\approx</math> 0,3 MP |- | 800 × 600 || 480 000 = 0,48 MP |- | 1 024 × 768 || 786 432 <math>\approx</math> 0,8 MP |- | 1 280 × 960 || 1 228 800 <math>\approx</math> 1,2 MP |- | 1 600 × 1 200 || 1 920 000 = 1,92 MP |- | colspan="2" | |- | colspan="2" | Résolutions modernes en 16:9 |- | 1 920 × 1 080 || 2 073 600 <math>\approx</math> 2 MP |- | 3 840 × 2 160 (4k) || 8 294 400 <math>\approx</math> 8.3 MP |} Maintenant, regardons ce qui se passe si on veut rendre plusieurs images par secondes. Intuitivement, on se dit qu'il faudra un ''pixel fillrate'' minimal pour cela. Et il se trouve qu'on peut le calculer aisément. Prenons par exemple une image en 1600 × 1200, de 1,92 mégapixels. Si on veut avoir 60 images par secondes, avec cette résolution, cela fait 1,92 * 60 mégapixels par secondes. En clair, le ''pixel fillrate'' minimal se calcule en multipliant la résolution par le ''framerate''. Le ''pixel fillrate'' minimal tourne autour de la centaine de mégapixels par seconde, voire approche le gigapixel par seconde en haute résolution. Les images font entre 1 et 10 mégapixels, pour environ 100 FPS, l'intervalle colle parfaitement. Maintenant, comparons un peu avec ce dont sont capables les GPUs. Les toutes premières cartes graphiques commerciales avaient un ''pixel fillrate'' proche de la centaine de méga-pixels par seconde. Pour donner un exemple, la Geforce 256 avait un ''pixel fillrate'' de 480 MP/s, la Geforce 3 faisait entre 700 et 960 MP/s selon le modèle. De nos jours, le ''pixel fillrate'' est de l'ordre de la centaine de Gigapixels. Pour donner un exemple, les Geforce RTX 5000 ont un ''pixel fillrate'' de 82.3GP/s pour la RTX 5050, à 423.6 GP/S pour la RTX 5090. Les GPU ont un ''pixel fillrate'' qui dépasse de très loin la valeur minimale, ce qui est franchement étrange. La raison à cela est que le ''pixel fillrate'' minimal se calcule sous l'hypothèse que chaque pixel de l'image finale ne sera écrit qu'une seule fois. Mais dans les faits, il est fréquent qu'un pixel soit dessiné plusieurs fois avant d'obtenir l'image finale. La raison principale est liée aux surfaces cachées. Si un objet est derrière un autre, il arrive que celui-ci soit dessiné dans le ''framebuffer'', avant que l'objet devant soit re-dessiné par-dessus. Des pixels ont alors été écrits, puis ré-écrits. Le fait de dessiner un pixel plusieurs fois porte un nom. Il s'agit d'un phénomène d''''''overdraw''''', ou sur-dessinage en français. Le sur-dessinage fait que le ''pixel fillrate'' minimal ne suffit pas en pratique. Pour éviter tout problème, le ''pixel fillrate'' du GPU doit être supérieur au ''pixel fillrate'' minimal, d'environ un ordre de grandeur. L'élimination des surfaces cachées réduit l'''overdraw'', mais elle ne fait pas de miracles. En pratique, le sur-dessinage ne concerne qu'une partie assez mineure des pixels de l'image, et un pixel est rarement écrit plus d'une dizaine de fois. Et les GPus modernes ont un ''pixel fillrate'' tellement démentiel qu'il n'est presque jamais un facteur limitant. Le ''pixel fillrate'' d'un GPU dépend de plusieurs choses : le nombre de ROPs, leur fréquence d'horloge exprimée en MHz/GHz, la bande passante mémoire, et bien d'autres. En théorie, la bande passante mémoire n'est pas un point limitant, les concepteurs du GPU prévoient une mémoire suffisamment rapide pour qu'elle puisse encaisser le ''pixel fillrate'' maximal, tout en ayant encore de la marge pour lire des textures et la géométrie. En clair, le ''pixel fillrate'' est surtout dépendant des ROPs, de leur nombre, de leur vitesse, de leur implémentation. Le ''pixel fillrate'' du GPU est difficile à calculer, mais l'approximation la plus utilisée est la suivante. Elle part du principe qu'un ROP peut écrire un pixel par cycle d'horloge. Ce n'est pas forcément le cas, tout dépend de l'implémentation des ROPs. Certains GPU performants ont des ROPs capables d'écrire des blocs de 8*8 pixels d'un seul coup en mémoire vidéo, alors que d'anciens GPU font avec des ROPs limités, seulement capables d'écrire un pixel tout les 10 cycles d'horloge. Toujours est-il qu'avec cette hypothèse, le ''pixel fillrate'' est égal au nombre de ROPs, multiplié par leur fréquence d'horloge. Je précise "leur" fréquence d'horloge, car il est possible de faire fonctionner l'unité de T&L, les ROPs, les unités de texture et le rastériseur à des fréquences différentes. C'est parfaitement possible, le cout en performance est parfois assez faible, mais le gain en consommation d'énergie est souvent important. Et justement, il a existé des GPU sur lesquels les ROPs avaient une fréquence inférieure à celle du reste du GPU. Dans ce cas, c'est la fréquence des ROPs qui est importante. Mais rassurez-vous : sur la majorité des GPUs actuels, les ROPs vont à la même fréquence que le reste du GPU. ===Le ''texture fillrate'' : la performance des unités de texture=== Le '''''texture fillrate''''' est l'équivalent du ''pixel fillrate'', mais pour les textures. Pour rappel, une texture est avant tout une image, composée de pixels. Pour éviter toute confusion, ces pixels de textures sont appelés ''des texels''. Le ''texture fillrate'' est le nombre de texels que la carte graphique peut plaquer par seconde, dans le meilleur des cas. Il est mesuré en mégatexels par secondes, voire en gigatexels par secondes. L'interprétation de ce chiffre dépend de si on le mesure en entrée ou en sortie des unités de texture. En effet, les unités de texture intègrent des fonctionnalités de filtrage de texture, qui lissent les textures. Ces techniques lisent plusieurs texels et les mélangent pour fournir le texel final, celui envoyé aux unités de ''shader'' ou aux ROPs. La coutume est de le mesurer en sortie des unités de texture. Le nombre en entrée dépend grandement de la bande passante mémoire et du filtrage de texture utilisé, pas celui en sortie. Le ''texture fillrate'' en sortie est le nombre maximal d'opérations de placage de texture par seconde. Là encore, on peut l'estimer en multipliant le nombre d'unités de texture par leur fréquence. Il s'agit évidemment d'une approximation assez peu fiable, car les unités de texture peuvent mettre plusieurs cycles pour plaquer une texture, les filtrer, etc. Le ''texture fillrate'' est bien plus important que le ''pixel fillrate'', surtout pour les GPU modernes. Un point important est que le ''texture fillrate'' a longtemps été égal au ''pixel fillrate''. C'était le cas avant la Geforce 2 de NVIDIA. Les cartes graphiques avaient autant d'unités de texture que de ROP, et les deux fonctionnaient à la même fréquence. Les deux ont commencés à diverger quand le multi-texturing est arrivé, avec la Geforce 2, justement. Le nombre d'unités de texture a doublé comparé aux ROPs, ce qui fait que le ''texture fillrate'' est rapidement devenu le double du ''pixel fillrate''. Sur les GPU modernes, le ''texture fillrate'' est le triple, quadruple, voire octuple du ''pixel fillrate''. ===La performance de l'unité géométrique=== Pour l'unité géométrique, l'équivalent au ''fillrate'' est le '''''polygon throughput'''''. C'est nombre de sommets que l'unité géométrique peut traiter par seconde, exprimé en ''méga-sommets par secondes'', en millions de sommets par seconde. Il dépend de la fréquence et du nombre d'unités géométriques, mais n'est pas exactement le produit des deux. Il varie beaucoup d'une carte graphique à l'autre, mais une approximation souvent utilisée prend le quart du produit fréquence * nombre d'unités géométriques. Il faut noter que cette mesure de performance a survécu à l'arrivée des shaders. Les GPU anciens, avant DirectX 10, avaient des processeurs séparés pour les ''vertex shaders'' et les ''pixel shaders''. Mais les calculs géométriques restaient séparés des autres calculs, ils avaient des unités géométriques dédiées. Quand les processeurs de shaders dit unifiés sont arrivés, la séparation entre géométrie et autres calculs a cédé et cet indicateur a simplement disparu. ===Les autres circuits=== Pour les autres circuits, il n'y a malheureusement pas d'indicateur de performance clair et net comme peut l'être le ''fillrate''. La raison à cela se comprend assez bien quand on regarde comment se calcule le ''fillrate''. C'est juste le produit de la fréquence et d'un nombre d'unités, en l’occurrence des unités de texture ou des ROPs. Le produit signifie que ces unités travaillent en parallèle et qu'elles peuvent chacune traiter un pixel/texel indépendamment des autres. Par contre, sur les anciens GPUs de l'époque, le rastériseur et l'unité géométrique sont un seul et unique circuit. Le nombre d'unité est donc égal à 1, et il ne nous reste plus que la fréquence. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Le rendu d'une scène 3D : concepts de base | prevText=Le rendu d'une scène 3D : concepts de base | next=L'évolution vers la programmabilité : les GPUs | nextText=L'évolution vers la programmabilité : les GPUs }}{{autocat}} </noinclude> 612ln9pglix6pcp2m438su2bf42w64s Les cartes graphiques/Les accélérateurs de scanline 0 82283 764864 742188 2026-04-24T17:43:18Z Mewtow 31375 /* Les contraintes de conception */ 764864 wikitext text/x-wiki Les chapitres précédents ont abordé des VDC couplés à un ''framebuffer'', mais tous les VDC ne sont pas dans ce cas. La raison est 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 ! Les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo, les cartes d'affichages devaient se débrouiller avec beaucoup de mémoire. Pour optimiser l'utilisation de la mémoire, les cartes d'affichage n'avaient pas de ''framebuffer'' et fonctionnaient autrement. Il existe plusieurs optimisations pour économiser de la mémoire. La première optimisation est appelée le rendu en tiles, que nous verrons dans le prochain chapitre. Il s'agit techniquement d'une forme de compression d'image spécialisée, qui est assez reliée au mode texte des anciennes cartes graphiques. Nous verrons le rendu en tile et le rendu en mode texte dans un chapitre dédié. Une autre optimisation rend l'image ligne par ligne. La mémoire vidéo ne contient que la ligne en cours de rendu, pas une image complète. D'ailleurs, la mémoire vidéo est souvent appelée le ''line buffer'', '''tampon de ligne''' en français. Il n'y a pas de terminologie officielle pour désigner de tels VDC, mais nous pouvons les appeler des '''''scanline accelerators''''', '''accélérateurs de ''scanline'''''. Quelques VDC anciens étaient de ce type. Par exemple, les premières consoles ATARI utilisaient des accélérateurs de ''scanline'', de même que la carte graphique de la console néo-géo. Voyons-en quelques exemples, avec notamment les VDC des consoles ATARI. Nous verrons dans quelques sections qu'ils sont assez complexes, avec une gestion des ''sprites'' matériels, du défilement, et quelques autres techniques d'accélération 2D. ==Généralités sur les accélérateurs de ''scanline''== Avec un accélérateur de ''scanline'', le processeur doit écrire la prochaine ligne à afficher dans le tampon de ligne, avec un timing assez serré. Il doit attendre que l'affichage de la ligne en cours soit terminé, mais doit finir son travail avant l'affichage de la prochaine ligne. Pour le dire autrement, le processeur met à jour la ligne à afficher pendant l'intervalle de ''horizontal blank''. Il s'agit d'une technique appelée le '''''racing the beam'''''. Pour cela, le VDC émet une interruption matérielle à la fin de l’affichage de la ligne courante. Les accélérateurs de ''scanline'' peuvent supporter les ''sprites'' matériels. Typiquement, ils supportent un certain nombre de ''sprite'' par ligne. Notez le "par ligne". En effet, le processeur peut en profiter pour changer les ''sprites'' entre l'affichage de deux lignes. L'intérêt est que cela permet d'afficher plus de ''sprites'' que ce que la console permet. Par exemple, si l’accélérateur de ''scanline'' supporte 8 ''sprites'' par ligne, il peut afficher plus de 8 ''sprite'' par image, en respectant la contrainte de 8 ''sprite'' par ligne. C'est juste qu'il y aura, par exemple, 8 ''sprites'' en haut de l'image, 8 au milieu, 8 en bas. ===La ''display list''=== Les accélérateurs de ''scanline'' les plus complexes permettent de réduire grandement le nombre de ''raster interrupts'' en intégrant une sorte de contrôleur DMA programmable. Dans le détail, ce contrôleur DMA exécute un programme composé d'une suite d'instructions simples, chacune commande l'affichage d'une ligne à l'écran. Le programme exécuté est une série d'instructions appelée la '''''display list''''', terme qui reviendra dans quelques chapitres. La ''display list'' commence par un préambule de configuration, qui indique la résolution, le mode graphique, etc. Puis, elle afficher l'image à l'écran, ligne par ligne, sans intervention du processeur. La display list a une instruction par ligne à afficher, l'instruction copie la ligne à afficher de la mémoire RAM principale vers la mémoire vidéo (le tampon de ligne), pendant une période de ''blanking'' horizontal. La ''display list'' s'occupe de séquencer les lignes une par une, sans intervention du processeur. Le processeur n'a pas besoin de copier lui-même chaque ligne, la ''display list'' le fait automatiquement pour toutes les lignes. Un avantage est que le défilement vertical est très rapide avec une ''display list''. Il suffit de rajouter ou d'enlever des lignes dans la ''display list''. Pour défiler d'une ligne vers le bas, on rajoute une ligne au début de la ''display list'' et on enlève la dernière. Et inversement pour défiler vers le haut. Le processeur peut le faire sans se synchroniser fortement avec l'accélérateur de ''scanline''. Nous verrons dans quelques chapitres que ce mécanisme a été utilisé sur les ordinateurs Amstrad PCW, mais nous ne pouvons pas en parler pour le moment, vu que leur carte d'affichage est une carte en mode texte, qu'on n'a pas encore vu. [[File:Vector display architecture.svg|centre|vignette|upright=1.5|Illustration d'un ''Video Interface Controler''.]] La ''display list'' fait que les ''raster interrupts'' sont inutiles, ou du moins grandement réduites. Les interruptions sont déclenchées pour certaines lignes seulement, celles où l'instruction qui affiche la ligne le précise. La gestion des interruptions est donc totalement programmable. La ''display list'' contient des instructions pour déclencher des ''raster interrupts'', placées stratégiquement dans la ''display list'' par le programmeur. Par exemple, si le programmeur veut changer les ''sprites'' entre deux lignes, il peut déclencher une ''raster interrupts'' entre ces deux lignes, le processeur répondra à l'interruption en changeant les registres de ''sprites''. ==Le ''Television Interface Adaptor'' des consoles Atari 2600== Un exemple d'accélérateur de ''scanline'' est celui utilisé sur l'''Atari Video Computer System'' et l'Atari 2600. La carte graphique en question s'appelait la '''''Television Interface Adaptor''''', abrévié TIA. Il incorpore un tampon de ligne, qui est modifié entre l'envoi à l'écran de deux lignes. Par contre, il n'y a pas d'interruption pour prévenir le processeur qu'il doit envoyer la ligne suivante. ===Les contraintes de conception=== Le TIA a été conçu avec de nombreuses contraintes en tête, qui ne se comprennent qu'en remettant la console dans son contexte historique. L'époque est celle des '''consoles de première génération''', des consoles qui étaient conçues pour un jeu bien précis. Pas de cartouche, de CD ou quoique ce soit d'autre. Le jeu était intégré directement dans les circuits de la console, qui n'était pas programmable. Il y avait une console pour le jeu Pong, une autre pour le jeu Tank, etc. Les jeux étaient alors très limités niveau gameplay. <noinclude>[[File:Pong Game Test2.gif|vignette|upright=2|Pong Game Test2]]</noinclude> Les premières consoles ATARI étaient les premières '''consoles de seconde génération''', conçues pour faire fonctionner plusieurs jeux, conçues pour être programmables. Elles étaient conçues pour faire fonctionner Pong, Tank et des variantes de ces deux jeux. Pour rappel, s'il faut faire un rappel, Pong était un jeu de tennis à deux joueurs. Il se limitait à un arrière-plan fixe sur lequel chaque joueur contrôle une barre verticale, sur laquelle la balle peut rebondir. Tank était une variante de PONG, où deux joueurs controlaient chaun un tank et se tiraient des missiles dessus avec l'intention de détruire le tank de l'adversaire. Son adaptation sur ATARI s'appelait Combat!, en voici un screenshot : [[File:Combat.svg|centre|vignette|upright=2|Combat, jeu de l'Atari 2600.]] La console est donc conçue pour gérer un arrière-plan, deux sprites pour les joueurs, un pour la balle, deux pour les missiles. Chacun est mémorisé dans un registre dédié, qui mémorise la ligne du sprite/arrière-plan à afficher à l'écran. De plus, le TIA incorpore un système pour détecter les collisions, afin de détecter si la balle rebondit sur la raquette dans PONG, sur un missile touche un tank dans TANK. La conception du TIA est très simple, sans compter que diverses optimisations permettent d'encore plus simplifier le TIA. Par exemple, l'arrière-plan est censé être symétrique : la partie gauche est recopiée sur le côté droit de l'écran, avec un effet miroir. Optimisation possible car PONG et TANK sont censé avoir un terrain de jeu symétrique, identique pour chaque joueur. Avec une architecture aussi simple, il n'est pas possible de faire de miracles. Les jeux sur ATARI devaient faire avec les limitations du TIA : arrière-plan symétrique, moins d'une dizaine de sprites simultanés à l'écran. {| |- |[[File:Mini Golf Atari 2600.jpg|vignette|Mini Golf, Atari 2600]] |[[File:Backgammon Atari 2600.jpg|vignette|Backgammon , Atari 2600]] |[[File:Human Cannonball Atari 2600.jpg|vignette|Human Cannonball, Atari 2600]] |- |[[File:Frogs & Flies Atari 2600.jpg|vignette|Frogs & Flies, Atari 2600]] |[[File:DuckAttack-Tank-room-1.png|vignette|Screenshot de Duck Attack !]] |[[File:Barnstorming Atari 2600.jpg|vignette|Barnstorming Atari 2600]] |} Quelques ruses de sioux ont cependant permis de dépasser ces limites techniques. {| |- |[[File:Spider Fighter Atari 2600.jpg|vignette|Spider Fighter Atari 2600]] |[[File:Robot Tank Atari 2600.jpg|vignette|Robot Tank Atari 2600]] |[[File:Bradley Trainer screenshot.png|vignette|Bradley Trainer screenshot]] |} ===L'arrière-plan du TIA : un registre dédié de 20 bits=== Vu que le rendu s'effectue ligne par ligne, l'arrière-plan et les sprites sont en réalité des lignes, pas des images complètes. Le '''registre d'arrière-plan''' est un registre de 20 bits. Un bit correspond à 4 pixels de l'écran, il indique la couleur de ces 4 pixels consécutifs. Peut-être avez-vous remarquez que 20 bits * 4 pixels = 80 pixels. Pourtant, le TIA gére une résolution horizontale par défaut de 160 pixels. Soit deux fois plus que ce qui est géré par le registre d'arrière-plan. La raison est que l'arrière-plan est symétrique. Le registre d'arrière-plan ne définit que la moitié gauche de l'écran, la moitié droite en est le reflet miroir. Vous pourriez croire que la couleur codée dans ce registre est un simple noir et blanc, mais c'est plus compliqué. Le registre d'arrière-plan indique, pour chaque bloc de 4 pixels, si le pixel prend la couleur de l'arrière-plan ou la couleur de fond par défaut. Un registre séparé contient la couleur de l'arrière-plan, elle-même encodée grâce à un système de palette indicé. La couleur de fond est elle aussi configurable. En théorie, l'arrière-plan est censé être symétrique, mais quelques astuces permettent d'afficher un arrière-plan asymétrique. L'idée est simplement de modifier le registre d'arrière-plan une fois que la moitié gauche a été affichée. Cela demande un ''timing'' très précis, mais c'est possible et plusieurs jeux Atari 2600 le faisaient. Certains arrivaient même à simuler un défilement horizontal ! ===Les ''sprites'' matériels du TIA=== Le TIA gère 5 ''sprites'' matériels, grâce à 5 registres capables chacun de mémoriser une ligne de pixel. Ces registres sont spécialisés, avec deux registres pour les avatars des joueurs, deux missiles et une balle. Ne vous fiez pas aux noms, la différence entre les 5 est la taille des ''sprites'' stocké dedans. Les ''sprites'' des avatars sont de 8 pixels de large, peuvent être dupliquées ou étendus. La balle est un ''sprite'' de même couleur que l'arrière-plan, de 1, 2, 4 ou 8 pixels de large. Les deux missiles sont identiques à la balle, sauf qu'ils ont la même couleur que le ''sprite'' du joueur associé. Un ''sprite'' matériel sur le TIA est codé sur un octet. Un ''sprite'' fait 8 pixels de large, chacun étant là-encore codé sur 1 bit. Il indique encore une fois si le pixel a la couleur de fond ou une couleur spécifique au ''sprite''. Vu que cet octet écrit une ligne du ''sprite'', il est changé à chaque ligne pour réellement afficher un ''sprite'' à deux dimensions. Vous remarquerez que le ''sprite'' est codé sur un octet, les informations de sa position X et Y à l'écran ne sont pas encodées. La raison est simple : un ''sprite'' est affiché quand le processeur écrit l'octet dedans. L'affichage d'un ''sprite'' est donc commandé par le processeur et doit se faire au cycle d'horloge près. Le problème est que le processeur n'est pas précis au pixel près. Déjà, sa fréquence est égale à un tiers de la fréquence du TIA, ce qui fait qu'il est précis à 3 pixels près. De plus, le logiciel faisait l'écriture dans le registre de ''sprite'' est basé sur une boucle, dont les instructions prennent 5 cycles pour s'exécuter. Ce qui fait une imprécision de 15 cycles. Pour compenser ce défaut, le TIA incorpore deux registres, un par avatar/''player''. Ils permettent de décaler le ''sprite'' de quelques pixels, la valeur de décalage étant précisée dans ce registre. La valeur est un entier allant de -7 à 8 cycles/pixels. L'affichage d'un ''sprite'' est donc en deux temps : on déclenche une écriture précise à 15 cycles près, puis on décale le ''sprite'' avec ces deux registres. ===L'architecture du TIA=== Mettre à jour les registres du TIA à chaque ligne n'est pas si différent de modifier une mémoire vidéo entre deux lignes. Mais un défaut des consoles ATARI est que le processeur n'utilisait pas d'interruptions pour gérer l'affichage des lignes. À la place, le bus indiquait au processeur quand le TIA acceptait qu'on modifie ses registres. Le bus avait un signal RDY (READY) qui indiquait si le TIA était occupé à afficher une ligne ou non. Un autre défaut est que le TIA ne génère pas totalement les signaux de synchronisation verticale, qui servent à indiquer à l'écran qu'il a fini d'afficher une image. La raison est qu'il n'a pas de compteur de ligne ! Il y a bien un compteur pour les colonnes, pour générer les signaux de synchronisation horizontale, mais pas plus. C'est le processeur qui doit générer le signal de synchronisation verticale de lui-même ! Pour cela, le processeur doit écrire dans une adresse dédie associée au TIA, ce qui déclenche un signal de synchronisation verticale immédiat. Si on devait faire un constat avec tout ce qui a été dit plus haut, il serait que le TIA est très simple, trop simple. Le processeur est très impliqué dans l'affichage à l'écran, notamment pour les ''sprites''. La carte graphique est donc composé par l'association entre le TIA et le processeur proprement dit, bien que celui-ci soit le CPU. Ce qui explique l'absence de mécanismes de synchronisation entre TIA et CPU : c'est le CPU qui commande le TIA au cycle près. ==Les VDC ANTIC et CTIA des consoles Atari post-2600== Les consoles Atari 8 bits, qui ont succédé à l'Atari 2600, n'utilisaient un VDC TIA amélioré appelé le CTIA pour sa première version (''Color Television Interface Adaptor''), le GTIA pour sa seconde version (''Graphic Television Interface Adaptor''). Les deux étaient un accélérateur de ''scanline'' qui intégraient l'accélération matérielle de ''sprites'' et une palette indicée. Comme pour le TIA, les ''sprites'' servaient pour les joueurs et des missiles, sauf que leur nombre est doublé pour passer à 4 chacun. Mais la révolution était qu'ils étaient associé à un autre circuit appelé l'ANTIC, qui commandait le CTIA/GTIA sans intervention du processeur CPU. Là où l'Atari 2600 utilisait le processeur pour l'affichage des ''sprites'' et beaucoup d'autres fonctions, une bonne partie de ces traitements est déléguées à l'ANTIC sur les machines suivantes. L'ANTIC est un ''blitter'' amélioré, en charge des copies en mémoire. Mais surtout, il s'occupe du séquencement des lignes envoyées au CTIA. Ce n'est pas le processeur qui s'occupe d'envoyer les lignes une par une au CTIA, cette fonction est déportée sur l'ANTIC. ===La ''display list''=== Le fonctionnement de l'ANTIC est assez complexe, mais on peut le voir comme une sorte de pseudo-processeur, qui exécute un programme de rendu 2D. Le programme en question est une suite d’opération de rendu 2d à exécuter dans l'ordre, qui permet de calculer l'image ligne par ligne. Il est appelé la '''''Display List''''', et est stocké dans la mémoire de la console. L'ANTIC lit le programme instruction par instruction, grâce à un contrôleur DMA intégré dans l'ANTIC, qui contient un ''program counter'' interne à l'ANTIC. L'exécution d'une ''Display List'' sur l'ANTIC permet de décharger le processeur des tâches de rendu 2D, du moins dans une certaine mesure. Une instruction de la ''display list'' permet de calculer une ligne de l'écran, en précisant comment combiner les ''sprites'' et l'arrière-plan, tous deux stockés dans la mémoire vidéo. La ''display list'' gére entre 0 et 240 instructions, ce qui limite la résolution verticale à 240 pixels. Les instructions peuvent se classer en quatre types principaux : des instructions pour écrire une ligne de pixels colorés, des instructions pour écrire une ligne de caractères, des instructions pour émettre les signaux de synchronisation de ''blanking'', et enfin des branchements qui agissent sur le ''program counter'' de l'ANTIC. Les instructions pour afficher des pixels/caractères peuvent activer le défilement horizontal ou vertical suivant l'instruction. Une instruction est codée sur 8 bits minimum. {| class="wikitable" |- ! Bit 7 !! Bit 6 !! Bit 5 !! Bit 4 !! Bit 3 !! Bit 2 !! Bit 1 !! Bit 0 |- | DLI || LMS || VS || HS || colspan="4" | Mode |} Les 4 bits de mode précisent quelle est l'instruction à utiliser, ce qui fait 16 instructions en tout, réparties dans les 4 classes mentionnées plus haut. Les bits HS et VS activent ou désactivent le défilement vertical et horizontal. Le bit LMS permet à l'instruction de préciser l'adresse où se trouvent les tableaux de données à utiliser, comme la place de l'arrière-plan en mémoire RAM, ce genre de choses. Pour cela, le bit est placé à 1 et l'adresse est dans les 2 octets qui suivent l'instruction. Le bit DLI gère les interruptions dites de ''Display List'', ou interruptions DLI, que nous allons voir dans ce qui suit. Les interruptions DLI sont l'équivalent sur l'ANTIC des interruptions d'''horizontal blanking'', déclenchées à la fin de l'affichage d'une ligne. Elles préviennent le processeur qu'une ligne entière a été affichée. Le processeur peut alors écrire en mémoire vidéo durant un court laps de temps s'il en a besoin. Il peut alors changer les ''sprites'' à la volée, ce qui permet d'afficher plus de ''sprites'' que ce que supporte le chip CTIA/GTIA. Les interruptions sont déclenchées pour certaines lignes seulement, celles où l'instruction qui affiche la ligne le précise. Si l'instruction a son bit DLI mis à 1, alors une interruption est déclenchée à la fin de la ligne. S'il est à 0, pas d'interruption. La gestion des interruptions DLI est donc totalement programmable. ===Les registres de configuration de l'ANTIC=== [[File:Atari ANTIC (CO12296) pin-out.svg|vignette|Atari ANTIC (CO12296) pin-out]] Niveau registres, l'ANTIC contient un ''program counter'' et de quoi configurer le contrôleur DMA. Il a aussi des registres pour localiser les données importantes en mémoire, qui sont regroupées dans des tableaux séparés. Pour ce qui est du rendu, il contient un registre pour l'adresse de l'arrière-plan, un autre pour l'adresse des ''sprites'' en mémoire RAM. Il contient aussi deux registres pour configurer le défilement horizontal et vertical. Pour gérer la synchronisation avec le CPU, l'ANTIC incorpore un compteur de ligne, ainsi qu'un registre de synchronisation horizontale qui est à 1 quand une ligne est en train d'être affichée (mécanisme redondant avec les interruptions DLI). Il y a aussi plusieurs registres pour gérer les interruptions, avec un registre de statut que le CPU peut lire à loisir pour savoir quelle est la raison qui a déclenché l'interruption, ainsi qu'un registre de configuration des interruptions. ==Le système graphique de la console néo-géo== La néo-géo est une console assez ancienne, de la période 16 bits, commercialisée en 1990. Elle avait pour caractéristique d'avoir le même hardware que les bornes d'arcade du même nom, les néo-géo MVS. Elle comprenait un processeur Motorola 68000, 64 kilooctets de mémoire RAM, un processeur sonore Zilog Z80, et un VDC avec 64 kilooctets de mémoire vidéo. Elle avait une palette de 65 536 couleurs, grâce à une palette indicée de 8 kilooctets. ===L'avant-plan, l'arrière-plan et les ''sprites'' de la néo-géo=== Un point important est que la mémoire vidéo n'est pas un ''framebuffer'', le VDC utilise un tampon de ligne. La console a pour particularité de ne pas gérer d’arrière-plan, l'image affichée est intégralement composée de ''sprites''. Les ''sprites'' sont tous combinés pour donner l'image finale. Un autre détail est que les ''sprites'' matériels sur la néo-géo sont différents des ''sprites'' matériels des consoles précédentes. Ils sont composés de plusieurs motifs, de plusieurs ''tiles''. Les motifs font tous des carrés de 16 pixels de côtés, contenant 15 couleurs (plus la couleur de transparence). Un ''sprite'' est un rectangle qui a un pixel de large, mais dont la hauteur va de 1 à 32 motifs, donc de 16 à 512 pixels. Chaque ''sprite'' indique quels sont ses motifs, quelle palette utiliser, s'il faut appliquer l'effet miroir, etc. Un ''sprite'' logiciel est composé en concaténant horizontalement plusieurs ''sprites'' de néo-géo. A défaut d'un arrière-plan, la console gère un pseudo-arrière-plan composé d'une couleur unie. Pour faire la différence avec une image d’arrière-plan, on peut plutôt parler d'une couleur de fond. Les ''sprites'' sont empilés les uns sur les autres au-dessus de cet arrière-plan. Au-dessus des ''sprites'', il y a un avant-plan spécialisé, qui est rendu au-dessus de tout le reste, qui est utilisé pour rendre le HUD. Cet avant-plan est appelé la ''fix layer'' dans la documentation de la console. Les motifs de l'avant-plan n'ont pas la même taille que pour les ''sprites'' : ce sont des carrés de 8 pixels de côtés, pas 16 ! Les motifs de l'avant-plan sont placés dans une mémoire ROM de celle pour les motifs des ''sprites''. En effet, une cartouche de néo-géo contient plusieurs mémoires ROM : * une pour les motifs des ''sprites'' ; * une pour les motifs de l'avant-plan ; * une pour le programme à exécuter sur le processeur M68000 principal ; * une pour le programme à exécuter sur le processeur sonore Z80 ; * une pour les échantillons audio, la musique et le son du jeu. ===Le rendu d'une image=== Lors du rendu d'une ligne, la console détermine quels ''sprites'' sont affichés sur cette ligne, et les ''sprites'' adéquats sont lus depuis la ROM de la cartouche. Les pixels de la ligne sont déterminés par le VDC et écrit dans le tampon de ligne. La console supporte au maximum 96 ''sprites'' par ligne, ce qui dépasse de très loin les capacités des autres consoles 8 ou 16 bits. La console dispose de deux tampons de lignes, ce qui permet d'afficher une ligne pendant qu'on prépare la suivante. L'idée est la suivante. La première ligne est placée dans un tampon de ligne, elle est envoyée à l'écran pixel par pixel par le VDC. En même temps, le processeur écrit la prochaine dans le second tampon de ligne. Une fois la ligne totalement affichée, le VDC échange les deux tampons de ligne. La ligne suivante est déjà prête dans le second tampon de ligne, elle est envoyée à l'écran pixel par pixel, le premier tampon de ligne est utilisé pour précalculer la ligne suivante, et ainsi de suite. La gestion de la profondeur des ''sprites'' est assez simple : les ''sprites'' sont placés dans la mémoire vidéo selon leur profondeur. En clair, les ''sprites'' situés au fond de l'image sont placés au début de la mémoire vidéo, ceux situés à l'avant-plan sont placés à la fin de la mémoire vidéo. Pas besoin po_ur le VDC de gérer les priorités et la profondeur des ''sprites'', tout est déjà réglé une fois les ''sprites'' chargés dans la mémoire vidéo. Le console gère une mise à l'échelle des ''sprites'' matériels, mais ceux-ci ne peuvent qu'être réduits, pas zoomés. La mise à l'échelle est précise au pixel près. La mise à l'échelle peut se faire à l'horizontale et à la verticale, les deux sont séparés. Par exemple, on peut réduire un ''sprite'' d'un facteur 5 sur la verticale, d'un facteur 2 sur l'horizontale. {{NavChapitre | book=Les cartes graphiques | prev=Le mode texte et le rendu en tiles | prevText=Le mode texte et le rendu en tiles | next=Les Video Display Controler atypiques | nextText=Les Video Display Controler atypiques }} {{autocat}} 8r2aguegehmg2zjwlitidaritfjrviv 764905 764864 2026-04-24T18:04:10Z Mewtow 31375 /* Les contraintes de conception */ 764905 wikitext text/x-wiki Les chapitres précédents ont abordé des VDC couplés à un ''framebuffer'', mais tous les VDC ne sont pas dans ce cas. La raison est 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 ! Les tout premiers ordinateurs n'avaient pas assez de mémoire vidéo, les cartes d'affichages devaient se débrouiller avec beaucoup de mémoire. Pour optimiser l'utilisation de la mémoire, les cartes d'affichage n'avaient pas de ''framebuffer'' et fonctionnaient autrement. Il existe plusieurs optimisations pour économiser de la mémoire. La première optimisation est appelée le rendu en tiles, que nous verrons dans le prochain chapitre. Il s'agit techniquement d'une forme de compression d'image spécialisée, qui est assez reliée au mode texte des anciennes cartes graphiques. Nous verrons le rendu en tile et le rendu en mode texte dans un chapitre dédié. Une autre optimisation rend l'image ligne par ligne. La mémoire vidéo ne contient que la ligne en cours de rendu, pas une image complète. D'ailleurs, la mémoire vidéo est souvent appelée le ''line buffer'', '''tampon de ligne''' en français. Il n'y a pas de terminologie officielle pour désigner de tels VDC, mais nous pouvons les appeler des '''''scanline accelerators''''', '''accélérateurs de ''scanline'''''. Quelques VDC anciens étaient de ce type. Par exemple, les premières consoles ATARI utilisaient des accélérateurs de ''scanline'', de même que la carte graphique de la console néo-géo. Voyons-en quelques exemples, avec notamment les VDC des consoles ATARI. Nous verrons dans quelques sections qu'ils sont assez complexes, avec une gestion des ''sprites'' matériels, du défilement, et quelques autres techniques d'accélération 2D. ==Généralités sur les accélérateurs de ''scanline''== Avec un accélérateur de ''scanline'', le processeur doit écrire la prochaine ligne à afficher dans le tampon de ligne, avec un timing assez serré. Il doit attendre que l'affichage de la ligne en cours soit terminé, mais doit finir son travail avant l'affichage de la prochaine ligne. Pour le dire autrement, le processeur met à jour la ligne à afficher pendant l'intervalle de ''horizontal blank''. Il s'agit d'une technique appelée le '''''racing the beam'''''. Pour cela, le VDC émet une interruption matérielle à la fin de l’affichage de la ligne courante. Les accélérateurs de ''scanline'' peuvent supporter les ''sprites'' matériels. Typiquement, ils supportent un certain nombre de ''sprite'' par ligne. Notez le "par ligne". En effet, le processeur peut en profiter pour changer les ''sprites'' entre l'affichage de deux lignes. L'intérêt est que cela permet d'afficher plus de ''sprites'' que ce que la console permet. Par exemple, si l’accélérateur de ''scanline'' supporte 8 ''sprites'' par ligne, il peut afficher plus de 8 ''sprite'' par image, en respectant la contrainte de 8 ''sprite'' par ligne. C'est juste qu'il y aura, par exemple, 8 ''sprites'' en haut de l'image, 8 au milieu, 8 en bas. ===La ''display list''=== Les accélérateurs de ''scanline'' les plus complexes permettent de réduire grandement le nombre de ''raster interrupts'' en intégrant une sorte de contrôleur DMA programmable. Dans le détail, ce contrôleur DMA exécute un programme composé d'une suite d'instructions simples, chacune commande l'affichage d'une ligne à l'écran. Le programme exécuté est une série d'instructions appelée la '''''display list''''', terme qui reviendra dans quelques chapitres. La ''display list'' commence par un préambule de configuration, qui indique la résolution, le mode graphique, etc. Puis, elle afficher l'image à l'écran, ligne par ligne, sans intervention du processeur. La display list a une instruction par ligne à afficher, l'instruction copie la ligne à afficher de la mémoire RAM principale vers la mémoire vidéo (le tampon de ligne), pendant une période de ''blanking'' horizontal. La ''display list'' s'occupe de séquencer les lignes une par une, sans intervention du processeur. Le processeur n'a pas besoin de copier lui-même chaque ligne, la ''display list'' le fait automatiquement pour toutes les lignes. Un avantage est que le défilement vertical est très rapide avec une ''display list''. Il suffit de rajouter ou d'enlever des lignes dans la ''display list''. Pour défiler d'une ligne vers le bas, on rajoute une ligne au début de la ''display list'' et on enlève la dernière. Et inversement pour défiler vers le haut. Le processeur peut le faire sans se synchroniser fortement avec l'accélérateur de ''scanline''. Nous verrons dans quelques chapitres que ce mécanisme a été utilisé sur les ordinateurs Amstrad PCW, mais nous ne pouvons pas en parler pour le moment, vu que leur carte d'affichage est une carte en mode texte, qu'on n'a pas encore vu. [[File:Vector display architecture.svg|centre|vignette|upright=1.5|Illustration d'un ''Video Interface Controler''.]] La ''display list'' fait que les ''raster interrupts'' sont inutiles, ou du moins grandement réduites. Les interruptions sont déclenchées pour certaines lignes seulement, celles où l'instruction qui affiche la ligne le précise. La gestion des interruptions est donc totalement programmable. La ''display list'' contient des instructions pour déclencher des ''raster interrupts'', placées stratégiquement dans la ''display list'' par le programmeur. Par exemple, si le programmeur veut changer les ''sprites'' entre deux lignes, il peut déclencher une ''raster interrupts'' entre ces deux lignes, le processeur répondra à l'interruption en changeant les registres de ''sprites''. ==Le ''Television Interface Adaptor'' des consoles Atari 2600== Un exemple d'accélérateur de ''scanline'' est celui utilisé sur l'''Atari Video Computer System'' et l'Atari 2600. La carte graphique en question s'appelait la '''''Television Interface Adaptor''''', abrévié TIA. Il incorpore un tampon de ligne, qui est modifié entre l'envoi à l'écran de deux lignes. Par contre, il n'y a pas d'interruption pour prévenir le processeur qu'il doit envoyer la ligne suivante. ===Les contraintes de conception=== Le TIA a été conçu avec de nombreuses contraintes en tête, qui ne se comprennent qu'en remettant la console dans son contexte historique. L'époque est celle des '''consoles de première génération''', des consoles qui étaient conçues pour un jeu bien précis. Pas de cartouche, de CD ou quoique ce soit d'autre. Le jeu était intégré directement dans les circuits de la console, qui n'était pas programmable. Il y avait une console pour le jeu Pong, une autre pour le jeu Tank, etc. Les jeux étaient alors très limités niveau gameplay. <noinclude>[[File:Pong Game Test2.gif|vignette|upright=2|Pong Game Test2]]</noinclude> Les premières consoles ATARI étaient les premières '''consoles de seconde génération''', conçues pour faire fonctionner plusieurs jeux, conçues pour être programmables. Elles étaient conçues pour faire fonctionner Pong, Tank et des variantes de ces deux jeux. Pour rappel, s'il faut faire un rappel, Pong était un jeu de tennis à deux joueurs. Il se limitait à un arrière-plan fixe sur lequel chaque joueur contrôle une barre verticale, sur laquelle la balle peut rebondir. Tank était une variante de PONG, où deux joueurs controlaient chaun un tank et se tiraient des missiles dessus avec l'intention de détruire le tank de l'adversaire. Son adaptation sur ATARI s'appelait Combat!, en voici un screenshot : [[File:Combat.svg|centre|vignette|upright=2|Combat, jeu de l'Atari 2600.]] La console est donc conçue pour gérer un arrière-plan, deux sprites pour les joueurs, un pour la balle, deux pour les missiles. Chacun est mémorisé dans un registre dédié, qui mémorise la ligne du sprite/arrière-plan à afficher à l'écran. De plus, le TIA incorpore un système pour détecter les collisions, afin de détecter si la balle rebondit sur la raquette dans PONG, sur un missile touche un tank dans TANK. La conception du TIA est très simple, sans compter que diverses optimisations permettent d'encore plus simplifier le TIA. Par exemple, l'arrière-plan est censé être symétrique : la partie gauche est recopiée sur le côté droit de l'écran, avec un effet miroir. Optimisation possible car PONG et TANK sont censé avoir un terrain de jeu symétrique, identique pour chaque joueur. Avec une architecture aussi simple, il n'est pas possible de faire de miracles. Les jeux sur ATARI devaient faire avec les limitations du TIA : arrière-plan symétrique, moins d'une dizaine de sprites simultanés à l'écran. <noinclude>{| |- |[[File:Mini Golf Atari 2600.jpg|vignette|Mini Golf, Atari 2600]] |[[File:Backgammon Atari 2600.jpg|vignette|Backgammon , Atari 2600]] |[[File:Human Cannonball Atari 2600.jpg|vignette|Human Cannonball, Atari 2600]] |- |[[File:Frogs & Flies Atari 2600.jpg|vignette|Frogs & Flies, Atari 2600]] |[[File:DuckAttack-Tank-room-1.png|vignette|Screenshot de Duck Attack !]] |[[File:Barnstorming Atari 2600.jpg|vignette|Barnstorming Atari 2600]] |}</noinclude> Quelques ruses de sioux ont cependant permis de dépasser ces limites techniques. {| |- |[[File:Spider Fighter Atari 2600.jpg|vignette|Spider Fighter Atari 2600]] |[[File:Robot Tank Atari 2600.jpg|vignette|Robot Tank Atari 2600]] |[[File:Bradley Trainer screenshot.png|vignette|Bradley Trainer screenshot]] |} ===L'arrière-plan du TIA : un registre dédié de 20 bits=== Vu que le rendu s'effectue ligne par ligne, l'arrière-plan et les sprites sont en réalité des lignes, pas des images complètes. Le '''registre d'arrière-plan''' est un registre de 20 bits. Un bit correspond à 4 pixels de l'écran, il indique la couleur de ces 4 pixels consécutifs. Peut-être avez-vous remarquez que 20 bits * 4 pixels = 80 pixels. Pourtant, le TIA gére une résolution horizontale par défaut de 160 pixels. Soit deux fois plus que ce qui est géré par le registre d'arrière-plan. La raison est que l'arrière-plan est symétrique. Le registre d'arrière-plan ne définit que la moitié gauche de l'écran, la moitié droite en est le reflet miroir. Vous pourriez croire que la couleur codée dans ce registre est un simple noir et blanc, mais c'est plus compliqué. Le registre d'arrière-plan indique, pour chaque bloc de 4 pixels, si le pixel prend la couleur de l'arrière-plan ou la couleur de fond par défaut. Un registre séparé contient la couleur de l'arrière-plan, elle-même encodée grâce à un système de palette indicé. La couleur de fond est elle aussi configurable. En théorie, l'arrière-plan est censé être symétrique, mais quelques astuces permettent d'afficher un arrière-plan asymétrique. L'idée est simplement de modifier le registre d'arrière-plan une fois que la moitié gauche a été affichée. Cela demande un ''timing'' très précis, mais c'est possible et plusieurs jeux Atari 2600 le faisaient. Certains arrivaient même à simuler un défilement horizontal ! ===Les ''sprites'' matériels du TIA=== Le TIA gère 5 ''sprites'' matériels, grâce à 5 registres capables chacun de mémoriser une ligne de pixel. Ces registres sont spécialisés, avec deux registres pour les avatars des joueurs, deux missiles et une balle. Ne vous fiez pas aux noms, la différence entre les 5 est la taille des ''sprites'' stocké dedans. Les ''sprites'' des avatars sont de 8 pixels de large, peuvent être dupliquées ou étendus. La balle est un ''sprite'' de même couleur que l'arrière-plan, de 1, 2, 4 ou 8 pixels de large. Les deux missiles sont identiques à la balle, sauf qu'ils ont la même couleur que le ''sprite'' du joueur associé. Un ''sprite'' matériel sur le TIA est codé sur un octet. Un ''sprite'' fait 8 pixels de large, chacun étant là-encore codé sur 1 bit. Il indique encore une fois si le pixel a la couleur de fond ou une couleur spécifique au ''sprite''. Vu que cet octet écrit une ligne du ''sprite'', il est changé à chaque ligne pour réellement afficher un ''sprite'' à deux dimensions. Vous remarquerez que le ''sprite'' est codé sur un octet, les informations de sa position X et Y à l'écran ne sont pas encodées. La raison est simple : un ''sprite'' est affiché quand le processeur écrit l'octet dedans. L'affichage d'un ''sprite'' est donc commandé par le processeur et doit se faire au cycle d'horloge près. Le problème est que le processeur n'est pas précis au pixel près. Déjà, sa fréquence est égale à un tiers de la fréquence du TIA, ce qui fait qu'il est précis à 3 pixels près. De plus, le logiciel faisait l'écriture dans le registre de ''sprite'' est basé sur une boucle, dont les instructions prennent 5 cycles pour s'exécuter. Ce qui fait une imprécision de 15 cycles. Pour compenser ce défaut, le TIA incorpore deux registres, un par avatar/''player''. Ils permettent de décaler le ''sprite'' de quelques pixels, la valeur de décalage étant précisée dans ce registre. La valeur est un entier allant de -7 à 8 cycles/pixels. L'affichage d'un ''sprite'' est donc en deux temps : on déclenche une écriture précise à 15 cycles près, puis on décale le ''sprite'' avec ces deux registres. ===L'architecture du TIA=== Mettre à jour les registres du TIA à chaque ligne n'est pas si différent de modifier une mémoire vidéo entre deux lignes. Mais un défaut des consoles ATARI est que le processeur n'utilisait pas d'interruptions pour gérer l'affichage des lignes. À la place, le bus indiquait au processeur quand le TIA acceptait qu'on modifie ses registres. Le bus avait un signal RDY (READY) qui indiquait si le TIA était occupé à afficher une ligne ou non. Un autre défaut est que le TIA ne génère pas totalement les signaux de synchronisation verticale, qui servent à indiquer à l'écran qu'il a fini d'afficher une image. La raison est qu'il n'a pas de compteur de ligne ! Il y a bien un compteur pour les colonnes, pour générer les signaux de synchronisation horizontale, mais pas plus. C'est le processeur qui doit générer le signal de synchronisation verticale de lui-même ! Pour cela, le processeur doit écrire dans une adresse dédie associée au TIA, ce qui déclenche un signal de synchronisation verticale immédiat. Si on devait faire un constat avec tout ce qui a été dit plus haut, il serait que le TIA est très simple, trop simple. Le processeur est très impliqué dans l'affichage à l'écran, notamment pour les ''sprites''. La carte graphique est donc composé par l'association entre le TIA et le processeur proprement dit, bien que celui-ci soit le CPU. Ce qui explique l'absence de mécanismes de synchronisation entre TIA et CPU : c'est le CPU qui commande le TIA au cycle près. ==Les VDC ANTIC et CTIA des consoles Atari post-2600== Les consoles Atari 8 bits, qui ont succédé à l'Atari 2600, n'utilisaient un VDC TIA amélioré appelé le CTIA pour sa première version (''Color Television Interface Adaptor''), le GTIA pour sa seconde version (''Graphic Television Interface Adaptor''). Les deux étaient un accélérateur de ''scanline'' qui intégraient l'accélération matérielle de ''sprites'' et une palette indicée. Comme pour le TIA, les ''sprites'' servaient pour les joueurs et des missiles, sauf que leur nombre est doublé pour passer à 4 chacun. Mais la révolution était qu'ils étaient associé à un autre circuit appelé l'ANTIC, qui commandait le CTIA/GTIA sans intervention du processeur CPU. Là où l'Atari 2600 utilisait le processeur pour l'affichage des ''sprites'' et beaucoup d'autres fonctions, une bonne partie de ces traitements est déléguées à l'ANTIC sur les machines suivantes. L'ANTIC est un ''blitter'' amélioré, en charge des copies en mémoire. Mais surtout, il s'occupe du séquencement des lignes envoyées au CTIA. Ce n'est pas le processeur qui s'occupe d'envoyer les lignes une par une au CTIA, cette fonction est déportée sur l'ANTIC. ===La ''display list''=== Le fonctionnement de l'ANTIC est assez complexe, mais on peut le voir comme une sorte de pseudo-processeur, qui exécute un programme de rendu 2D. Le programme en question est une suite d’opération de rendu 2d à exécuter dans l'ordre, qui permet de calculer l'image ligne par ligne. Il est appelé la '''''Display List''''', et est stocké dans la mémoire de la console. L'ANTIC lit le programme instruction par instruction, grâce à un contrôleur DMA intégré dans l'ANTIC, qui contient un ''program counter'' interne à l'ANTIC. L'exécution d'une ''Display List'' sur l'ANTIC permet de décharger le processeur des tâches de rendu 2D, du moins dans une certaine mesure. Une instruction de la ''display list'' permet de calculer une ligne de l'écran, en précisant comment combiner les ''sprites'' et l'arrière-plan, tous deux stockés dans la mémoire vidéo. La ''display list'' gére entre 0 et 240 instructions, ce qui limite la résolution verticale à 240 pixels. Les instructions peuvent se classer en quatre types principaux : des instructions pour écrire une ligne de pixels colorés, des instructions pour écrire une ligne de caractères, des instructions pour émettre les signaux de synchronisation de ''blanking'', et enfin des branchements qui agissent sur le ''program counter'' de l'ANTIC. Les instructions pour afficher des pixels/caractères peuvent activer le défilement horizontal ou vertical suivant l'instruction. Une instruction est codée sur 8 bits minimum. {| class="wikitable" |- ! Bit 7 !! Bit 6 !! Bit 5 !! Bit 4 !! Bit 3 !! Bit 2 !! Bit 1 !! Bit 0 |- | DLI || LMS || VS || HS || colspan="4" | Mode |} Les 4 bits de mode précisent quelle est l'instruction à utiliser, ce qui fait 16 instructions en tout, réparties dans les 4 classes mentionnées plus haut. Les bits HS et VS activent ou désactivent le défilement vertical et horizontal. Le bit LMS permet à l'instruction de préciser l'adresse où se trouvent les tableaux de données à utiliser, comme la place de l'arrière-plan en mémoire RAM, ce genre de choses. Pour cela, le bit est placé à 1 et l'adresse est dans les 2 octets qui suivent l'instruction. Le bit DLI gère les interruptions dites de ''Display List'', ou interruptions DLI, que nous allons voir dans ce qui suit. Les interruptions DLI sont l'équivalent sur l'ANTIC des interruptions d'''horizontal blanking'', déclenchées à la fin de l'affichage d'une ligne. Elles préviennent le processeur qu'une ligne entière a été affichée. Le processeur peut alors écrire en mémoire vidéo durant un court laps de temps s'il en a besoin. Il peut alors changer les ''sprites'' à la volée, ce qui permet d'afficher plus de ''sprites'' que ce que supporte le chip CTIA/GTIA. Les interruptions sont déclenchées pour certaines lignes seulement, celles où l'instruction qui affiche la ligne le précise. Si l'instruction a son bit DLI mis à 1, alors une interruption est déclenchée à la fin de la ligne. S'il est à 0, pas d'interruption. La gestion des interruptions DLI est donc totalement programmable. ===Les registres de configuration de l'ANTIC=== [[File:Atari ANTIC (CO12296) pin-out.svg|vignette|Atari ANTIC (CO12296) pin-out]] Niveau registres, l'ANTIC contient un ''program counter'' et de quoi configurer le contrôleur DMA. Il a aussi des registres pour localiser les données importantes en mémoire, qui sont regroupées dans des tableaux séparés. Pour ce qui est du rendu, il contient un registre pour l'adresse de l'arrière-plan, un autre pour l'adresse des ''sprites'' en mémoire RAM. Il contient aussi deux registres pour configurer le défilement horizontal et vertical. Pour gérer la synchronisation avec le CPU, l'ANTIC incorpore un compteur de ligne, ainsi qu'un registre de synchronisation horizontale qui est à 1 quand une ligne est en train d'être affichée (mécanisme redondant avec les interruptions DLI). Il y a aussi plusieurs registres pour gérer les interruptions, avec un registre de statut que le CPU peut lire à loisir pour savoir quelle est la raison qui a déclenché l'interruption, ainsi qu'un registre de configuration des interruptions. ==Le système graphique de la console néo-géo== La néo-géo est une console assez ancienne, de la période 16 bits, commercialisée en 1990. Elle avait pour caractéristique d'avoir le même hardware que les bornes d'arcade du même nom, les néo-géo MVS. Elle comprenait un processeur Motorola 68000, 64 kilooctets de mémoire RAM, un processeur sonore Zilog Z80, et un VDC avec 64 kilooctets de mémoire vidéo. Elle avait une palette de 65 536 couleurs, grâce à une palette indicée de 8 kilooctets. ===L'avant-plan, l'arrière-plan et les ''sprites'' de la néo-géo=== Un point important est que la mémoire vidéo n'est pas un ''framebuffer'', le VDC utilise un tampon de ligne. La console a pour particularité de ne pas gérer d’arrière-plan, l'image affichée est intégralement composée de ''sprites''. Les ''sprites'' sont tous combinés pour donner l'image finale. Un autre détail est que les ''sprites'' matériels sur la néo-géo sont différents des ''sprites'' matériels des consoles précédentes. Ils sont composés de plusieurs motifs, de plusieurs ''tiles''. Les motifs font tous des carrés de 16 pixels de côtés, contenant 15 couleurs (plus la couleur de transparence). Un ''sprite'' est un rectangle qui a un pixel de large, mais dont la hauteur va de 1 à 32 motifs, donc de 16 à 512 pixels. Chaque ''sprite'' indique quels sont ses motifs, quelle palette utiliser, s'il faut appliquer l'effet miroir, etc. Un ''sprite'' logiciel est composé en concaténant horizontalement plusieurs ''sprites'' de néo-géo. A défaut d'un arrière-plan, la console gère un pseudo-arrière-plan composé d'une couleur unie. Pour faire la différence avec une image d’arrière-plan, on peut plutôt parler d'une couleur de fond. Les ''sprites'' sont empilés les uns sur les autres au-dessus de cet arrière-plan. Au-dessus des ''sprites'', il y a un avant-plan spécialisé, qui est rendu au-dessus de tout le reste, qui est utilisé pour rendre le HUD. Cet avant-plan est appelé la ''fix layer'' dans la documentation de la console. Les motifs de l'avant-plan n'ont pas la même taille que pour les ''sprites'' : ce sont des carrés de 8 pixels de côtés, pas 16 ! Les motifs de l'avant-plan sont placés dans une mémoire ROM de celle pour les motifs des ''sprites''. En effet, une cartouche de néo-géo contient plusieurs mémoires ROM : * une pour les motifs des ''sprites'' ; * une pour les motifs de l'avant-plan ; * une pour le programme à exécuter sur le processeur M68000 principal ; * une pour le programme à exécuter sur le processeur sonore Z80 ; * une pour les échantillons audio, la musique et le son du jeu. ===Le rendu d'une image=== Lors du rendu d'une ligne, la console détermine quels ''sprites'' sont affichés sur cette ligne, et les ''sprites'' adéquats sont lus depuis la ROM de la cartouche. Les pixels de la ligne sont déterminés par le VDC et écrit dans le tampon de ligne. La console supporte au maximum 96 ''sprites'' par ligne, ce qui dépasse de très loin les capacités des autres consoles 8 ou 16 bits. La console dispose de deux tampons de lignes, ce qui permet d'afficher une ligne pendant qu'on prépare la suivante. L'idée est la suivante. La première ligne est placée dans un tampon de ligne, elle est envoyée à l'écran pixel par pixel par le VDC. En même temps, le processeur écrit la prochaine dans le second tampon de ligne. Une fois la ligne totalement affichée, le VDC échange les deux tampons de ligne. La ligne suivante est déjà prête dans le second tampon de ligne, elle est envoyée à l'écran pixel par pixel, le premier tampon de ligne est utilisé pour précalculer la ligne suivante, et ainsi de suite. La gestion de la profondeur des ''sprites'' est assez simple : les ''sprites'' sont placés dans la mémoire vidéo selon leur profondeur. En clair, les ''sprites'' situés au fond de l'image sont placés au début de la mémoire vidéo, ceux situés à l'avant-plan sont placés à la fin de la mémoire vidéo. Pas besoin po_ur le VDC de gérer les priorités et la profondeur des ''sprites'', tout est déjà réglé une fois les ''sprites'' chargés dans la mémoire vidéo. Le console gère une mise à l'échelle des ''sprites'' matériels, mais ceux-ci ne peuvent qu'être réduits, pas zoomés. La mise à l'échelle est précise au pixel près. La mise à l'échelle peut se faire à l'horizontale et à la verticale, les deux sont séparés. Par exemple, on peut réduire un ''sprite'' d'un facteur 5 sur la verticale, d'un facteur 2 sur l'horizontale. {{NavChapitre | book=Les cartes graphiques | prev=Le mode texte et le rendu en tiles | prevText=Le mode texte et le rendu en tiles | next=Les Video Display Controler atypiques | nextText=Les Video Display Controler atypiques }} {{autocat}} rwh6kons5c3apj4jhf0sqz1v1evbyw6 Les cartes graphiques/Les cartes d'affichage des anciens PC 0 82725 764866 757942 2026-04-24T17:44:15Z Mewtow 31375 /* Le support des caractères japonais */ 764866 wikitext text/x-wiki Dans cette section, nous allons parler rapidement des cartes graphiques des anciens PC, qui étaient des systèmes à ''framebuffer''. Les standards graphiques sur PC étaient le MDA, le CGA, l'EGA et le VGA, dans l'ordre chronologique. C'était les standards les plus communs, qui ont été introduits par les cartes graphiques suivantes : * IBM Color/Graphics Display Adapter (CGA) * IBM Monochrome Display and Printer Adapter (MDA or sometimes MDPA) * IBM Enhanced Graphics Adapter with Graphics Memory Expansion Card (EGA) * IBM PS/2 Display Adapter (VGA) Le MDA et le CGA utilisaient des ''framebuffer'' compacts, alors que l'EGA et le VGA utilisaient des ''framebuffer'' planaires. Cependant, par souci de compatibilité, l'EGA et le VGA supportent les résolutions du CGA et du MDA, avec un ''framebuffer'' compact. La mémoire vidéo des cartes graphiques EGA et VGA pouvaient être utilisées soit de manière à avoir un ''framebuffer'' planaire ou compact, elle servait pour les deux. Les cartes graphiques concurrentes étaient la ''Hercules Graphics Card'', la ''Tandy Video II Graphic Adapter'', la ''Multi-Color Graphics Array'' (MCGA) et quelques autres. Mais elles étaient peu disponibles et eurent peu de succès, à l'exception de la carte Hercules qui a été supportée dans quelques jeux vidéo. ==Les standards MDA et CGA== Les tout premiers IBM PC, utilisaient la carte graphique ''IBM Monochrome Display Adapter'' (MDA), qui était toujours connectée à un écran ''5151 IBM PC Display'', que nous appellerons IBM 5151 dans ce qui suit. La carte CGA (''Color Graphics Adapter'') étaient disponibles en même temps que la carte MDA, mais les écrans CRT qui pouvaient utiliser ses fonctionnalités ont mis un peu de temps avant d'arriver, ce qui fait qu'on considère parfois à tort que la carte MDA est arrivée avant la CGA. La carte MDA ne gérait que le mode texte, en monochrome, alors que la carte CGA gérait jusqu'à 16 couleurs avec un système de palette indicée. {|class="wikitable" |+ Modes CGA officiels ! colspan="2" | Modes graphiques |- | 320 par 200 pixels || 4 couleurs par pixel |- | 640 par 200 pixels || 2 couleurs par pixel |- ! colspan="2" | Modes texte |- | 320 par 200 pixels || 40 par 25 caractères |- | 640 par 200 pixels || 80 par 25 caractères |} Les cartes MDA et CGA avaient un hardware très semblable vu de loin. La carte MDA incorporait 4 kilo-octets de RAM vidéo, la carte CGA en avait 16 kilo-octets. Les deux incorporaient un VDC Motorola 6845, qui ne gérait que le mode texte. Les cartes CGA (''Color Graphics Adapter'') ont trouvé un moyen de supporter le mode graphique avec ce VDC, grâce à des circuits qui entouraient le VDC. Beaucoup de bidouilles étaient nécessaires pour lui faire afficher des graphismes pixel par pixel. Il était possible d'utiliser une carte MDA en complément d'une carte CGA, dans le même PC. Les deux pouvaient être utilisées pour alimenter deux écrans : un écran monochrome pour la MDA et un écran couleur pour la CGA. Mais elles pouvaient aussi être utilisées pour alimenter un seul écran, la carte CGA se chargeant des calculs graphiques et la MDA pour afficher du texte. Les alternatives aux cartes MDA/CGA étaient assez nombreuses. La quasi-totalité utilisait cependant le même VDC et un hardware très similaire. On parlait d'ailleurs de clones MDA/CGA. Elles se contentaient souvent d'ajouter des fonctionnalités, plus de mémoire vidéo, etc. Par exemple, la carte Hercules était totalement compatible avec la carte MDA, si ce n'est pour l'ajout d'un mode de résolution graphique capable de faire du pixel par pixel. Il y a cependant quelques exceptions comme la ''Professional Graphics Controller'' qui intégrait un processeur Intel 8088 en guise de VDC. Une description détaille des cartes CGA, avec leurs registres de configuration, est disponible via ce lien. Je n'en conseille pas la lecture maintenant : * [https://nerdlypleasures.blogspot.com/2016/05/ibms-cga-hardware-explained.html IBM's CGA Hardware Explained] ==Le standard EGA== Par la suite, les cartes graphiques MDA et CGA ont été remplacées par les cartes EGA. De nombreuses cartes graphiques sensiblement identiques à l'EGA, des clones hardware, ont envahi le marché, transformant l'EGA en standard de facto. Elles géraient entre 4 et 16 couleurs, suivant la résolution, avec un système de palette indicée. Les cartes EGA ont remplacé le ''framebuffer'' compact des anciennes cartes MDA/CGA par un ''framebuffer'' planaire. La mémoire vidéo de la carte EGA était composée de 4 banques, chaque banque étant un ''bitplane''. En clair, les modes gérant 16 couleurs codaient un pixel sur 4 bits, avec un bit par ''bitplane''/banque. Cependant, la résolution 640 par 350 pixels n'utilisait que deux couleurs et utilisait un ''framebuffer'' compact. Le choix entre un ''framebuffer'' planaire et compact était réalisé en configurant un bit dans le registre de configuration adéquat, à savoir le registre ''Sequencer Memory Mode Register '', faisant partie du ''Sequence Controller''. Le bit nommé Chain 4 Bit valait 0 pour un ''framebuffer'' planaire, 1 pour un ''framebuffer'' compact. {|class="wikitable" |- ! Résolution !! Couleurs par pixel || Framebuffer |+ Modes EGA |- | 320 par 200 pixels || 16 couleurs par pixel || rowspan="3" | ''framebuffer'' planaire |- | 640 par 200 pixels || 16 couleurs par pixel |- | 640 par 350 pixels || 16 couleurs par pixel |- ! colspan="3" | Mode nécessitant la carte d'extension mémoire |- | 640 par 350 pixels || 2 couleurs par pixel || ''framebuffer'' compact |} ===L'architecture d'une carte EGA=== Une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : le CRT Controller (CRTC), le Sequence Controller (SC), l'Attribute Controller (AC) et le Graphics Controller (GC). * Le CRTC est un CRTC basique mais ce n'est pas le MC6845 des cartes CGA/MDA, bien que la compatibilité entre eux soit garantie. * L'Attribute Controller est un RAMDAC amélioré. * Le ''Sequence Controller '' communique avec le RAMDAC et le CRTC pour accéder à la mémoire vidéo. * Le circuit restant, le ''Graphics Controller'', sert d'interface entre le bus et la mémoire vidéo. Les quatre composants précédents sont collés entre eux par un paquet de circuits qui servent d'interface entre eux. Une carte EGA contient de nombreux registres, multiplexeurs et autres circuits. Voici ce que donne l'ensemble en schéma : [[File:EGA-Karte.svg|centre|vignette|upright=2|Carte EGA.]] Les cartes EGA intégraient 64 kilo-octets de mémoire vidéo sur la carte elle-même, mais on pouvait ajouter une seconde carte d'extension pour passer à 256 kilo-octets. Certaines résolutions ne fonctionnaient que si cette carte d'extension mémoire était présente. ===Le multi-GPU EGA/CGA=== Les cartes EGA pouvaient fonctionner de concert avec une seconde carte CGA, MDA ou Hercules. Un PC de l'époque pouvait avoir une carte EGA sur un port d'extension, et une carte MDA/CGA sur un autre. Quand une carte CGA est installée, la carte EGA ne fonctionne qu'en mode monochrome. Par contre, quand la seconde carte est une carte MDA ou Hercules, la carte EGA ne fonctionne qu'avec les résolutions à 4 ou 16 couleurs. En clair, elle prend en charge l'affichage monochrome avec les cartes CGA (polychromes), coloré avec les cartes MDA monochromes. L'utilisation d'une carte EGA avec une autre carte MDA/CGA s'explique par une histoire d'entrée-sorties mappées en mémoire. Pour rappel, des adresses mémoires, censées adresser la mémoire RAM, sont détournées pour adresser la mémoire vidéo. Il en est de même pour les registres de configuration de la carte graphique : des adresses mémoire sont détournées pour pointer vers ces registres. Si on regarde l'ensemble des adresses gérées par le processeur, certaines pointent vers la RAM, d'autres vers la carte graphique, d'autres vers des périphériques, d'autres vers le BIOS, etc. Les cartes EGA et les cartes MDA/CGA détournent des adresses différentes. La mémoire des PC de l'époque était découpée en blocs de 64 kilo-octets, que le système d'exploitation DOS allouait comme suit : {| class="wikitable" style="text-align:center;" |+ Espace d'adressage en mode réel |- ! Numéro du bloc !! Contenu du bloc |- | 0 || rowspan="10" class="f_rouge" | Mémoire RAM, mémoire conventionnelle |- | 1 |- | 2 |- | 3 |- | 4 |- | 5 |- | 6 |- | 7 |- | 8 |- | 9 |- | 10 || class="f_vert" | Mémoire vidéo des cartes EGA |- | 11 || class="f_vert" | Mémoire vidéo des cartes MDA ou CGA |- | 12 || class="f_vert" | ROM d'extension des périphériques (XT, EGA, 3270 PC) |- | 13 || class="f_gris" | Autre, non-réservé |- | 14 || class="f_gris" | Autre, non-réservé |- | 15 || class="f_jaune" | ROM du BIOS |} ==Le standard VGA== Le standard VGA fait suite au standard EGA et gère des résolutions jusqu'à 640 par 480. Il intègre aussi un support du ''double buffering'', à savoir qu'il gère deux ''framebuffers'' séparés. Mais le ''double buffering'' n'est possible que dans les basses résolutions, car il n'y a pas assez de mémoire vidéo pour les deux ''framebuffers'' dans les hautes résolutions. Le VGA intègre aussi d'autres fonctionnalités qui seront détaillées dans le chapitre suivant, notamment pour ce qui est du défilement horizontal/vertical. ===Les résolutions supportées par le VGA=== Le standard VGA décrit plusieurs '''modes de fonctionnement''', chacun correspondant à une résolution avec un nombre de couleur associé. Ils sont numérotés en hexadécimal, les modes 1 à 16 (0xFh) correspondent aux résolutions supportées par les cartes MDA, CGA et EGA, les quatre modes restants sont spécifiques au VGA. D'autres modes non-standards sont supportés par la majorité des cartes VGA, comme le mode X, un mode non-officiel qui définit une résolution de 320 par 240 pixels, avec 256 couleurs par pixel. Suivant le mode utilisé, le ''framebuffer'' sera soit de type compact, soit de type planaire ! Les modes gérant 256 couleurs par pixel utilisent un ''framebuffer'' compact, avec un octet par pixel. Par contre, les modes 16 couleurs codent un pixel sur 4 bits, ce qui colle mieux avec un ''framebuffer'' planaire à quatre ''bitplanes''. Les modes 16 couleurs sont surtout utilisés avec des résolutions élevées, alors que les modes 256 utilisent des résolutions basses, pour des raisons de mémoire vidéo. Par exemple, une résolution de 640 par 480 fait qu'une image contient 307 200 pixels, ce qui prend au minimum 300 kilo-octets en mode 256 couleurs ! Or, les cartes graphiques VGA disposaient de seulement 256 kilo-octets de mémoire vidéo. Vous devinez que la carte graphique ne supportait pas 256 couleurs par pixels dans cette résolution, mais qu'elle codait un pixel sur moins d'un octet. Le mode le plus utilisé est le mode 13h, d'une résolution de 320 par 200 pixels pour 256 couleurs par pixel. Il a été utilisé par la grosse majorité des jeux vidéos de l'époque, car son ''framebuffer'' compact était beaucoup plus pratique pour les programmeurs, malgré des performances moindres que les autres modes VGA. Quelques jeux vidéos ont cependant utilisé le mode 11h avec son ''framebuffer'' planaire, comme l'a fait DOOM 1 et sa suite DOOM 2. Cependant, les autres jeux basés sur le même moteur utilisaient le mode 13h, l'exemple typique étant celui des FPS Heretic et Hexen de Raven Software. {|class="wikitable" |- ! Mode !! Résolution !! Couleurs par pixel || Framebuffer |+ Modes principaux |- ! mode 10h | 640 par 350 pixels || 4 à 16 couleurs par pixel (dépend de la RAM vidéo installée) || ''framebuffer'' planaire |- ! mode 11h | 640 par 480 pixels || Monochrome, 2 couleurs par pixel || ''framebuffer'' planaire |- ! mode 12h | 640 par 480 pixels || 16 couleurs par pixel || ''framebuffer'' planaire |- ! mode 13h | 320 par 200 pixels || 256 couleurs par pixel || ''framebuffer'' compact |} ===L'organisation du ''framebuffer''=== La mémoire vidéo fait 256 kilo-octets, répartis dans 4 mémoires RAM de 64 kibioctets chacune. En mode ''framebuffer'' compact, un pixel fait un octet. Chaque octet d'une banque correspond à un pixel. {|class="wikitable" |+ VGA en mode ''framebuffer'' compact/linéaire |- ! Octet banque 1 | Pixel 1, codé sur 8 bits |- ! Octet banque 2 | Pixel 2, codé sur 8 bits |- ! Octet banque 3 | Pixel 3, codé sur 8 bits |- ! Octet banque 4 | Pixel 4, codé sur 8 bits |} Avec un ''framebuffer'' planaire, les pixels sont codés sur 4 bits. Idéalement, chaque ''bitplane'' doit être une mémoire bit-adressable, à savoir que chaque adresse mémoire sélectionne un bit. Mais il s'agit là d'un cas idéal que les cartes VGA en respectaient pas. A la place, chaque ''bitplane'' est une mémoire adressable par octet, et non par bit. Heureusement, elles intégraient des circuits pour simuler une mémoire bit-adressable à partir d'une mémoire adressable par octet. Les quatre banques sont accessibles en parallèles, ce qui permet de lire/écrire 4 octets en même temps, un octet par banque. Dans le mode ''framebuffer'' planaire, les 4 octets lus sont découpés en 8 pixels de 4 bits d'un coup. Le DAC situé en aval de la mémoire vidéo recevait 8 pixels de 4 bits chacun, et mémorisait le tout dans une petite mémoire tampon. Il fournissait, en sortie un pixel par cycle d'horloge. Une seule lecture dans la mémoire vidéo permettait au DAC d'afficher 8 pixels pour une seule lecture en mémoire vidéo. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 | 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 |- ! Octet banque 2 | 1 || 1 || 1 || 1 || 1 || 0 || 1 || 1 |- ! Octet banque 3 | 0 || 1 || 1 || 1 || 0 || 0 || 0 || 0 |- ! Octet banque 4 | 0 || 0 || 1 || 0 || 1 || 0 || 1 || 1 |} ===Le registre intermédiaire : les VGA ''latches''=== Pour gérer au mieux les lectures et écritures, une carte VGA intègre un '''registre intermédiaire''' de 32 bits qui sert d'intermédiaire pour les lectures et écritures. Lors d'une lecture, un octet est lu dans chaque ''bitplane'' et les 4 octets lus sont alors enregistrés dans ce registre intermédiaire. Là, les 32 bits sont alors soit envoyé au RAMDAC pour être affichés à l'écran, soit envoyés au processeur lors d'une lecture. [[File:VGA, lecture dans la mémoire vidéo.png|centre|vignette|upright=2|VGA, lecture dans la mémoire vidéo]] Pour les écritures, le registre intermédiaire est utilisé pour diverses opérations. Par exemple, supposez que le programmeur ne veut modifier qu'un seul pixel codé sur 4 bits. Dans ce cas, il doit lire 32 bits, ne modifier que le pixel dans ces 32 bits, et écrire le résultat en mémoire vidéo. Les bits à modifier sont précisés dans un '''registre de masque''', le ''Bit Mask Register''. Il fait 32 bits, soit la même taille que le registre intermédiaire, et chaque bit du registre de masque correspond à un bit du registre intermédiaire. Si le bit en question est à 1, le bit à écrire provient du registre intermédiaire. Sinon, il vient du pixel envoyé par le CPU. Pour appliquer le masque, le registre intermédiaire est complété par un '''circuit de masquage''', qui permettent de ne modifier que certains bits dans les 32 bits. Le circuit de masquage est concrètement un ensemble de multiplexeurs qui permettent de choisir, pour chaque bit à écrire dans une ''bitplane'', s'il vient du registre intermédiaire, ou des données envoyées par le processeur. Les multiplexeurs sont commandés par un registre de masque. Le VGA fournit deux modes de lecture et quatre modes d'écriture. Pour les écritures, il y a quatre modes nommés mode 0, 1, 2 et 3, que nous détaillerons dans la suite. L'utilisation des circuits de masquage dépend du mode d'écriture. Pour simplifier, il y a trois cas distincts. * Dans le mode d'écriture numéro 0, le processeur envoie un nouveau pixel par cycle. Le masque est mémorisé dans un registre et est stable d'une écriture sur l'autre. Il s'agit du fonctionnement intuitif, où le processeur écrit dans le ''framebuffer''. * Dans le mode d'écriture numéro 3, c'est l'inverse. Le processeur envoie un nouveau masque par cycle, alors que le pixel à écrire est mémorisé dans un registre et reste le même d'une écriture sur l'autre. Ce mode sert à remplir une zone de l'écran avec une même couleur, que ce soit pour tracer des lignes, colorier une figure géométrique, remettre à zéro le ''framebuffer''. * Dans le mode d'écriture numéro 1, le circuit de masquage est configuré pour recopier le registre intermédiaire dans la RAM directement. Il sert pour les copies mémoire-mémoire, à savoir copier des données de la mémoire vidéo vers un autre endroit. [[File:Circuit de masquage du VGA.png|centre|vignette|upright=2.5|Circuit de masquage du VGA]] ===Les circuits annexes : ALU, SET/RESET et ''barrel shifter''=== Les circuits de masquage en question sont complétés par une petite unité de calcul 32 bits, séparée du circuit de masquage, qui gère les opérations logiques OR, AND, XOR. La différence est que le circuit de masquage combine un masque stocké dans un registre dédié avec le registre intermédiaire, alors que l'ALU combine les données envoyées par le CPU et le registre intermédiaire. Toute carte VGA permet aux écritures de n'écrire que dans certaines ''bitplanes''/banques et de laisser les autres tranquilles. Pour cela, il incorpore un registre de 4 bits, le ''Map Mask register'', qui indique quelles banques doivent être activées lors d'une écriture. Il y a un bit par banque, qui indique si elle est éteinte ou allumée lors d'une écriture, seules les banques allumées se font écrire dedans. Notons qu'avec cette technique, les ''bitplanes'' désactivées conservent les données précédentes. Ce n'est pas un problème si on souhaite appliquer des effets graphiques bien précis après avoir rendu une image complète dans le ''framebuffer'' planaire : on calcule une image, puis on applique l'effet en manipulant une ou deux ''bitplanes''. Mais cela pose problème dans d'autres situations. Si jamais une image a été rendue précédemment, ses pixels resteront dans les ''bitplanes''. Désactiver les écritures lors du rendu de l'image suivante donnera un mélange entre image précédente et image nouvelle. Pour éviter cela, il faut ajouter une fonctionnalité qui remet à 0 le ''framebuffer'', octet par octet. La remise à zéro en question peut effacer totalement le ''framebuffer'', à savoir les quatre ''bitplanes'', en remplissant ses octets avec la valeur 0000 0000. Il est aussi, possible de réinitialiser le ''framebuffer'' en mettant chaque octet à 1111 1111. Mais il est aussi intéressant de ne réinitialiser qu'une partie des ''bitplanes'', par exemple seulement une, deux ou trois ''bitplanes''. Pour cela, la carte VGA incorpore un '''circuit de SET/RESET''' avant l'ALU. Il agit sur les octets envoyés par le processeur et destinés aux ''bitplanes'', à savoir qu'il peut les mettre soit à 0000 0000, soit à 1111 1111, soit ne pas les modifier. La commande de ce circuit est réalisée par deux registres dédiés. Enfin, cartes VGA intègrent un ''barrel shifter'', qui fait des opérations de rotations sur l'octet envoyé par le processeur (les décalages ne sont pas supportés). Il était rarement utilisé pour aligner les données au pixel près, plutôt qu'à l'octet près. Mais il était peu utilisé, car le processeur sait faire ce genre d'opérations nativement. L'ALU et le ''barell shifter'' sont commandés par un registre unique, le ''Data Rotate register'', qui indique quelle opérations ils doivent faire. Le contenu de ce registre est découpés en deux champs : un qui dit au ''barell shifter'' de combien de rangs il faut rotater, et quelle opération l'ALU doit faire. ===Les modes d'écriture VGA=== La différence entre les modes d'écriture 0, 1, 2 et 3 tient à l'activation ou non des circuits de SET/RESET, de masquage, et autres. Le '''mode d'écriture 0''' est celui où tous les circuits sont utilisables. Ils ne sont pas forcément tous utilisés, mais peuvent l'être. Les données envoyées par le CPU sont rotatées (ou non), puis passent par le circuit de SET/RESET (qui peut ne rien faire), puis dans l'ALU pour être combinées avec le registre intermédiaire (qui peut simplement recopier l'octet qu'elle recoit), le résultat est masqué (ou non) et enregistré dans les ''bitplanes'' actives, certaines pouvant être désactivées. [[File:VGA latches.png|centre|vignette|upright=2.5|VGA latches]] Le '''mode d'écriture numéro 1''' est utilisé pour faire des copies en mémoire vidéo, de la mémoire vidéo vers elle-même. Ce mode d'écriture se contente de recopier le contenu du registre intermédiaire en mémoire vidéo, les octets envoyés par le processeur ne sont pas utilisés s'ils sont présents. On peut l'émuler à partir du mode 0 en configurant les circuits de masquage proprement. Il faut noter que le registre intermédiaire maintien une donnée indéfiniment et quelques jeux vidéos ou applications utilisaient cette propriété. Par exemple, cela permet de remplir un ''framebuffer'' avec un arrière-plan, avant de re-dessiner dessus. L'idée est d'écrire le motif d'arrière-plan en mémoire vidéo, de le lire pour charger le registre intermédiaire avec, et de lancer une série d'écriture en mode 1 pour recopier le motif dans les adresses mémoires voulues. [[File:VGA write mode 1.png|centre|vignette|upright=2.5|VGA write mode 1]] Le '''mode d'écriture numéro 2''' est lui un mode de remplissage. Il permet d'écrire une couleur dans plusieurs pixels consécutifs, dans un ''framebuffer'' planaire. Au lieu de modifier chaque pixel un par un, avec des opérations de masquage, l'idée est alors de modifier plusieurs pixels consécutifs en une seule fois. On peut modifier jusqu'à 8 bits consécutifs en mémoire vidéo, vu que les ''bitplanes'' sont des mémoires adressables à l'octet. C'est très utile pour remplir le ''framebuffer'' avec une couleur par défaut, pour le réinitialiser/effacer, ou encore pour tracer des segments/lignes horizontales ou diagonales, par exemple. Dans ce mode d'écriture, les circuits de SET/RESET sont au premier plan. Pour comprendre pourquoi, regardons ce qui se passe quand on écrit une même couleur dans 8 pixels consécutifs. Pour simplifier, on part du principe que les 8 pixels sont tous dans le même octet, on dit qu'ils sont alignés sur un octet. La couleur écrite est codée naturellement sur 4 bits, et vaut 0101. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 2 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |- ! Octet banque 3 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 4 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |} On voit que chaque bit du pixel a été recopié à l'identique dans un octet. Les octets écrits dans le ''framebuffer'' planaire valent donc soit 0000 0000, soit 1111 1111. Vous aurez deviné que c'est un cas parfait pour utiliser les circuits de SET/RESET, qui fournissent naturellement les octets 0000 0000 et 1111 1111 sur leur sortie. En clair, chaque bit d'un pixel commande l'octet envoyé sur la ''bitplane'' correspondante. Par exemple, si le bit de poids faible vaut 0, alors l'octet à écrire dans la ''bitplane'' associée vaut 0000 0000. Pour le dire autrement, l'octet envoyé par le processeur, le pixel envoyé, commande des circuits de SET/RESET : ses 4 bits de poids faible indiquent quels ''bitplanes'' sont à mettre à 0000 0000 et celles à mettre à 1111 1111. Les octets mis à 0000 0000 ou 1111 1111 passent ensuite dans l'ALU et les circuits de masquage et sont enregistrés dans les ''bitplane'' actives. Les circuits de masquage sont actifs au cas où certaines zones de l'image ne doivent pas être remplies avec le pixel. Par exemple, imaginez qu'on souhaite remplir un carré avec une couleur par défaut, en utilisant le mode d'écriture 2. Dans ce cas, le masque désigne quels pixels sont dans le carré et ceux en-dehors. [[File:VGA write mode 2.png|centre|vignette|upright=2.5|VGA write mode 2]] Le '''mode d'écriture numéro 3''' est lui aussi utile pour faire du remplissage ou pour tracer des lignes, mais aussi pour écrire du texte transparent. Son principe est le suivant : on écrit une couleur par défaut dans le ''framebuffer'' dans certains pixels seulement, un masque décrit quels bits/pixels modifier pour ne pas effacer ce qui doit l'être. La différence est qu'avec le mode 3, chaque octet provenant du processeur est un nouveau masque à appliquer. Le mode 2 précise la couleur des pixels à modifier avec un masque préconfiguré, le mode 3 précise quel masque utiliser avec une couleur par défaut préconfigurée. Là-encore, les circuits de SET/RESET sont programmés pour dessiner une couleur par défaut. Sauf que cette fois-ci, la couleur est précisée en configurant les registres adéquats, elle n'est pas fournie par l'octet provenant du processeur. Là encore, les circuits de masquage permettent de choisir entre ce qui est déjà dans le ''framebuffer'' planaire, et la couleur par défaut. La différence est que le masque est fournit par l'octet envoyé par le processeur. Pour donner un exemple d'utilisation, prenez le cas où on veut écrire du texte au-dessus d'une image déjà calculée dans le ''framebuffer''. L'écriture du texte se fait caractère par caractère, chaque caractère étant un octet envoyé par le processeur à la carte VGA. Le processeur lit d'abord les pixels sur lesquels écrire le caractère, afin de les copier dans le registre intermédiaire. Puis, il écrit le caractère avec le mode 3 : le calcul du masque donne les pixels à modifier. [[File:VGA write mode 3 simplifié.png|centre|vignette|upright=2.5|VGA write mode 3 simplifié]] Précisons cependant que le masque n'est pas l'octet envoyé par le processeur. A la place, le masque est calculé en prenant le masque présent dans le registre de masque, puis en faisant un ET logique avec l'octet envoyé par le processeur. L'octet est potentiellement rotaté avant, pour l'aligner au pixel près, mais c'est facultatif. [[File:VGA write mode 3.png|centre|vignette|upright=2.5|VGA write mode 3]] ===Les modes de lectures VGA=== Pour la lecture deux modes sont possibles : un plutôt associé à un ''framebuffer'' planaire, le second adapté à un ''framebuffer'' compact. Le premier mode de lecture, le '''''read mode 0''''' lit les octets d'une ''bitplane'' un par un. La ''bitplane'' en question est sélectionnée en configurant deux bits du ''Read Map register'' : 2 bits, 4 valeurs, 4 ''bitplanes''. Le processeur configure ce registre et peut adresser la ''bitplane'' directement. Par contre, il n'accède qu'à une ''bitplane'' à la fois. Lire un pixel entier demande de changer de ''bitplane'' quatre fois de suite, ce qui a un cout en performance très important. Le cout pour lire 8 pixels est le même, ce qui amorti la situation, mais sans faire de miracles. Idéalement, il faudrait un mode de lecture qui simule un ''framebuffer'' compact, par exemple un mode qui permette de lire un pixel en allant piocher dans les 4 ''bitplanes'', voire un mode qui permette de lire 8 pixels d'un seul coup. Mais les cartes VGA ne fournissent pas de mode de lecture aussi pratique. Par contre, ils ont un mode plus limité, appelé le '''''read mode 1'''''. Il lit 8 pixels dans un ''framebuffer'' planaire et les compare à une couleur de référence, stockée dans le registre '' Color Compare Register''. Le résultat est un groupe de 8 bits, chacun stockant le résultat de la comparaison pour un pixel. Lors de la comparaison, il est possible de désactiver des ''bitplanes''. Un registre, le ''Color Don’t Care register'', permet de configurer quelles ''bitplanes''a activer ou désactiver. Il contient un bit par ''bitplane'', qui permet d'activer la ''bitrplane'' s'il est à 1, la désactiver s'ils est à 0. ===Le RAMDAC des cartes VGA=== Les cartes VGA utilisent un système de palette indicée et fournissent en sortie une couleur analogique. Pour cela, elles incorporent une mémoire SRAM pour mémoriser la palette indicée, ainsi qu'un convertisseur numérique vers analogique pour traduire le tout en signaux analogiques pour l'écran. Les deux circuits sont regroupés en un seul, dans un circuit unique appelé un RAMDAC, pour rappel. Le RAMDAC d'une carte VGA est cependant plus complexe qu'un RAMDAC normal, et ce pour une raison simple : le nombre de couleurs dépend de la résolution. Il est de 2, 4, 16, 256 couleurs. Les résolutions à 2, 4 et 16 couleurs sont gérés à par du mode 256 couleurs, et une partie est liée à la compatibilité EGA. Pour commencer, regardons d'abord le mode 256 couleurs. Dans ce mode, la mémoire vidéo fournit un octet, qui indique quelle couleur afficher. L'octet est alors envoyé à un RAMDAC principal, qui convertit cette couleur 8 bits en signaux analogiques RGB. La conversion se fait en deux temps. La première étape est le passage par une palette indicée, qui traduit l'octet en entrée en une couleur codée sur 18 bits : 6 bits pour le rouge, 6 pour le vert, 6 pour le bleu. La SRAM de la palette indicée prend un octet sur l'entrée d'adresse et contient 256 registres de 18 bits. Les 18 bits sont alors envoyés aux circuits de conversion analogique, pour obtenir la couleur finale. Il y a donc un '''RAMDAC 8 bits''', qui sert de RAMDAC principal. La gestion des modes 2, 4, 16 couleurs se fait en utilisant le RAMDAC 8 bits. Avec ces modes, la couleur est codée sur 4 bits, et est lue depuis un ''framebuffer'' planaire. Les 4 bits sont alors étendus pour passer vers 8 bits, qui sont ensuite envoyés au RAMDAC 8 bits. La conversion vers l'analogique se fait donc en deux étapes : une première étape traduit un pixel de 4 bits en un octet, la seconde étape prend cet octet et le transforme en signaux analogiques. Le passage de 4 à 8 bits se fait en gardant la compatibilité avec les résolutions des cartes EGA, qui utilisaient une palette indicée spécifique. Les cartes EGA avaient une palette indicée très simple, qui contenait 16 registres, chacun contenant une couleur codée sur 6 bits. Elle prenait en entrée un pixel codé sur 4 bits, qui adressait un des 16 registres de couleur. Il est possible d'émuler ce système en envoyant les 4 bits du pixels directement dans le RAMDAC 8 bits, en remplacant les 4 bits de poids fort manquant par des zéros. Une solution alternative découpe la palette de 256 couleurs du RAMDAC en 16 sous-palettes de 16 couleurs. Les 4 bits de poids fort décident quelle sous-palette utiliser, les 4 de poids fiable sélectionne une couleur dans la palette choisie. Les 4 bits pour sélectionner la palette proviennent du d'un registre appelé le ''Color Control Register'' [[File:RAMDAC des cartes VGA en mode 16 couleurs pures.png|centre|vignette|upright=2|RAMDAC des cartes VGA en mode 16 couleurs pures]] Néanmoins, il s'agit d'une émulation de la palette EGA. Les cartes VGA gérent un mode de compatibilité EGA avec un système de ''color paging'' qu'on va décrire ci-dessous. Les cartes VGA conservent la palette EGA, ce qui fait qu'il y a une première phase qui transforme un pixel en 6 bits, ce qui permet de coder 64 couleurs différentes. Pour obtenir l'octet à envoyer au RAMDAC 8 bits, les cartes VGA rajoutent deux bits à la couleur EGA, qui proviennent du ''Color Control Register''. Pour implémenter les deux modes d'écrit plus haut, les cartes VGA se débrouillent avec le système suivant. Les 4 bits de poids faible proviennent de la platte indicée, toujours. Les deux bits de poids fort proviennent du ''color control register''. Les deux bits entre les deux viennent soit du ''color control register'', soit de la palette EGA, un MUX choisit entre les deux. Le choix entre les deux dépend du bit 7 du registre de configuration ''AC Mode Register''. Dans le cas où les deux bits de poids fort sont remplacés par le ''color control register'', la palette du RAMDAC est découpée en 16 palettes indicées de 4 bits. [[File:RAMDAC des cartes VGA.png|centre|vignette|upright=2|RAMDAC des cartes VGA]] ===Le mode écran divisé (''splitscreen'')=== Les cartes VGA incorporent des optimisations pour supporter l'affichage en '''''splitscreen''''', appelé en français affichage en "écran divisé", ou affichage divisé. Le standard VGA ne supportait qu'un affichage divisé simple : l'écran était coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'était pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans était configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Dans le chapitre "Les systèmes à framebuffer", nous avions vu comment un ''splitscreen'' de ce type est optimisé sur certains CRTC. Les cartes VGA utilisent des techniques similaires, mais avec cependant quelques différences. L'implémentation du ''splitscreeen'' demande d'avoir deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. Le standard VGA/EGA impose que le ''framebuffer'' de la moitié basse démarre à l'adresse zéro en mémoire vidéo. Le ''framebuffer'' pour la moitié haute est lui placé plus loin en mémoire vidéo. C'est contreintuitif, mais c'est en réalité tout à fait normal. L'idée se comprend bien quand on se rappelle de ceci : le CRTC parcours le ''framebuffer'' en partant d'une adresse de base, qui lui est fournie dans un registre dédié. Le parcours du ''framebuffer'' se fait grâce à l'aide de deux registres, un compteur de ligne et un compteur de colonne. Les trois registres sont utilisés pour calculer l'adresse du pixel à afficher. L'idée est que quand la ligne de démarcation est atteinte, les trois registres sont réinitialisés, ils sont tous trois mis à zéro. Ce qui fait re-démarrer l'affichage à partir de l'adresse zéro. Et cela implique que la moitié basse de l'écran commence à l'adresse 0. La moitié haute doit donc être placée plus loin en mémoire, assez loin pour laisser assez de place à la moitié basse. La ligne de démarcation est censée être mémorisée dans un registre de ''splitscreen'', qui indique à quelle ligne il faut commuter de ''framebuffer''. Mais les cartes EGA et VGA n'ont pas de registre dédié pour. A la place, les différents bits de ce registre sont dispersés dans plusieurs registres séparés. Les cartes EGA utilisaient une valeur de 9 bits dispersée dans deux registres : les bits 7 à 0 sont dans le ''Line Compare register'' (''CRTC register 18H''), le 9ème bit est dans le registre ''Overflow register'' (''CRTC register 7''). Les cartes VGA rajoutent un 10ème bit, qui est dans le registre ''Maximum Scan Line register'' (''CRTC register 9''). Toute modification de ces registres a un effet immédiat, contrairement à une modification de la plupart des autres registres du CRTC. Le support du ''splitscreen'' était présent pour toutes les résolutions officielles, mais quelques cartes VGA le supportaient aussi pour les résolutions non-officielles. Il fonctionne aussi en mode texte ! En mode texte, le passage d'une moitié d'écran à l'autre a le bon ton d'ajouter un saut de ligne automatique, ce qui fait que le texte du second écran reprend au bon endroit, au tout début d'une ligne. Pour cela, le compteur de ligne est réinitialisé à zéro. ==Le PC-98 de NEC== Les ordinateurs PC-98 sont une gamme d'ordinateurs japonais qui a grandement évolué dans le temps. Ils s'inspiraient grandement des PC IBM et étaient centrés autour d'un processeur x86. Le standard IBM PC était globalement respecté sur les PC-98 et le PC_98 tournait sur MS-DOS, mais il y avait cependant de nombreuses différences avec les PC x86. La carte d'affichage était totalement différente, le bus ISA était remplacé par un C-bus, le BIOS était différent, les adresses des périphériques étaient différentes, etc. Les PC-98 ont été déclinés en plusieurs versions, chacune ayant un processeur de plus en plus puissant, plus de mémoire RAM, plus de mémoire vidéo, etc. La première génération utilisait un processeur x86 8086 d'Intel, c'était celle du PC-9801. La seconde génération a démarré avec le PC-9801VM. Leurs capacités graphiques étaient différentes, comme on va le voir. ===Le support des caractères japonais=== Le support des caractères japonais demande beaucoup de contraintes. Afficher des Kanjis demande d'utiliser une mémoire de caractère très grosse, capable de mémoriser plusieurs centaines ou milliers de caractères, dont des Kanjis, hiragana et katakana. Concrètement, la mémoire de caractère des PC-98 mémorisait près de 700 caractères, qui suivaient les standards JIS X 0201 et JIS X 0208. De plus, afficher des kanjis demande d'utiliser des hautes résolutions, au moins 640 par 400, pour que les kanjis soient lisibles. La mémoire vidéo devait être compatible avec de tells résolution. Sur les PC_98, la mémoire vidéo faisait entre 12 et 256 kilo-octets, ce qui était beaucoup pour l'époque, mais était nécessaire pour supporter les hautes résolutions. <noinclude>[[File:Charset.gif|centre|vignette|upright=2|Charset contenant des caractères Japonais, en basse résolution. Différent de celui du PC_98.]]</noinclude> ===Le double rendu texte-graphique=== [[File:PC-9801VM memory map.svg|vignette|upright=0.75|PC-9801VM memory map]] Le ''framebuffer'' graphique était de type planaire et intégrait 4 ''bitplanes'', comme le VGA. A partir du PC-9801VM ajoutait de quoi lire/écrire en parallèle dans plusieurs ''bitplanes'', grâce à l'ajout d'un circuit nommé ''Graphics Charger''. C'est aussi à partir de ce modèle que la mémoire de caractère et une palette indicée reconfigurable ont été ajoutés. Le PC-9801VX améliora le ''Graphic Charger'' pour ajouter un ''blitter''. En général, une carte d'affichage fonctionne soit en mode texte, soit en mode graphique, pas les deux. Les ordinateurs de la gamme PC-98 permettaient de fusionner les deux. Pour cela, ils étaient structurés autour de deux VDC NEC μPD7220 : un qui fonctionnait en mode texte, un autre en mode graphique. Les deux VDC lisaient dans des mémoires vidéos séparées. Le VDC fonctionnant en mode graphique était relié à une mémoire vidéo dédiée, le VDC en mode texte était quant à lui relié à une ''text RAM'' qui servait de tampon de texte. La ''text RAM'' faisait entre 8 et 12 kilo-octets, suivant les modèles, alors que la mémoire vidéo faisait 96, 192 ou 256 kilo-octets. Le ''framebuffer'' était d'abord rendu en mode graphique, et le second VDC pouvait superposer du texte au-dessus. [[File:N88-BASIC(86) color text with graphics.png|centre|vignette|upright=2|Rendu graphique sur les PC-98]] {{NavChapitre | book=Les cartes graphiques | prev=Les Video Display Controler atypiques | prevText=Les Video Display Controler atypiques | next=Le rendu d'une scène 3D : concepts de base | nextText=Le rendu d'une scène 3D : concepts de base }} {{autocat}} pm1fu9wte0azosa834clivxweru0lm8 764878 764866 2026-04-24T17:55:14Z Mewtow 31375 /* Le double rendu texte-graphique */ 764878 wikitext text/x-wiki Dans cette section, nous allons parler rapidement des cartes graphiques des anciens PC, qui étaient des systèmes à ''framebuffer''. Les standards graphiques sur PC étaient le MDA, le CGA, l'EGA et le VGA, dans l'ordre chronologique. C'était les standards les plus communs, qui ont été introduits par les cartes graphiques suivantes : * IBM Color/Graphics Display Adapter (CGA) * IBM Monochrome Display and Printer Adapter (MDA or sometimes MDPA) * IBM Enhanced Graphics Adapter with Graphics Memory Expansion Card (EGA) * IBM PS/2 Display Adapter (VGA) Le MDA et le CGA utilisaient des ''framebuffer'' compacts, alors que l'EGA et le VGA utilisaient des ''framebuffer'' planaires. Cependant, par souci de compatibilité, l'EGA et le VGA supportent les résolutions du CGA et du MDA, avec un ''framebuffer'' compact. La mémoire vidéo des cartes graphiques EGA et VGA pouvaient être utilisées soit de manière à avoir un ''framebuffer'' planaire ou compact, elle servait pour les deux. Les cartes graphiques concurrentes étaient la ''Hercules Graphics Card'', la ''Tandy Video II Graphic Adapter'', la ''Multi-Color Graphics Array'' (MCGA) et quelques autres. Mais elles étaient peu disponibles et eurent peu de succès, à l'exception de la carte Hercules qui a été supportée dans quelques jeux vidéo. ==Les standards MDA et CGA== Les tout premiers IBM PC, utilisaient la carte graphique ''IBM Monochrome Display Adapter'' (MDA), qui était toujours connectée à un écran ''5151 IBM PC Display'', que nous appellerons IBM 5151 dans ce qui suit. La carte CGA (''Color Graphics Adapter'') étaient disponibles en même temps que la carte MDA, mais les écrans CRT qui pouvaient utiliser ses fonctionnalités ont mis un peu de temps avant d'arriver, ce qui fait qu'on considère parfois à tort que la carte MDA est arrivée avant la CGA. La carte MDA ne gérait que le mode texte, en monochrome, alors que la carte CGA gérait jusqu'à 16 couleurs avec un système de palette indicée. {|class="wikitable" |+ Modes CGA officiels ! colspan="2" | Modes graphiques |- | 320 par 200 pixels || 4 couleurs par pixel |- | 640 par 200 pixels || 2 couleurs par pixel |- ! colspan="2" | Modes texte |- | 320 par 200 pixels || 40 par 25 caractères |- | 640 par 200 pixels || 80 par 25 caractères |} Les cartes MDA et CGA avaient un hardware très semblable vu de loin. La carte MDA incorporait 4 kilo-octets de RAM vidéo, la carte CGA en avait 16 kilo-octets. Les deux incorporaient un VDC Motorola 6845, qui ne gérait que le mode texte. Les cartes CGA (''Color Graphics Adapter'') ont trouvé un moyen de supporter le mode graphique avec ce VDC, grâce à des circuits qui entouraient le VDC. Beaucoup de bidouilles étaient nécessaires pour lui faire afficher des graphismes pixel par pixel. Il était possible d'utiliser une carte MDA en complément d'une carte CGA, dans le même PC. Les deux pouvaient être utilisées pour alimenter deux écrans : un écran monochrome pour la MDA et un écran couleur pour la CGA. Mais elles pouvaient aussi être utilisées pour alimenter un seul écran, la carte CGA se chargeant des calculs graphiques et la MDA pour afficher du texte. Les alternatives aux cartes MDA/CGA étaient assez nombreuses. La quasi-totalité utilisait cependant le même VDC et un hardware très similaire. On parlait d'ailleurs de clones MDA/CGA. Elles se contentaient souvent d'ajouter des fonctionnalités, plus de mémoire vidéo, etc. Par exemple, la carte Hercules était totalement compatible avec la carte MDA, si ce n'est pour l'ajout d'un mode de résolution graphique capable de faire du pixel par pixel. Il y a cependant quelques exceptions comme la ''Professional Graphics Controller'' qui intégrait un processeur Intel 8088 en guise de VDC. Une description détaille des cartes CGA, avec leurs registres de configuration, est disponible via ce lien. Je n'en conseille pas la lecture maintenant : * [https://nerdlypleasures.blogspot.com/2016/05/ibms-cga-hardware-explained.html IBM's CGA Hardware Explained] ==Le standard EGA== Par la suite, les cartes graphiques MDA et CGA ont été remplacées par les cartes EGA. De nombreuses cartes graphiques sensiblement identiques à l'EGA, des clones hardware, ont envahi le marché, transformant l'EGA en standard de facto. Elles géraient entre 4 et 16 couleurs, suivant la résolution, avec un système de palette indicée. Les cartes EGA ont remplacé le ''framebuffer'' compact des anciennes cartes MDA/CGA par un ''framebuffer'' planaire. La mémoire vidéo de la carte EGA était composée de 4 banques, chaque banque étant un ''bitplane''. En clair, les modes gérant 16 couleurs codaient un pixel sur 4 bits, avec un bit par ''bitplane''/banque. Cependant, la résolution 640 par 350 pixels n'utilisait que deux couleurs et utilisait un ''framebuffer'' compact. Le choix entre un ''framebuffer'' planaire et compact était réalisé en configurant un bit dans le registre de configuration adéquat, à savoir le registre ''Sequencer Memory Mode Register '', faisant partie du ''Sequence Controller''. Le bit nommé Chain 4 Bit valait 0 pour un ''framebuffer'' planaire, 1 pour un ''framebuffer'' compact. {|class="wikitable" |- ! Résolution !! Couleurs par pixel || Framebuffer |+ Modes EGA |- | 320 par 200 pixels || 16 couleurs par pixel || rowspan="3" | ''framebuffer'' planaire |- | 640 par 200 pixels || 16 couleurs par pixel |- | 640 par 350 pixels || 16 couleurs par pixel |- ! colspan="3" | Mode nécessitant la carte d'extension mémoire |- | 640 par 350 pixels || 2 couleurs par pixel || ''framebuffer'' compact |} ===L'architecture d'une carte EGA=== Une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : le CRT Controller (CRTC), le Sequence Controller (SC), l'Attribute Controller (AC) et le Graphics Controller (GC). * Le CRTC est un CRTC basique mais ce n'est pas le MC6845 des cartes CGA/MDA, bien que la compatibilité entre eux soit garantie. * L'Attribute Controller est un RAMDAC amélioré. * Le ''Sequence Controller '' communique avec le RAMDAC et le CRTC pour accéder à la mémoire vidéo. * Le circuit restant, le ''Graphics Controller'', sert d'interface entre le bus et la mémoire vidéo. Les quatre composants précédents sont collés entre eux par un paquet de circuits qui servent d'interface entre eux. Une carte EGA contient de nombreux registres, multiplexeurs et autres circuits. Voici ce que donne l'ensemble en schéma : [[File:EGA-Karte.svg|centre|vignette|upright=2|Carte EGA.]] Les cartes EGA intégraient 64 kilo-octets de mémoire vidéo sur la carte elle-même, mais on pouvait ajouter une seconde carte d'extension pour passer à 256 kilo-octets. Certaines résolutions ne fonctionnaient que si cette carte d'extension mémoire était présente. ===Le multi-GPU EGA/CGA=== Les cartes EGA pouvaient fonctionner de concert avec une seconde carte CGA, MDA ou Hercules. Un PC de l'époque pouvait avoir une carte EGA sur un port d'extension, et une carte MDA/CGA sur un autre. Quand une carte CGA est installée, la carte EGA ne fonctionne qu'en mode monochrome. Par contre, quand la seconde carte est une carte MDA ou Hercules, la carte EGA ne fonctionne qu'avec les résolutions à 4 ou 16 couleurs. En clair, elle prend en charge l'affichage monochrome avec les cartes CGA (polychromes), coloré avec les cartes MDA monochromes. L'utilisation d'une carte EGA avec une autre carte MDA/CGA s'explique par une histoire d'entrée-sorties mappées en mémoire. Pour rappel, des adresses mémoires, censées adresser la mémoire RAM, sont détournées pour adresser la mémoire vidéo. Il en est de même pour les registres de configuration de la carte graphique : des adresses mémoire sont détournées pour pointer vers ces registres. Si on regarde l'ensemble des adresses gérées par le processeur, certaines pointent vers la RAM, d'autres vers la carte graphique, d'autres vers des périphériques, d'autres vers le BIOS, etc. Les cartes EGA et les cartes MDA/CGA détournent des adresses différentes. La mémoire des PC de l'époque était découpée en blocs de 64 kilo-octets, que le système d'exploitation DOS allouait comme suit : {| class="wikitable" style="text-align:center;" |+ Espace d'adressage en mode réel |- ! Numéro du bloc !! Contenu du bloc |- | 0 || rowspan="10" class="f_rouge" | Mémoire RAM, mémoire conventionnelle |- | 1 |- | 2 |- | 3 |- | 4 |- | 5 |- | 6 |- | 7 |- | 8 |- | 9 |- | 10 || class="f_vert" | Mémoire vidéo des cartes EGA |- | 11 || class="f_vert" | Mémoire vidéo des cartes MDA ou CGA |- | 12 || class="f_vert" | ROM d'extension des périphériques (XT, EGA, 3270 PC) |- | 13 || class="f_gris" | Autre, non-réservé |- | 14 || class="f_gris" | Autre, non-réservé |- | 15 || class="f_jaune" | ROM du BIOS |} ==Le standard VGA== Le standard VGA fait suite au standard EGA et gère des résolutions jusqu'à 640 par 480. Il intègre aussi un support du ''double buffering'', à savoir qu'il gère deux ''framebuffers'' séparés. Mais le ''double buffering'' n'est possible que dans les basses résolutions, car il n'y a pas assez de mémoire vidéo pour les deux ''framebuffers'' dans les hautes résolutions. Le VGA intègre aussi d'autres fonctionnalités qui seront détaillées dans le chapitre suivant, notamment pour ce qui est du défilement horizontal/vertical. ===Les résolutions supportées par le VGA=== Le standard VGA décrit plusieurs '''modes de fonctionnement''', chacun correspondant à une résolution avec un nombre de couleur associé. Ils sont numérotés en hexadécimal, les modes 1 à 16 (0xFh) correspondent aux résolutions supportées par les cartes MDA, CGA et EGA, les quatre modes restants sont spécifiques au VGA. D'autres modes non-standards sont supportés par la majorité des cartes VGA, comme le mode X, un mode non-officiel qui définit une résolution de 320 par 240 pixels, avec 256 couleurs par pixel. Suivant le mode utilisé, le ''framebuffer'' sera soit de type compact, soit de type planaire ! Les modes gérant 256 couleurs par pixel utilisent un ''framebuffer'' compact, avec un octet par pixel. Par contre, les modes 16 couleurs codent un pixel sur 4 bits, ce qui colle mieux avec un ''framebuffer'' planaire à quatre ''bitplanes''. Les modes 16 couleurs sont surtout utilisés avec des résolutions élevées, alors que les modes 256 utilisent des résolutions basses, pour des raisons de mémoire vidéo. Par exemple, une résolution de 640 par 480 fait qu'une image contient 307 200 pixels, ce qui prend au minimum 300 kilo-octets en mode 256 couleurs ! Or, les cartes graphiques VGA disposaient de seulement 256 kilo-octets de mémoire vidéo. Vous devinez que la carte graphique ne supportait pas 256 couleurs par pixels dans cette résolution, mais qu'elle codait un pixel sur moins d'un octet. Le mode le plus utilisé est le mode 13h, d'une résolution de 320 par 200 pixels pour 256 couleurs par pixel. Il a été utilisé par la grosse majorité des jeux vidéos de l'époque, car son ''framebuffer'' compact était beaucoup plus pratique pour les programmeurs, malgré des performances moindres que les autres modes VGA. Quelques jeux vidéos ont cependant utilisé le mode 11h avec son ''framebuffer'' planaire, comme l'a fait DOOM 1 et sa suite DOOM 2. Cependant, les autres jeux basés sur le même moteur utilisaient le mode 13h, l'exemple typique étant celui des FPS Heretic et Hexen de Raven Software. {|class="wikitable" |- ! Mode !! Résolution !! Couleurs par pixel || Framebuffer |+ Modes principaux |- ! mode 10h | 640 par 350 pixels || 4 à 16 couleurs par pixel (dépend de la RAM vidéo installée) || ''framebuffer'' planaire |- ! mode 11h | 640 par 480 pixels || Monochrome, 2 couleurs par pixel || ''framebuffer'' planaire |- ! mode 12h | 640 par 480 pixels || 16 couleurs par pixel || ''framebuffer'' planaire |- ! mode 13h | 320 par 200 pixels || 256 couleurs par pixel || ''framebuffer'' compact |} ===L'organisation du ''framebuffer''=== La mémoire vidéo fait 256 kilo-octets, répartis dans 4 mémoires RAM de 64 kibioctets chacune. En mode ''framebuffer'' compact, un pixel fait un octet. Chaque octet d'une banque correspond à un pixel. {|class="wikitable" |+ VGA en mode ''framebuffer'' compact/linéaire |- ! Octet banque 1 | Pixel 1, codé sur 8 bits |- ! Octet banque 2 | Pixel 2, codé sur 8 bits |- ! Octet banque 3 | Pixel 3, codé sur 8 bits |- ! Octet banque 4 | Pixel 4, codé sur 8 bits |} Avec un ''framebuffer'' planaire, les pixels sont codés sur 4 bits. Idéalement, chaque ''bitplane'' doit être une mémoire bit-adressable, à savoir que chaque adresse mémoire sélectionne un bit. Mais il s'agit là d'un cas idéal que les cartes VGA en respectaient pas. A la place, chaque ''bitplane'' est une mémoire adressable par octet, et non par bit. Heureusement, elles intégraient des circuits pour simuler une mémoire bit-adressable à partir d'une mémoire adressable par octet. Les quatre banques sont accessibles en parallèles, ce qui permet de lire/écrire 4 octets en même temps, un octet par banque. Dans le mode ''framebuffer'' planaire, les 4 octets lus sont découpés en 8 pixels de 4 bits d'un coup. Le DAC situé en aval de la mémoire vidéo recevait 8 pixels de 4 bits chacun, et mémorisait le tout dans une petite mémoire tampon. Il fournissait, en sortie un pixel par cycle d'horloge. Une seule lecture dans la mémoire vidéo permettait au DAC d'afficher 8 pixels pour une seule lecture en mémoire vidéo. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 | 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 |- ! Octet banque 2 | 1 || 1 || 1 || 1 || 1 || 0 || 1 || 1 |- ! Octet banque 3 | 0 || 1 || 1 || 1 || 0 || 0 || 0 || 0 |- ! Octet banque 4 | 0 || 0 || 1 || 0 || 1 || 0 || 1 || 1 |} ===Le registre intermédiaire : les VGA ''latches''=== Pour gérer au mieux les lectures et écritures, une carte VGA intègre un '''registre intermédiaire''' de 32 bits qui sert d'intermédiaire pour les lectures et écritures. Lors d'une lecture, un octet est lu dans chaque ''bitplane'' et les 4 octets lus sont alors enregistrés dans ce registre intermédiaire. Là, les 32 bits sont alors soit envoyé au RAMDAC pour être affichés à l'écran, soit envoyés au processeur lors d'une lecture. [[File:VGA, lecture dans la mémoire vidéo.png|centre|vignette|upright=2|VGA, lecture dans la mémoire vidéo]] Pour les écritures, le registre intermédiaire est utilisé pour diverses opérations. Par exemple, supposez que le programmeur ne veut modifier qu'un seul pixel codé sur 4 bits. Dans ce cas, il doit lire 32 bits, ne modifier que le pixel dans ces 32 bits, et écrire le résultat en mémoire vidéo. Les bits à modifier sont précisés dans un '''registre de masque''', le ''Bit Mask Register''. Il fait 32 bits, soit la même taille que le registre intermédiaire, et chaque bit du registre de masque correspond à un bit du registre intermédiaire. Si le bit en question est à 1, le bit à écrire provient du registre intermédiaire. Sinon, il vient du pixel envoyé par le CPU. Pour appliquer le masque, le registre intermédiaire est complété par un '''circuit de masquage''', qui permettent de ne modifier que certains bits dans les 32 bits. Le circuit de masquage est concrètement un ensemble de multiplexeurs qui permettent de choisir, pour chaque bit à écrire dans une ''bitplane'', s'il vient du registre intermédiaire, ou des données envoyées par le processeur. Les multiplexeurs sont commandés par un registre de masque. Le VGA fournit deux modes de lecture et quatre modes d'écriture. Pour les écritures, il y a quatre modes nommés mode 0, 1, 2 et 3, que nous détaillerons dans la suite. L'utilisation des circuits de masquage dépend du mode d'écriture. Pour simplifier, il y a trois cas distincts. * Dans le mode d'écriture numéro 0, le processeur envoie un nouveau pixel par cycle. Le masque est mémorisé dans un registre et est stable d'une écriture sur l'autre. Il s'agit du fonctionnement intuitif, où le processeur écrit dans le ''framebuffer''. * Dans le mode d'écriture numéro 3, c'est l'inverse. Le processeur envoie un nouveau masque par cycle, alors que le pixel à écrire est mémorisé dans un registre et reste le même d'une écriture sur l'autre. Ce mode sert à remplir une zone de l'écran avec une même couleur, que ce soit pour tracer des lignes, colorier une figure géométrique, remettre à zéro le ''framebuffer''. * Dans le mode d'écriture numéro 1, le circuit de masquage est configuré pour recopier le registre intermédiaire dans la RAM directement. Il sert pour les copies mémoire-mémoire, à savoir copier des données de la mémoire vidéo vers un autre endroit. [[File:Circuit de masquage du VGA.png|centre|vignette|upright=2.5|Circuit de masquage du VGA]] ===Les circuits annexes : ALU, SET/RESET et ''barrel shifter''=== Les circuits de masquage en question sont complétés par une petite unité de calcul 32 bits, séparée du circuit de masquage, qui gère les opérations logiques OR, AND, XOR. La différence est que le circuit de masquage combine un masque stocké dans un registre dédié avec le registre intermédiaire, alors que l'ALU combine les données envoyées par le CPU et le registre intermédiaire. Toute carte VGA permet aux écritures de n'écrire que dans certaines ''bitplanes''/banques et de laisser les autres tranquilles. Pour cela, il incorpore un registre de 4 bits, le ''Map Mask register'', qui indique quelles banques doivent être activées lors d'une écriture. Il y a un bit par banque, qui indique si elle est éteinte ou allumée lors d'une écriture, seules les banques allumées se font écrire dedans. Notons qu'avec cette technique, les ''bitplanes'' désactivées conservent les données précédentes. Ce n'est pas un problème si on souhaite appliquer des effets graphiques bien précis après avoir rendu une image complète dans le ''framebuffer'' planaire : on calcule une image, puis on applique l'effet en manipulant une ou deux ''bitplanes''. Mais cela pose problème dans d'autres situations. Si jamais une image a été rendue précédemment, ses pixels resteront dans les ''bitplanes''. Désactiver les écritures lors du rendu de l'image suivante donnera un mélange entre image précédente et image nouvelle. Pour éviter cela, il faut ajouter une fonctionnalité qui remet à 0 le ''framebuffer'', octet par octet. La remise à zéro en question peut effacer totalement le ''framebuffer'', à savoir les quatre ''bitplanes'', en remplissant ses octets avec la valeur 0000 0000. Il est aussi, possible de réinitialiser le ''framebuffer'' en mettant chaque octet à 1111 1111. Mais il est aussi intéressant de ne réinitialiser qu'une partie des ''bitplanes'', par exemple seulement une, deux ou trois ''bitplanes''. Pour cela, la carte VGA incorpore un '''circuit de SET/RESET''' avant l'ALU. Il agit sur les octets envoyés par le processeur et destinés aux ''bitplanes'', à savoir qu'il peut les mettre soit à 0000 0000, soit à 1111 1111, soit ne pas les modifier. La commande de ce circuit est réalisée par deux registres dédiés. Enfin, cartes VGA intègrent un ''barrel shifter'', qui fait des opérations de rotations sur l'octet envoyé par le processeur (les décalages ne sont pas supportés). Il était rarement utilisé pour aligner les données au pixel près, plutôt qu'à l'octet près. Mais il était peu utilisé, car le processeur sait faire ce genre d'opérations nativement. L'ALU et le ''barell shifter'' sont commandés par un registre unique, le ''Data Rotate register'', qui indique quelle opérations ils doivent faire. Le contenu de ce registre est découpés en deux champs : un qui dit au ''barell shifter'' de combien de rangs il faut rotater, et quelle opération l'ALU doit faire. ===Les modes d'écriture VGA=== La différence entre les modes d'écriture 0, 1, 2 et 3 tient à l'activation ou non des circuits de SET/RESET, de masquage, et autres. Le '''mode d'écriture 0''' est celui où tous les circuits sont utilisables. Ils ne sont pas forcément tous utilisés, mais peuvent l'être. Les données envoyées par le CPU sont rotatées (ou non), puis passent par le circuit de SET/RESET (qui peut ne rien faire), puis dans l'ALU pour être combinées avec le registre intermédiaire (qui peut simplement recopier l'octet qu'elle recoit), le résultat est masqué (ou non) et enregistré dans les ''bitplanes'' actives, certaines pouvant être désactivées. [[File:VGA latches.png|centre|vignette|upright=2.5|VGA latches]] Le '''mode d'écriture numéro 1''' est utilisé pour faire des copies en mémoire vidéo, de la mémoire vidéo vers elle-même. Ce mode d'écriture se contente de recopier le contenu du registre intermédiaire en mémoire vidéo, les octets envoyés par le processeur ne sont pas utilisés s'ils sont présents. On peut l'émuler à partir du mode 0 en configurant les circuits de masquage proprement. Il faut noter que le registre intermédiaire maintien une donnée indéfiniment et quelques jeux vidéos ou applications utilisaient cette propriété. Par exemple, cela permet de remplir un ''framebuffer'' avec un arrière-plan, avant de re-dessiner dessus. L'idée est d'écrire le motif d'arrière-plan en mémoire vidéo, de le lire pour charger le registre intermédiaire avec, et de lancer une série d'écriture en mode 1 pour recopier le motif dans les adresses mémoires voulues. [[File:VGA write mode 1.png|centre|vignette|upright=2.5|VGA write mode 1]] Le '''mode d'écriture numéro 2''' est lui un mode de remplissage. Il permet d'écrire une couleur dans plusieurs pixels consécutifs, dans un ''framebuffer'' planaire. Au lieu de modifier chaque pixel un par un, avec des opérations de masquage, l'idée est alors de modifier plusieurs pixels consécutifs en une seule fois. On peut modifier jusqu'à 8 bits consécutifs en mémoire vidéo, vu que les ''bitplanes'' sont des mémoires adressables à l'octet. C'est très utile pour remplir le ''framebuffer'' avec une couleur par défaut, pour le réinitialiser/effacer, ou encore pour tracer des segments/lignes horizontales ou diagonales, par exemple. Dans ce mode d'écriture, les circuits de SET/RESET sont au premier plan. Pour comprendre pourquoi, regardons ce qui se passe quand on écrit une même couleur dans 8 pixels consécutifs. Pour simplifier, on part du principe que les 8 pixels sont tous dans le même octet, on dit qu'ils sont alignés sur un octet. La couleur écrite est codée naturellement sur 4 bits, et vaut 0101. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 2 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |- ! Octet banque 3 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 4 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |} On voit que chaque bit du pixel a été recopié à l'identique dans un octet. Les octets écrits dans le ''framebuffer'' planaire valent donc soit 0000 0000, soit 1111 1111. Vous aurez deviné que c'est un cas parfait pour utiliser les circuits de SET/RESET, qui fournissent naturellement les octets 0000 0000 et 1111 1111 sur leur sortie. En clair, chaque bit d'un pixel commande l'octet envoyé sur la ''bitplane'' correspondante. Par exemple, si le bit de poids faible vaut 0, alors l'octet à écrire dans la ''bitplane'' associée vaut 0000 0000. Pour le dire autrement, l'octet envoyé par le processeur, le pixel envoyé, commande des circuits de SET/RESET : ses 4 bits de poids faible indiquent quels ''bitplanes'' sont à mettre à 0000 0000 et celles à mettre à 1111 1111. Les octets mis à 0000 0000 ou 1111 1111 passent ensuite dans l'ALU et les circuits de masquage et sont enregistrés dans les ''bitplane'' actives. Les circuits de masquage sont actifs au cas où certaines zones de l'image ne doivent pas être remplies avec le pixel. Par exemple, imaginez qu'on souhaite remplir un carré avec une couleur par défaut, en utilisant le mode d'écriture 2. Dans ce cas, le masque désigne quels pixels sont dans le carré et ceux en-dehors. [[File:VGA write mode 2.png|centre|vignette|upright=2.5|VGA write mode 2]] Le '''mode d'écriture numéro 3''' est lui aussi utile pour faire du remplissage ou pour tracer des lignes, mais aussi pour écrire du texte transparent. Son principe est le suivant : on écrit une couleur par défaut dans le ''framebuffer'' dans certains pixels seulement, un masque décrit quels bits/pixels modifier pour ne pas effacer ce qui doit l'être. La différence est qu'avec le mode 3, chaque octet provenant du processeur est un nouveau masque à appliquer. Le mode 2 précise la couleur des pixels à modifier avec un masque préconfiguré, le mode 3 précise quel masque utiliser avec une couleur par défaut préconfigurée. Là-encore, les circuits de SET/RESET sont programmés pour dessiner une couleur par défaut. Sauf que cette fois-ci, la couleur est précisée en configurant les registres adéquats, elle n'est pas fournie par l'octet provenant du processeur. Là encore, les circuits de masquage permettent de choisir entre ce qui est déjà dans le ''framebuffer'' planaire, et la couleur par défaut. La différence est que le masque est fournit par l'octet envoyé par le processeur. Pour donner un exemple d'utilisation, prenez le cas où on veut écrire du texte au-dessus d'une image déjà calculée dans le ''framebuffer''. L'écriture du texte se fait caractère par caractère, chaque caractère étant un octet envoyé par le processeur à la carte VGA. Le processeur lit d'abord les pixels sur lesquels écrire le caractère, afin de les copier dans le registre intermédiaire. Puis, il écrit le caractère avec le mode 3 : le calcul du masque donne les pixels à modifier. [[File:VGA write mode 3 simplifié.png|centre|vignette|upright=2.5|VGA write mode 3 simplifié]] Précisons cependant que le masque n'est pas l'octet envoyé par le processeur. A la place, le masque est calculé en prenant le masque présent dans le registre de masque, puis en faisant un ET logique avec l'octet envoyé par le processeur. L'octet est potentiellement rotaté avant, pour l'aligner au pixel près, mais c'est facultatif. [[File:VGA write mode 3.png|centre|vignette|upright=2.5|VGA write mode 3]] ===Les modes de lectures VGA=== Pour la lecture deux modes sont possibles : un plutôt associé à un ''framebuffer'' planaire, le second adapté à un ''framebuffer'' compact. Le premier mode de lecture, le '''''read mode 0''''' lit les octets d'une ''bitplane'' un par un. La ''bitplane'' en question est sélectionnée en configurant deux bits du ''Read Map register'' : 2 bits, 4 valeurs, 4 ''bitplanes''. Le processeur configure ce registre et peut adresser la ''bitplane'' directement. Par contre, il n'accède qu'à une ''bitplane'' à la fois. Lire un pixel entier demande de changer de ''bitplane'' quatre fois de suite, ce qui a un cout en performance très important. Le cout pour lire 8 pixels est le même, ce qui amorti la situation, mais sans faire de miracles. Idéalement, il faudrait un mode de lecture qui simule un ''framebuffer'' compact, par exemple un mode qui permette de lire un pixel en allant piocher dans les 4 ''bitplanes'', voire un mode qui permette de lire 8 pixels d'un seul coup. Mais les cartes VGA ne fournissent pas de mode de lecture aussi pratique. Par contre, ils ont un mode plus limité, appelé le '''''read mode 1'''''. Il lit 8 pixels dans un ''framebuffer'' planaire et les compare à une couleur de référence, stockée dans le registre '' Color Compare Register''. Le résultat est un groupe de 8 bits, chacun stockant le résultat de la comparaison pour un pixel. Lors de la comparaison, il est possible de désactiver des ''bitplanes''. Un registre, le ''Color Don’t Care register'', permet de configurer quelles ''bitplanes''a activer ou désactiver. Il contient un bit par ''bitplane'', qui permet d'activer la ''bitrplane'' s'il est à 1, la désactiver s'ils est à 0. ===Le RAMDAC des cartes VGA=== Les cartes VGA utilisent un système de palette indicée et fournissent en sortie une couleur analogique. Pour cela, elles incorporent une mémoire SRAM pour mémoriser la palette indicée, ainsi qu'un convertisseur numérique vers analogique pour traduire le tout en signaux analogiques pour l'écran. Les deux circuits sont regroupés en un seul, dans un circuit unique appelé un RAMDAC, pour rappel. Le RAMDAC d'une carte VGA est cependant plus complexe qu'un RAMDAC normal, et ce pour une raison simple : le nombre de couleurs dépend de la résolution. Il est de 2, 4, 16, 256 couleurs. Les résolutions à 2, 4 et 16 couleurs sont gérés à par du mode 256 couleurs, et une partie est liée à la compatibilité EGA. Pour commencer, regardons d'abord le mode 256 couleurs. Dans ce mode, la mémoire vidéo fournit un octet, qui indique quelle couleur afficher. L'octet est alors envoyé à un RAMDAC principal, qui convertit cette couleur 8 bits en signaux analogiques RGB. La conversion se fait en deux temps. La première étape est le passage par une palette indicée, qui traduit l'octet en entrée en une couleur codée sur 18 bits : 6 bits pour le rouge, 6 pour le vert, 6 pour le bleu. La SRAM de la palette indicée prend un octet sur l'entrée d'adresse et contient 256 registres de 18 bits. Les 18 bits sont alors envoyés aux circuits de conversion analogique, pour obtenir la couleur finale. Il y a donc un '''RAMDAC 8 bits''', qui sert de RAMDAC principal. La gestion des modes 2, 4, 16 couleurs se fait en utilisant le RAMDAC 8 bits. Avec ces modes, la couleur est codée sur 4 bits, et est lue depuis un ''framebuffer'' planaire. Les 4 bits sont alors étendus pour passer vers 8 bits, qui sont ensuite envoyés au RAMDAC 8 bits. La conversion vers l'analogique se fait donc en deux étapes : une première étape traduit un pixel de 4 bits en un octet, la seconde étape prend cet octet et le transforme en signaux analogiques. Le passage de 4 à 8 bits se fait en gardant la compatibilité avec les résolutions des cartes EGA, qui utilisaient une palette indicée spécifique. Les cartes EGA avaient une palette indicée très simple, qui contenait 16 registres, chacun contenant une couleur codée sur 6 bits. Elle prenait en entrée un pixel codé sur 4 bits, qui adressait un des 16 registres de couleur. Il est possible d'émuler ce système en envoyant les 4 bits du pixels directement dans le RAMDAC 8 bits, en remplacant les 4 bits de poids fort manquant par des zéros. Une solution alternative découpe la palette de 256 couleurs du RAMDAC en 16 sous-palettes de 16 couleurs. Les 4 bits de poids fort décident quelle sous-palette utiliser, les 4 de poids fiable sélectionne une couleur dans la palette choisie. Les 4 bits pour sélectionner la palette proviennent du d'un registre appelé le ''Color Control Register'' [[File:RAMDAC des cartes VGA en mode 16 couleurs pures.png|centre|vignette|upright=2|RAMDAC des cartes VGA en mode 16 couleurs pures]] Néanmoins, il s'agit d'une émulation de la palette EGA. Les cartes VGA gérent un mode de compatibilité EGA avec un système de ''color paging'' qu'on va décrire ci-dessous. Les cartes VGA conservent la palette EGA, ce qui fait qu'il y a une première phase qui transforme un pixel en 6 bits, ce qui permet de coder 64 couleurs différentes. Pour obtenir l'octet à envoyer au RAMDAC 8 bits, les cartes VGA rajoutent deux bits à la couleur EGA, qui proviennent du ''Color Control Register''. Pour implémenter les deux modes d'écrit plus haut, les cartes VGA se débrouillent avec le système suivant. Les 4 bits de poids faible proviennent de la platte indicée, toujours. Les deux bits de poids fort proviennent du ''color control register''. Les deux bits entre les deux viennent soit du ''color control register'', soit de la palette EGA, un MUX choisit entre les deux. Le choix entre les deux dépend du bit 7 du registre de configuration ''AC Mode Register''. Dans le cas où les deux bits de poids fort sont remplacés par le ''color control register'', la palette du RAMDAC est découpée en 16 palettes indicées de 4 bits. [[File:RAMDAC des cartes VGA.png|centre|vignette|upright=2|RAMDAC des cartes VGA]] ===Le mode écran divisé (''splitscreen'')=== Les cartes VGA incorporent des optimisations pour supporter l'affichage en '''''splitscreen''''', appelé en français affichage en "écran divisé", ou affichage divisé. Le standard VGA ne supportait qu'un affichage divisé simple : l'écran était coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'était pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans était configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Dans le chapitre "Les systèmes à framebuffer", nous avions vu comment un ''splitscreen'' de ce type est optimisé sur certains CRTC. Les cartes VGA utilisent des techniques similaires, mais avec cependant quelques différences. L'implémentation du ''splitscreeen'' demande d'avoir deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. Le standard VGA/EGA impose que le ''framebuffer'' de la moitié basse démarre à l'adresse zéro en mémoire vidéo. Le ''framebuffer'' pour la moitié haute est lui placé plus loin en mémoire vidéo. C'est contreintuitif, mais c'est en réalité tout à fait normal. L'idée se comprend bien quand on se rappelle de ceci : le CRTC parcours le ''framebuffer'' en partant d'une adresse de base, qui lui est fournie dans un registre dédié. Le parcours du ''framebuffer'' se fait grâce à l'aide de deux registres, un compteur de ligne et un compteur de colonne. Les trois registres sont utilisés pour calculer l'adresse du pixel à afficher. L'idée est que quand la ligne de démarcation est atteinte, les trois registres sont réinitialisés, ils sont tous trois mis à zéro. Ce qui fait re-démarrer l'affichage à partir de l'adresse zéro. Et cela implique que la moitié basse de l'écran commence à l'adresse 0. La moitié haute doit donc être placée plus loin en mémoire, assez loin pour laisser assez de place à la moitié basse. La ligne de démarcation est censée être mémorisée dans un registre de ''splitscreen'', qui indique à quelle ligne il faut commuter de ''framebuffer''. Mais les cartes EGA et VGA n'ont pas de registre dédié pour. A la place, les différents bits de ce registre sont dispersés dans plusieurs registres séparés. Les cartes EGA utilisaient une valeur de 9 bits dispersée dans deux registres : les bits 7 à 0 sont dans le ''Line Compare register'' (''CRTC register 18H''), le 9ème bit est dans le registre ''Overflow register'' (''CRTC register 7''). Les cartes VGA rajoutent un 10ème bit, qui est dans le registre ''Maximum Scan Line register'' (''CRTC register 9''). Toute modification de ces registres a un effet immédiat, contrairement à une modification de la plupart des autres registres du CRTC. Le support du ''splitscreen'' était présent pour toutes les résolutions officielles, mais quelques cartes VGA le supportaient aussi pour les résolutions non-officielles. Il fonctionne aussi en mode texte ! En mode texte, le passage d'une moitié d'écran à l'autre a le bon ton d'ajouter un saut de ligne automatique, ce qui fait que le texte du second écran reprend au bon endroit, au tout début d'une ligne. Pour cela, le compteur de ligne est réinitialisé à zéro. ==Le PC-98 de NEC== Les ordinateurs PC-98 sont une gamme d'ordinateurs japonais qui a grandement évolué dans le temps. Ils s'inspiraient grandement des PC IBM et étaient centrés autour d'un processeur x86. Le standard IBM PC était globalement respecté sur les PC-98 et le PC_98 tournait sur MS-DOS, mais il y avait cependant de nombreuses différences avec les PC x86. La carte d'affichage était totalement différente, le bus ISA était remplacé par un C-bus, le BIOS était différent, les adresses des périphériques étaient différentes, etc. Les PC-98 ont été déclinés en plusieurs versions, chacune ayant un processeur de plus en plus puissant, plus de mémoire RAM, plus de mémoire vidéo, etc. La première génération utilisait un processeur x86 8086 d'Intel, c'était celle du PC-9801. La seconde génération a démarré avec le PC-9801VM. Leurs capacités graphiques étaient différentes, comme on va le voir. ===Le support des caractères japonais=== Le support des caractères japonais demande beaucoup de contraintes. Afficher des Kanjis demande d'utiliser une mémoire de caractère très grosse, capable de mémoriser plusieurs centaines ou milliers de caractères, dont des Kanjis, hiragana et katakana. Concrètement, la mémoire de caractère des PC-98 mémorisait près de 700 caractères, qui suivaient les standards JIS X 0201 et JIS X 0208. De plus, afficher des kanjis demande d'utiliser des hautes résolutions, au moins 640 par 400, pour que les kanjis soient lisibles. La mémoire vidéo devait être compatible avec de tells résolution. Sur les PC_98, la mémoire vidéo faisait entre 12 et 256 kilo-octets, ce qui était beaucoup pour l'époque, mais était nécessaire pour supporter les hautes résolutions. <noinclude>[[File:Charset.gif|centre|vignette|upright=2|Charset contenant des caractères Japonais, en basse résolution. Différent de celui du PC_98.]]</noinclude> ===Le double rendu texte-graphique=== [[File:PC-9801VM memory map.svg|vignette|upright=0.75|PC-9801VM memory map]] Le ''framebuffer'' graphique était de type planaire et intégrait 4 ''bitplanes'', comme le VGA. A partir du PC-9801VM ajoutait de quoi lire/écrire en parallèle dans plusieurs ''bitplanes'', grâce à l'ajout d'un circuit nommé ''Graphics Charger''. C'est aussi à partir de ce modèle que la mémoire de caractère et une palette indicée reconfigurable ont été ajoutés. Le PC-9801VX améliora le ''Graphic Charger'' pour ajouter un ''blitter''. En général, une carte d'affichage fonctionne soit en mode texte, soit en mode graphique, pas les deux. Les ordinateurs de la gamme PC-98 permettaient de fusionner les deux. Pour cela, ils étaient structurés autour de deux VDC NEC μPD7220 : un qui fonctionnait en mode texte, un autre en mode graphique. Les deux VDC lisaient dans des mémoires vidéos séparées. Le VDC fonctionnant en mode graphique était relié à une mémoire vidéo dédiée, le VDC en mode texte était quant à lui relié à une ''text RAM'' qui servait de tampon de texte. La ''text RAM'' faisait entre 8 et 12 kilo-octets, suivant les modèles, alors que la mémoire vidéo faisait 96, 192 ou 256 kilo-octets. Le ''framebuffer'' était d'abord rendu en mode graphique, et le second VDC pouvait superposer du texte au-dessus. [[File:N88-BASIC(86) color text with graphics.png|centre|vignette|upright=2|Rendu graphique sur les PC-98]] <noinclude>{{NavChapitre | book=Les cartes graphiques | prev=Les Video Display Controler atypiques | prevText=Les Video Display Controler atypiques | next=Le rendu d'une scène 3D : concepts de base | nextText=Le rendu d'une scène 3D : concepts de base }}{{autocat}} </noinclude> q0gyfrlozr4t21mwf8ddq9gxbtpsech 764906 764878 2026-04-24T18:04:36Z Mewtow 31375 /* Les standards MDA et CGA */ 764906 wikitext text/x-wiki Dans cette section, nous allons parler rapidement des cartes graphiques des anciens PC, qui étaient des systèmes à ''framebuffer''. Les standards graphiques sur PC étaient le MDA, le CGA, l'EGA et le VGA, dans l'ordre chronologique. C'était les standards les plus communs, qui ont été introduits par les cartes graphiques suivantes : * IBM Color/Graphics Display Adapter (CGA) * IBM Monochrome Display and Printer Adapter (MDA or sometimes MDPA) * IBM Enhanced Graphics Adapter with Graphics Memory Expansion Card (EGA) * IBM PS/2 Display Adapter (VGA) Le MDA et le CGA utilisaient des ''framebuffer'' compacts, alors que l'EGA et le VGA utilisaient des ''framebuffer'' planaires. Cependant, par souci de compatibilité, l'EGA et le VGA supportent les résolutions du CGA et du MDA, avec un ''framebuffer'' compact. La mémoire vidéo des cartes graphiques EGA et VGA pouvaient être utilisées soit de manière à avoir un ''framebuffer'' planaire ou compact, elle servait pour les deux. Les cartes graphiques concurrentes étaient la ''Hercules Graphics Card'', la ''Tandy Video II Graphic Adapter'', la ''Multi-Color Graphics Array'' (MCGA) et quelques autres. Mais elles étaient peu disponibles et eurent peu de succès, à l'exception de la carte Hercules qui a été supportée dans quelques jeux vidéo. ==Les standards MDA et CGA== Les tout premiers IBM PC, utilisaient la carte graphique ''IBM Monochrome Display Adapter'' (MDA), qui était toujours connectée à un écran ''5151 IBM PC Display'', que nous appellerons IBM 5151 dans ce qui suit. La carte CGA (''Color Graphics Adapter'') étaient disponibles en même temps que la carte MDA, mais les écrans CRT qui pouvaient utiliser ses fonctionnalités ont mis un peu de temps avant d'arriver, ce qui fait qu'on considère parfois à tort que la carte MDA est arrivée avant la CGA. La carte MDA ne gérait que le mode texte, en monochrome, alors que la carte CGA gérait jusqu'à 16 couleurs avec un système de palette indicée. {|class="wikitable" |+ Modes CGA officiels ! colspan="2" | Modes graphiques |- | 320 par 200 pixels || 4 couleurs par pixel |- | 640 par 200 pixels || 2 couleurs par pixel |- ! colspan="2" | Modes texte |- | 320 par 200 pixels || 40 par 25 caractères |- | 640 par 200 pixels || 80 par 25 caractères |} Les cartes MDA et CGA avaient un hardware très semblable vu de loin. La carte MDA incorporait 4 kilo-octets de RAM vidéo, la carte CGA en avait 16 kilo-octets. Les deux incorporaient un VDC Motorola 6845, qui ne gérait que le mode texte. Les cartes CGA (''Color Graphics Adapter'') ont trouvé un moyen de supporter le mode graphique avec ce VDC, grâce à des circuits qui entouraient le VDC. Beaucoup de bidouilles étaient nécessaires pour lui faire afficher des graphismes pixel par pixel. Il était possible d'utiliser une carte MDA en complément d'une carte CGA, dans le même PC. Les deux pouvaient être utilisées pour alimenter deux écrans : un écran monochrome pour la MDA et un écran couleur pour la CGA. Mais elles pouvaient aussi être utilisées pour alimenter un seul écran, la carte CGA se chargeant des calculs graphiques et la MDA pour afficher du texte. Les alternatives aux cartes MDA/CGA étaient assez nombreuses. La quasi-totalité utilisait cependant le même VDC et un hardware très similaire. On parlait d'ailleurs de clones MDA/CGA. Elles se contentaient souvent d'ajouter des fonctionnalités, plus de mémoire vidéo, etc. Par exemple, la carte Hercules était totalement compatible avec la carte MDA, si ce n'est pour l'ajout d'un mode de résolution graphique capable de faire du pixel par pixel. Il y a cependant quelques exceptions comme la ''Professional Graphics Controller'' qui intégrait un processeur Intel 8088 en guise de VDC. <noinclude>Une description détaille des cartes CGA, avec leurs registres de configuration, est disponible via ce lien. Je n'en conseille pas la lecture maintenant : * [https://nerdlypleasures.blogspot.com/2016/05/ibms-cga-hardware-explained.html IBM's CGA Hardware Explained]</noinclude> ==Le standard EGA== Par la suite, les cartes graphiques MDA et CGA ont été remplacées par les cartes EGA. De nombreuses cartes graphiques sensiblement identiques à l'EGA, des clones hardware, ont envahi le marché, transformant l'EGA en standard de facto. Elles géraient entre 4 et 16 couleurs, suivant la résolution, avec un système de palette indicée. Les cartes EGA ont remplacé le ''framebuffer'' compact des anciennes cartes MDA/CGA par un ''framebuffer'' planaire. La mémoire vidéo de la carte EGA était composée de 4 banques, chaque banque étant un ''bitplane''. En clair, les modes gérant 16 couleurs codaient un pixel sur 4 bits, avec un bit par ''bitplane''/banque. Cependant, la résolution 640 par 350 pixels n'utilisait que deux couleurs et utilisait un ''framebuffer'' compact. Le choix entre un ''framebuffer'' planaire et compact était réalisé en configurant un bit dans le registre de configuration adéquat, à savoir le registre ''Sequencer Memory Mode Register '', faisant partie du ''Sequence Controller''. Le bit nommé Chain 4 Bit valait 0 pour un ''framebuffer'' planaire, 1 pour un ''framebuffer'' compact. {|class="wikitable" |- ! Résolution !! Couleurs par pixel || Framebuffer |+ Modes EGA |- | 320 par 200 pixels || 16 couleurs par pixel || rowspan="3" | ''framebuffer'' planaire |- | 640 par 200 pixels || 16 couleurs par pixel |- | 640 par 350 pixels || 16 couleurs par pixel |- ! colspan="3" | Mode nécessitant la carte d'extension mémoire |- | 640 par 350 pixels || 2 couleurs par pixel || ''framebuffer'' compact |} ===L'architecture d'une carte EGA=== Une carte EGA était composée de 4 circuits, chacun ayant ses propres registres : le CRT Controller (CRTC), le Sequence Controller (SC), l'Attribute Controller (AC) et le Graphics Controller (GC). * Le CRTC est un CRTC basique mais ce n'est pas le MC6845 des cartes CGA/MDA, bien que la compatibilité entre eux soit garantie. * L'Attribute Controller est un RAMDAC amélioré. * Le ''Sequence Controller '' communique avec le RAMDAC et le CRTC pour accéder à la mémoire vidéo. * Le circuit restant, le ''Graphics Controller'', sert d'interface entre le bus et la mémoire vidéo. Les quatre composants précédents sont collés entre eux par un paquet de circuits qui servent d'interface entre eux. Une carte EGA contient de nombreux registres, multiplexeurs et autres circuits. Voici ce que donne l'ensemble en schéma : [[File:EGA-Karte.svg|centre|vignette|upright=2|Carte EGA.]] Les cartes EGA intégraient 64 kilo-octets de mémoire vidéo sur la carte elle-même, mais on pouvait ajouter une seconde carte d'extension pour passer à 256 kilo-octets. Certaines résolutions ne fonctionnaient que si cette carte d'extension mémoire était présente. ===Le multi-GPU EGA/CGA=== Les cartes EGA pouvaient fonctionner de concert avec une seconde carte CGA, MDA ou Hercules. Un PC de l'époque pouvait avoir une carte EGA sur un port d'extension, et une carte MDA/CGA sur un autre. Quand une carte CGA est installée, la carte EGA ne fonctionne qu'en mode monochrome. Par contre, quand la seconde carte est une carte MDA ou Hercules, la carte EGA ne fonctionne qu'avec les résolutions à 4 ou 16 couleurs. En clair, elle prend en charge l'affichage monochrome avec les cartes CGA (polychromes), coloré avec les cartes MDA monochromes. L'utilisation d'une carte EGA avec une autre carte MDA/CGA s'explique par une histoire d'entrée-sorties mappées en mémoire. Pour rappel, des adresses mémoires, censées adresser la mémoire RAM, sont détournées pour adresser la mémoire vidéo. Il en est de même pour les registres de configuration de la carte graphique : des adresses mémoire sont détournées pour pointer vers ces registres. Si on regarde l'ensemble des adresses gérées par le processeur, certaines pointent vers la RAM, d'autres vers la carte graphique, d'autres vers des périphériques, d'autres vers le BIOS, etc. Les cartes EGA et les cartes MDA/CGA détournent des adresses différentes. La mémoire des PC de l'époque était découpée en blocs de 64 kilo-octets, que le système d'exploitation DOS allouait comme suit : {| class="wikitable" style="text-align:center;" |+ Espace d'adressage en mode réel |- ! Numéro du bloc !! Contenu du bloc |- | 0 || rowspan="10" class="f_rouge" | Mémoire RAM, mémoire conventionnelle |- | 1 |- | 2 |- | 3 |- | 4 |- | 5 |- | 6 |- | 7 |- | 8 |- | 9 |- | 10 || class="f_vert" | Mémoire vidéo des cartes EGA |- | 11 || class="f_vert" | Mémoire vidéo des cartes MDA ou CGA |- | 12 || class="f_vert" | ROM d'extension des périphériques (XT, EGA, 3270 PC) |- | 13 || class="f_gris" | Autre, non-réservé |- | 14 || class="f_gris" | Autre, non-réservé |- | 15 || class="f_jaune" | ROM du BIOS |} ==Le standard VGA== Le standard VGA fait suite au standard EGA et gère des résolutions jusqu'à 640 par 480. Il intègre aussi un support du ''double buffering'', à savoir qu'il gère deux ''framebuffers'' séparés. Mais le ''double buffering'' n'est possible que dans les basses résolutions, car il n'y a pas assez de mémoire vidéo pour les deux ''framebuffers'' dans les hautes résolutions. Le VGA intègre aussi d'autres fonctionnalités qui seront détaillées dans le chapitre suivant, notamment pour ce qui est du défilement horizontal/vertical. ===Les résolutions supportées par le VGA=== Le standard VGA décrit plusieurs '''modes de fonctionnement''', chacun correspondant à une résolution avec un nombre de couleur associé. Ils sont numérotés en hexadécimal, les modes 1 à 16 (0xFh) correspondent aux résolutions supportées par les cartes MDA, CGA et EGA, les quatre modes restants sont spécifiques au VGA. D'autres modes non-standards sont supportés par la majorité des cartes VGA, comme le mode X, un mode non-officiel qui définit une résolution de 320 par 240 pixels, avec 256 couleurs par pixel. Suivant le mode utilisé, le ''framebuffer'' sera soit de type compact, soit de type planaire ! Les modes gérant 256 couleurs par pixel utilisent un ''framebuffer'' compact, avec un octet par pixel. Par contre, les modes 16 couleurs codent un pixel sur 4 bits, ce qui colle mieux avec un ''framebuffer'' planaire à quatre ''bitplanes''. Les modes 16 couleurs sont surtout utilisés avec des résolutions élevées, alors que les modes 256 utilisent des résolutions basses, pour des raisons de mémoire vidéo. Par exemple, une résolution de 640 par 480 fait qu'une image contient 307 200 pixels, ce qui prend au minimum 300 kilo-octets en mode 256 couleurs ! Or, les cartes graphiques VGA disposaient de seulement 256 kilo-octets de mémoire vidéo. Vous devinez que la carte graphique ne supportait pas 256 couleurs par pixels dans cette résolution, mais qu'elle codait un pixel sur moins d'un octet. Le mode le plus utilisé est le mode 13h, d'une résolution de 320 par 200 pixels pour 256 couleurs par pixel. Il a été utilisé par la grosse majorité des jeux vidéos de l'époque, car son ''framebuffer'' compact était beaucoup plus pratique pour les programmeurs, malgré des performances moindres que les autres modes VGA. Quelques jeux vidéos ont cependant utilisé le mode 11h avec son ''framebuffer'' planaire, comme l'a fait DOOM 1 et sa suite DOOM 2. Cependant, les autres jeux basés sur le même moteur utilisaient le mode 13h, l'exemple typique étant celui des FPS Heretic et Hexen de Raven Software. {|class="wikitable" |- ! Mode !! Résolution !! Couleurs par pixel || Framebuffer |+ Modes principaux |- ! mode 10h | 640 par 350 pixels || 4 à 16 couleurs par pixel (dépend de la RAM vidéo installée) || ''framebuffer'' planaire |- ! mode 11h | 640 par 480 pixels || Monochrome, 2 couleurs par pixel || ''framebuffer'' planaire |- ! mode 12h | 640 par 480 pixels || 16 couleurs par pixel || ''framebuffer'' planaire |- ! mode 13h | 320 par 200 pixels || 256 couleurs par pixel || ''framebuffer'' compact |} ===L'organisation du ''framebuffer''=== La mémoire vidéo fait 256 kilo-octets, répartis dans 4 mémoires RAM de 64 kibioctets chacune. En mode ''framebuffer'' compact, un pixel fait un octet. Chaque octet d'une banque correspond à un pixel. {|class="wikitable" |+ VGA en mode ''framebuffer'' compact/linéaire |- ! Octet banque 1 | Pixel 1, codé sur 8 bits |- ! Octet banque 2 | Pixel 2, codé sur 8 bits |- ! Octet banque 3 | Pixel 3, codé sur 8 bits |- ! Octet banque 4 | Pixel 4, codé sur 8 bits |} Avec un ''framebuffer'' planaire, les pixels sont codés sur 4 bits. Idéalement, chaque ''bitplane'' doit être une mémoire bit-adressable, à savoir que chaque adresse mémoire sélectionne un bit. Mais il s'agit là d'un cas idéal que les cartes VGA en respectaient pas. A la place, chaque ''bitplane'' est une mémoire adressable par octet, et non par bit. Heureusement, elles intégraient des circuits pour simuler une mémoire bit-adressable à partir d'une mémoire adressable par octet. Les quatre banques sont accessibles en parallèles, ce qui permet de lire/écrire 4 octets en même temps, un octet par banque. Dans le mode ''framebuffer'' planaire, les 4 octets lus sont découpés en 8 pixels de 4 bits d'un coup. Le DAC situé en aval de la mémoire vidéo recevait 8 pixels de 4 bits chacun, et mémorisait le tout dans une petite mémoire tampon. Il fournissait, en sortie un pixel par cycle d'horloge. Une seule lecture dans la mémoire vidéo permettait au DAC d'afficher 8 pixels pour une seule lecture en mémoire vidéo. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 | 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 |- ! Octet banque 2 | 1 || 1 || 1 || 1 || 1 || 0 || 1 || 1 |- ! Octet banque 3 | 0 || 1 || 1 || 1 || 0 || 0 || 0 || 0 |- ! Octet banque 4 | 0 || 0 || 1 || 0 || 1 || 0 || 1 || 1 |} ===Le registre intermédiaire : les VGA ''latches''=== Pour gérer au mieux les lectures et écritures, une carte VGA intègre un '''registre intermédiaire''' de 32 bits qui sert d'intermédiaire pour les lectures et écritures. Lors d'une lecture, un octet est lu dans chaque ''bitplane'' et les 4 octets lus sont alors enregistrés dans ce registre intermédiaire. Là, les 32 bits sont alors soit envoyé au RAMDAC pour être affichés à l'écran, soit envoyés au processeur lors d'une lecture. [[File:VGA, lecture dans la mémoire vidéo.png|centre|vignette|upright=2|VGA, lecture dans la mémoire vidéo]] Pour les écritures, le registre intermédiaire est utilisé pour diverses opérations. Par exemple, supposez que le programmeur ne veut modifier qu'un seul pixel codé sur 4 bits. Dans ce cas, il doit lire 32 bits, ne modifier que le pixel dans ces 32 bits, et écrire le résultat en mémoire vidéo. Les bits à modifier sont précisés dans un '''registre de masque''', le ''Bit Mask Register''. Il fait 32 bits, soit la même taille que le registre intermédiaire, et chaque bit du registre de masque correspond à un bit du registre intermédiaire. Si le bit en question est à 1, le bit à écrire provient du registre intermédiaire. Sinon, il vient du pixel envoyé par le CPU. Pour appliquer le masque, le registre intermédiaire est complété par un '''circuit de masquage''', qui permettent de ne modifier que certains bits dans les 32 bits. Le circuit de masquage est concrètement un ensemble de multiplexeurs qui permettent de choisir, pour chaque bit à écrire dans une ''bitplane'', s'il vient du registre intermédiaire, ou des données envoyées par le processeur. Les multiplexeurs sont commandés par un registre de masque. Le VGA fournit deux modes de lecture et quatre modes d'écriture. Pour les écritures, il y a quatre modes nommés mode 0, 1, 2 et 3, que nous détaillerons dans la suite. L'utilisation des circuits de masquage dépend du mode d'écriture. Pour simplifier, il y a trois cas distincts. * Dans le mode d'écriture numéro 0, le processeur envoie un nouveau pixel par cycle. Le masque est mémorisé dans un registre et est stable d'une écriture sur l'autre. Il s'agit du fonctionnement intuitif, où le processeur écrit dans le ''framebuffer''. * Dans le mode d'écriture numéro 3, c'est l'inverse. Le processeur envoie un nouveau masque par cycle, alors que le pixel à écrire est mémorisé dans un registre et reste le même d'une écriture sur l'autre. Ce mode sert à remplir une zone de l'écran avec une même couleur, que ce soit pour tracer des lignes, colorier une figure géométrique, remettre à zéro le ''framebuffer''. * Dans le mode d'écriture numéro 1, le circuit de masquage est configuré pour recopier le registre intermédiaire dans la RAM directement. Il sert pour les copies mémoire-mémoire, à savoir copier des données de la mémoire vidéo vers un autre endroit. [[File:Circuit de masquage du VGA.png|centre|vignette|upright=2.5|Circuit de masquage du VGA]] ===Les circuits annexes : ALU, SET/RESET et ''barrel shifter''=== Les circuits de masquage en question sont complétés par une petite unité de calcul 32 bits, séparée du circuit de masquage, qui gère les opérations logiques OR, AND, XOR. La différence est que le circuit de masquage combine un masque stocké dans un registre dédié avec le registre intermédiaire, alors que l'ALU combine les données envoyées par le CPU et le registre intermédiaire. Toute carte VGA permet aux écritures de n'écrire que dans certaines ''bitplanes''/banques et de laisser les autres tranquilles. Pour cela, il incorpore un registre de 4 bits, le ''Map Mask register'', qui indique quelles banques doivent être activées lors d'une écriture. Il y a un bit par banque, qui indique si elle est éteinte ou allumée lors d'une écriture, seules les banques allumées se font écrire dedans. Notons qu'avec cette technique, les ''bitplanes'' désactivées conservent les données précédentes. Ce n'est pas un problème si on souhaite appliquer des effets graphiques bien précis après avoir rendu une image complète dans le ''framebuffer'' planaire : on calcule une image, puis on applique l'effet en manipulant une ou deux ''bitplanes''. Mais cela pose problème dans d'autres situations. Si jamais une image a été rendue précédemment, ses pixels resteront dans les ''bitplanes''. Désactiver les écritures lors du rendu de l'image suivante donnera un mélange entre image précédente et image nouvelle. Pour éviter cela, il faut ajouter une fonctionnalité qui remet à 0 le ''framebuffer'', octet par octet. La remise à zéro en question peut effacer totalement le ''framebuffer'', à savoir les quatre ''bitplanes'', en remplissant ses octets avec la valeur 0000 0000. Il est aussi, possible de réinitialiser le ''framebuffer'' en mettant chaque octet à 1111 1111. Mais il est aussi intéressant de ne réinitialiser qu'une partie des ''bitplanes'', par exemple seulement une, deux ou trois ''bitplanes''. Pour cela, la carte VGA incorpore un '''circuit de SET/RESET''' avant l'ALU. Il agit sur les octets envoyés par le processeur et destinés aux ''bitplanes'', à savoir qu'il peut les mettre soit à 0000 0000, soit à 1111 1111, soit ne pas les modifier. La commande de ce circuit est réalisée par deux registres dédiés. Enfin, cartes VGA intègrent un ''barrel shifter'', qui fait des opérations de rotations sur l'octet envoyé par le processeur (les décalages ne sont pas supportés). Il était rarement utilisé pour aligner les données au pixel près, plutôt qu'à l'octet près. Mais il était peu utilisé, car le processeur sait faire ce genre d'opérations nativement. L'ALU et le ''barell shifter'' sont commandés par un registre unique, le ''Data Rotate register'', qui indique quelle opérations ils doivent faire. Le contenu de ce registre est découpés en deux champs : un qui dit au ''barell shifter'' de combien de rangs il faut rotater, et quelle opération l'ALU doit faire. ===Les modes d'écriture VGA=== La différence entre les modes d'écriture 0, 1, 2 et 3 tient à l'activation ou non des circuits de SET/RESET, de masquage, et autres. Le '''mode d'écriture 0''' est celui où tous les circuits sont utilisables. Ils ne sont pas forcément tous utilisés, mais peuvent l'être. Les données envoyées par le CPU sont rotatées (ou non), puis passent par le circuit de SET/RESET (qui peut ne rien faire), puis dans l'ALU pour être combinées avec le registre intermédiaire (qui peut simplement recopier l'octet qu'elle recoit), le résultat est masqué (ou non) et enregistré dans les ''bitplanes'' actives, certaines pouvant être désactivées. [[File:VGA latches.png|centre|vignette|upright=2.5|VGA latches]] Le '''mode d'écriture numéro 1''' est utilisé pour faire des copies en mémoire vidéo, de la mémoire vidéo vers elle-même. Ce mode d'écriture se contente de recopier le contenu du registre intermédiaire en mémoire vidéo, les octets envoyés par le processeur ne sont pas utilisés s'ils sont présents. On peut l'émuler à partir du mode 0 en configurant les circuits de masquage proprement. Il faut noter que le registre intermédiaire maintien une donnée indéfiniment et quelques jeux vidéos ou applications utilisaient cette propriété. Par exemple, cela permet de remplir un ''framebuffer'' avec un arrière-plan, avant de re-dessiner dessus. L'idée est d'écrire le motif d'arrière-plan en mémoire vidéo, de le lire pour charger le registre intermédiaire avec, et de lancer une série d'écriture en mode 1 pour recopier le motif dans les adresses mémoires voulues. [[File:VGA write mode 1.png|centre|vignette|upright=2.5|VGA write mode 1]] Le '''mode d'écriture numéro 2''' est lui un mode de remplissage. Il permet d'écrire une couleur dans plusieurs pixels consécutifs, dans un ''framebuffer'' planaire. Au lieu de modifier chaque pixel un par un, avec des opérations de masquage, l'idée est alors de modifier plusieurs pixels consécutifs en une seule fois. On peut modifier jusqu'à 8 bits consécutifs en mémoire vidéo, vu que les ''bitplanes'' sont des mémoires adressables à l'octet. C'est très utile pour remplir le ''framebuffer'' avec une couleur par défaut, pour le réinitialiser/effacer, ou encore pour tracer des segments/lignes horizontales ou diagonales, par exemple. Dans ce mode d'écriture, les circuits de SET/RESET sont au premier plan. Pour comprendre pourquoi, regardons ce qui se passe quand on écrit une même couleur dans 8 pixels consécutifs. Pour simplifier, on part du principe que les 8 pixels sont tous dans le même octet, on dit qu'ils sont alignés sur un octet. La couleur écrite est codée naturellement sur 4 bits, et vaut 0101. {|class="wikitable" |+ VGA en mode ''framebuffer'' planaire |- ! !! Pixel !! Pixel 1 !! Pixel 2 !! Pixel 3 !! Pixel 4 !! Pixel 5 !! Pixel 6 !! Pixel 7 !! Pixel 8 |- ! Octet banque 1 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 2 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |- ! Octet banque 3 ! 0 | 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 |- ! Octet banque 4 ! 1 | 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 |} On voit que chaque bit du pixel a été recopié à l'identique dans un octet. Les octets écrits dans le ''framebuffer'' planaire valent donc soit 0000 0000, soit 1111 1111. Vous aurez deviné que c'est un cas parfait pour utiliser les circuits de SET/RESET, qui fournissent naturellement les octets 0000 0000 et 1111 1111 sur leur sortie. En clair, chaque bit d'un pixel commande l'octet envoyé sur la ''bitplane'' correspondante. Par exemple, si le bit de poids faible vaut 0, alors l'octet à écrire dans la ''bitplane'' associée vaut 0000 0000. Pour le dire autrement, l'octet envoyé par le processeur, le pixel envoyé, commande des circuits de SET/RESET : ses 4 bits de poids faible indiquent quels ''bitplanes'' sont à mettre à 0000 0000 et celles à mettre à 1111 1111. Les octets mis à 0000 0000 ou 1111 1111 passent ensuite dans l'ALU et les circuits de masquage et sont enregistrés dans les ''bitplane'' actives. Les circuits de masquage sont actifs au cas où certaines zones de l'image ne doivent pas être remplies avec le pixel. Par exemple, imaginez qu'on souhaite remplir un carré avec une couleur par défaut, en utilisant le mode d'écriture 2. Dans ce cas, le masque désigne quels pixels sont dans le carré et ceux en-dehors. [[File:VGA write mode 2.png|centre|vignette|upright=2.5|VGA write mode 2]] Le '''mode d'écriture numéro 3''' est lui aussi utile pour faire du remplissage ou pour tracer des lignes, mais aussi pour écrire du texte transparent. Son principe est le suivant : on écrit une couleur par défaut dans le ''framebuffer'' dans certains pixels seulement, un masque décrit quels bits/pixels modifier pour ne pas effacer ce qui doit l'être. La différence est qu'avec le mode 3, chaque octet provenant du processeur est un nouveau masque à appliquer. Le mode 2 précise la couleur des pixels à modifier avec un masque préconfiguré, le mode 3 précise quel masque utiliser avec une couleur par défaut préconfigurée. Là-encore, les circuits de SET/RESET sont programmés pour dessiner une couleur par défaut. Sauf que cette fois-ci, la couleur est précisée en configurant les registres adéquats, elle n'est pas fournie par l'octet provenant du processeur. Là encore, les circuits de masquage permettent de choisir entre ce qui est déjà dans le ''framebuffer'' planaire, et la couleur par défaut. La différence est que le masque est fournit par l'octet envoyé par le processeur. Pour donner un exemple d'utilisation, prenez le cas où on veut écrire du texte au-dessus d'une image déjà calculée dans le ''framebuffer''. L'écriture du texte se fait caractère par caractère, chaque caractère étant un octet envoyé par le processeur à la carte VGA. Le processeur lit d'abord les pixels sur lesquels écrire le caractère, afin de les copier dans le registre intermédiaire. Puis, il écrit le caractère avec le mode 3 : le calcul du masque donne les pixels à modifier. [[File:VGA write mode 3 simplifié.png|centre|vignette|upright=2.5|VGA write mode 3 simplifié]] Précisons cependant que le masque n'est pas l'octet envoyé par le processeur. A la place, le masque est calculé en prenant le masque présent dans le registre de masque, puis en faisant un ET logique avec l'octet envoyé par le processeur. L'octet est potentiellement rotaté avant, pour l'aligner au pixel près, mais c'est facultatif. [[File:VGA write mode 3.png|centre|vignette|upright=2.5|VGA write mode 3]] ===Les modes de lectures VGA=== Pour la lecture deux modes sont possibles : un plutôt associé à un ''framebuffer'' planaire, le second adapté à un ''framebuffer'' compact. Le premier mode de lecture, le '''''read mode 0''''' lit les octets d'une ''bitplane'' un par un. La ''bitplane'' en question est sélectionnée en configurant deux bits du ''Read Map register'' : 2 bits, 4 valeurs, 4 ''bitplanes''. Le processeur configure ce registre et peut adresser la ''bitplane'' directement. Par contre, il n'accède qu'à une ''bitplane'' à la fois. Lire un pixel entier demande de changer de ''bitplane'' quatre fois de suite, ce qui a un cout en performance très important. Le cout pour lire 8 pixels est le même, ce qui amorti la situation, mais sans faire de miracles. Idéalement, il faudrait un mode de lecture qui simule un ''framebuffer'' compact, par exemple un mode qui permette de lire un pixel en allant piocher dans les 4 ''bitplanes'', voire un mode qui permette de lire 8 pixels d'un seul coup. Mais les cartes VGA ne fournissent pas de mode de lecture aussi pratique. Par contre, ils ont un mode plus limité, appelé le '''''read mode 1'''''. Il lit 8 pixels dans un ''framebuffer'' planaire et les compare à une couleur de référence, stockée dans le registre '' Color Compare Register''. Le résultat est un groupe de 8 bits, chacun stockant le résultat de la comparaison pour un pixel. Lors de la comparaison, il est possible de désactiver des ''bitplanes''. Un registre, le ''Color Don’t Care register'', permet de configurer quelles ''bitplanes''a activer ou désactiver. Il contient un bit par ''bitplane'', qui permet d'activer la ''bitrplane'' s'il est à 1, la désactiver s'ils est à 0. ===Le RAMDAC des cartes VGA=== Les cartes VGA utilisent un système de palette indicée et fournissent en sortie une couleur analogique. Pour cela, elles incorporent une mémoire SRAM pour mémoriser la palette indicée, ainsi qu'un convertisseur numérique vers analogique pour traduire le tout en signaux analogiques pour l'écran. Les deux circuits sont regroupés en un seul, dans un circuit unique appelé un RAMDAC, pour rappel. Le RAMDAC d'une carte VGA est cependant plus complexe qu'un RAMDAC normal, et ce pour une raison simple : le nombre de couleurs dépend de la résolution. Il est de 2, 4, 16, 256 couleurs. Les résolutions à 2, 4 et 16 couleurs sont gérés à par du mode 256 couleurs, et une partie est liée à la compatibilité EGA. Pour commencer, regardons d'abord le mode 256 couleurs. Dans ce mode, la mémoire vidéo fournit un octet, qui indique quelle couleur afficher. L'octet est alors envoyé à un RAMDAC principal, qui convertit cette couleur 8 bits en signaux analogiques RGB. La conversion se fait en deux temps. La première étape est le passage par une palette indicée, qui traduit l'octet en entrée en une couleur codée sur 18 bits : 6 bits pour le rouge, 6 pour le vert, 6 pour le bleu. La SRAM de la palette indicée prend un octet sur l'entrée d'adresse et contient 256 registres de 18 bits. Les 18 bits sont alors envoyés aux circuits de conversion analogique, pour obtenir la couleur finale. Il y a donc un '''RAMDAC 8 bits''', qui sert de RAMDAC principal. La gestion des modes 2, 4, 16 couleurs se fait en utilisant le RAMDAC 8 bits. Avec ces modes, la couleur est codée sur 4 bits, et est lue depuis un ''framebuffer'' planaire. Les 4 bits sont alors étendus pour passer vers 8 bits, qui sont ensuite envoyés au RAMDAC 8 bits. La conversion vers l'analogique se fait donc en deux étapes : une première étape traduit un pixel de 4 bits en un octet, la seconde étape prend cet octet et le transforme en signaux analogiques. Le passage de 4 à 8 bits se fait en gardant la compatibilité avec les résolutions des cartes EGA, qui utilisaient une palette indicée spécifique. Les cartes EGA avaient une palette indicée très simple, qui contenait 16 registres, chacun contenant une couleur codée sur 6 bits. Elle prenait en entrée un pixel codé sur 4 bits, qui adressait un des 16 registres de couleur. Il est possible d'émuler ce système en envoyant les 4 bits du pixels directement dans le RAMDAC 8 bits, en remplacant les 4 bits de poids fort manquant par des zéros. Une solution alternative découpe la palette de 256 couleurs du RAMDAC en 16 sous-palettes de 16 couleurs. Les 4 bits de poids fort décident quelle sous-palette utiliser, les 4 de poids fiable sélectionne une couleur dans la palette choisie. Les 4 bits pour sélectionner la palette proviennent du d'un registre appelé le ''Color Control Register'' [[File:RAMDAC des cartes VGA en mode 16 couleurs pures.png|centre|vignette|upright=2|RAMDAC des cartes VGA en mode 16 couleurs pures]] Néanmoins, il s'agit d'une émulation de la palette EGA. Les cartes VGA gérent un mode de compatibilité EGA avec un système de ''color paging'' qu'on va décrire ci-dessous. Les cartes VGA conservent la palette EGA, ce qui fait qu'il y a une première phase qui transforme un pixel en 6 bits, ce qui permet de coder 64 couleurs différentes. Pour obtenir l'octet à envoyer au RAMDAC 8 bits, les cartes VGA rajoutent deux bits à la couleur EGA, qui proviennent du ''Color Control Register''. Pour implémenter les deux modes d'écrit plus haut, les cartes VGA se débrouillent avec le système suivant. Les 4 bits de poids faible proviennent de la platte indicée, toujours. Les deux bits de poids fort proviennent du ''color control register''. Les deux bits entre les deux viennent soit du ''color control register'', soit de la palette EGA, un MUX choisit entre les deux. Le choix entre les deux dépend du bit 7 du registre de configuration ''AC Mode Register''. Dans le cas où les deux bits de poids fort sont remplacés par le ''color control register'', la palette du RAMDAC est découpée en 16 palettes indicées de 4 bits. [[File:RAMDAC des cartes VGA.png|centre|vignette|upright=2|RAMDAC des cartes VGA]] ===Le mode écran divisé (''splitscreen'')=== Les cartes VGA incorporent des optimisations pour supporter l'affichage en '''''splitscreen''''', appelé en français affichage en "écran divisé", ou affichage divisé. Le standard VGA ne supportait qu'un affichage divisé simple : l'écran était coupé en deux à l'horizontale, avec une moitié haute et une moitié basse. L'écran n'était pas forcément coupé en deux parties égales, la ligne de démarcation entre les deux écrans était configurable. Prenons l'exemple d'une résolution de 320 par 200 pixels, soit 200 pixels de haut. Le premier écran pouvait, par exemple, faire 56 pixels de hauteur, le second 144 pixels. Dans le chapitre "Les systèmes à framebuffer", nous avions vu comment un ''splitscreen'' de ce type est optimisé sur certains CRTC. Les cartes VGA utilisent des techniques similaires, mais avec cependant quelques différences. L'implémentation du ''splitscreeen'' demande d'avoir deux ''framebuffers'' : un pour la moitié haute de l'écran, un pour la moitié basse. Le standard VGA/EGA impose que le ''framebuffer'' de la moitié basse démarre à l'adresse zéro en mémoire vidéo. Le ''framebuffer'' pour la moitié haute est lui placé plus loin en mémoire vidéo. C'est contreintuitif, mais c'est en réalité tout à fait normal. L'idée se comprend bien quand on se rappelle de ceci : le CRTC parcours le ''framebuffer'' en partant d'une adresse de base, qui lui est fournie dans un registre dédié. Le parcours du ''framebuffer'' se fait grâce à l'aide de deux registres, un compteur de ligne et un compteur de colonne. Les trois registres sont utilisés pour calculer l'adresse du pixel à afficher. L'idée est que quand la ligne de démarcation est atteinte, les trois registres sont réinitialisés, ils sont tous trois mis à zéro. Ce qui fait re-démarrer l'affichage à partir de l'adresse zéro. Et cela implique que la moitié basse de l'écran commence à l'adresse 0. La moitié haute doit donc être placée plus loin en mémoire, assez loin pour laisser assez de place à la moitié basse. La ligne de démarcation est censée être mémorisée dans un registre de ''splitscreen'', qui indique à quelle ligne il faut commuter de ''framebuffer''. Mais les cartes EGA et VGA n'ont pas de registre dédié pour. A la place, les différents bits de ce registre sont dispersés dans plusieurs registres séparés. Les cartes EGA utilisaient une valeur de 9 bits dispersée dans deux registres : les bits 7 à 0 sont dans le ''Line Compare register'' (''CRTC register 18H''), le 9ème bit est dans le registre ''Overflow register'' (''CRTC register 7''). Les cartes VGA rajoutent un 10ème bit, qui est dans le registre ''Maximum Scan Line register'' (''CRTC register 9''). Toute modification de ces registres a un effet immédiat, contrairement à une modification de la plupart des autres registres du CRTC. Le support du ''splitscreen'' était présent pour toutes les résolutions officielles, mais quelques cartes VGA le supportaient aussi pour les résolutions non-officielles. Il fonctionne aussi en mode texte ! En mode texte, le passage d'une moitié d'écran à l'autre a le bon ton d'ajouter un saut de ligne automatique, ce qui fait que le texte du second écran reprend au bon endroit, au tout début d'une ligne. Pour cela, le compteur de ligne est réinitialisé à zéro. ==Le PC-98 de NEC== Les ordinateurs PC-98 sont une gamme d'ordinateurs japonais qui a grandement évolué dans le temps. Ils s'inspiraient grandement des PC IBM et étaient centrés autour d'un processeur x86. Le standard IBM PC était globalement respecté sur les PC-98 et le PC_98 tournait sur MS-DOS, mais il y avait cependant de nombreuses différences avec les PC x86. La carte d'affichage était totalement différente, le bus ISA était remplacé par un C-bus, le BIOS était différent, les adresses des périphériques étaient différentes, etc. Les PC-98 ont été déclinés en plusieurs versions, chacune ayant un processeur de plus en plus puissant, plus de mémoire RAM, plus de mémoire vidéo, etc. La première génération utilisait un processeur x86 8086 d'Intel, c'était celle du PC-9801. La seconde génération a démarré avec le PC-9801VM. Leurs capacités graphiques étaient différentes, comme on va le voir. ===Le support des caractères japonais=== Le support des caractères japonais demande beaucoup de contraintes. Afficher des Kanjis demande d'utiliser une mémoire de caractère très grosse, capable de mémoriser plusieurs centaines ou milliers de caractères, dont des Kanjis, hiragana et katakana. Concrètement, la mémoire de caractère des PC-98 mémorisait près de 700 caractères, qui suivaient les standards JIS X 0201 et JIS X 0208. De plus, afficher des kanjis demande d'utiliser des hautes résolutions, au moins 640 par 400, pour que les kanjis soient lisibles. La mémoire vidéo devait être compatible avec de tells résolution. Sur les PC_98, la mémoire vidéo faisait entre 12 et 256 kilo-octets, ce qui était beaucoup pour l'époque, mais était nécessaire pour supporter les hautes résolutions. <noinclude>[[File:Charset.gif|centre|vignette|upright=2|Charset contenant des caractères Japonais, en basse résolution. Différent de celui du PC_98.]]</noinclude> ===Le double rendu texte-graphique=== [[File:PC-9801VM memory map.svg|vignette|upright=0.75|PC-9801VM memory map]] Le ''framebuffer'' graphique était de type planaire et intégrait 4 ''bitplanes'', comme le VGA. A partir du PC-9801VM ajoutait de quoi lire/écrire en parallèle dans plusieurs ''bitplanes'', grâce à l'ajout d'un circuit nommé ''Graphics Charger''. C'est aussi à partir de ce modèle que la mémoire de caractère et une palette indicée reconfigurable ont été ajoutés. Le PC-9801VX améliora le ''Graphic Charger'' pour ajouter un ''blitter''. En général, une carte d'affichage fonctionne soit en mode texte, soit en mode graphique, pas les deux. Les ordinateurs de la gamme PC-98 permettaient de fusionner les deux. Pour cela, ils étaient structurés autour de deux VDC NEC μPD7220 : un qui fonctionnait en mode texte, un autre en mode graphique. Les deux VDC lisaient dans des mémoires vidéos séparées. Le VDC fonctionnant en mode graphique était relié à une mémoire vidéo dédiée, le VDC en mode texte était quant à lui relié à une ''text RAM'' qui servait de tampon de texte. La ''text RAM'' faisait entre 8 et 12 kilo-octets, suivant les modèles, alors que la mémoire vidéo faisait 96, 192 ou 256 kilo-octets. Le ''framebuffer'' était d'abord rendu en mode graphique, et le second VDC pouvait superposer du texte au-dessus. [[File:N88-BASIC(86) color text with graphics.png|centre|vignette|upright=2|Rendu graphique sur les PC-98]] <noinclude>{{NavChapitre | book=Les cartes graphiques | prev=Les Video Display Controler atypiques | prevText=Les Video Display Controler atypiques | next=Le rendu d'une scène 3D : concepts de base | nextText=Le rendu d'une scène 3D : concepts de base }}{{autocat}} </noinclude> mqghbhk9lsjvbpzpgowwvg8rnupytp9 Dictionnaire de philosophie/Art 0 82997 765008 753034 2026-04-25T08:34:56Z PandaMystique 119061 765008 wikitext text/x-wiki {{DicoPhilo|Art}} == Introduction == La philosophie de l'art, discipline traditionnellement désignée par le terme '''esthétique''' depuis sa fondation par Alexander Gottlieb Baumgarten au milieu du dix-huitième siècle, constitue l'une des branches les plus anciennes et les plus fondamentales de la réflexion philosophique. Dès l'Antiquité grecque, [[Pour lire Platon|Platon]] et [[Dictionnaire de philosophie/Aristote|Aristote]] consacrèrent des développements majeurs aux questions de l'imitation (''mimesis''), de la beauté (''kalon''), de la production artistique (''poiesis'') et de l'expérience esthétique (''aisthesis''). Ces interrogations millénaires concernant la nature de l'art, ses fonctions sociales et cognitives, ses rapports à la [[Dictionnaire de philosophie/Vérité|vérité]], à la [[Philosophie/Morale|morale]] et à la politique, loin de s'être épuisées ou résolues au cours des siècles, connaissent actuellement un renouvellement théorique considérable sous l'effet des transformations profondes qui affectent simultanément les pratiques artistiques contemporaines, les institutions culturelles qui les encadrent, les technologies qui les médiatisent, et les contextes sociopolitiques dans lesquels elles s'inscrivent. Le vingt-et-unième siècle confronte la pensée esthétique à des défis d'une ampleur et d'une complexité sans précédent historique. L'émergence de l'intelligence artificielle capable de générer en quelques secondes des images d'une sophistication technique stupéfiante remet radicalement en question les conceptions traditionnelles de la créativité, de l'originalité et de l'autorité artistique qui structuraient jusqu'alors notre compréhension de l'art. La financiarisation accélérée du marché de l'art contemporain, où des œuvres atteignent des valorisations de centaines de millions de dollars tandis qu'elles circulent dans des zones franches opaques sans jamais être exposées publiquement, transforme l'art en classe d'actifs spéculatifs déconnectée de toute fonction culturelle ou esthétique apparente. La crise climatique exige que les artistes et les institutions culturelles interrogent l'impact environnemental de leurs pratiques, de la consommation énergétique des musées climatisés à l'empreinte carbone des expositions internationales nécessitant le transport aérien d'œuvres et de participants. La révolution numérique dématérialise partiellement la création et la circulation des œuvres tout en générant de nouvelles formes d'inégalités d'accès et de contrôle. Les mouvements sociaux pour la justice raciale, l'égalité de genre, la décolonisation des savoirs contestent les canons artistiques historiques comme reflétant et perpétuant les dominations de classe, de race et de genre qui ont structuré les sociétés occidentales. Ces transformations ne constituent pas simplement des phénomènes externes auxquels la philosophie de l'art pourrait réagir passivement en appliquant mécaniquement des cadres conceptuels préexistants. Elles requièrent au contraire une refondation théorique profonde, une remise en question des présupposés fondamentaux qui ont gouverné la pensée esthétique moderne. L'idéologie de l'autonomie de l'art, selon laquelle l'œuvre authentique se définit précisément par son indépendance vis-à-vis de toute fonction utilitaire, morale, politique ou commerciale, apparaît désormais comme une construction historique spécifique à la modernité européenne des dix-huitième et dix-neuvième siècles plutôt que comme vérité universelle intemporelle. Cette idéologie, si elle a permis des avancées considérables en établissant un espace protégé pour l'expérimentation formelle et la critique sociale, a également servi à légitimer l'exclusion de nombreuses pratiques culturelles jugées trop liées à des fonctions sociales (art rituel, art populaire, artisanat utilitaire) ou à des considérations commerciales (arts appliqués, design). Elle a contribué à naturaliser une séparation radicale entre culture haute et culture basse, entre beaux-arts et arts mineurs, hiérarchies qui reflétaient et reproduisaient les distinctions sociales entre classes cultivées et classes populaires. De même, le modèle du génie créateur solitaire, artiste exceptionnel dont le talent inné et l'originalité radicale permettent de produire des œuvres uniques exprimant une subjectivité singulière, apparaît aujourd'hui comme construction idéologique romantique qui occulte les dimensions fondamentalement collectives, collaboratives et contextuelles de toute création artistique. Aucun artiste ne crée ex nihilo : chacun hérite de traditions, s'inscrit dans des réseaux de pairs, dépend de circuits de formation, de production, de diffusion, mobilise des ressources matérielles et symboliques socialement produites. L'insistance excessive sur l'individualité géniale du créateur a historiquement servi à marginaliser les pratiques collectives, les traditions anonymes, les formes culturelles communautaires, tout en masquant le travail invisible de multiples acteurs (assistants d'atelier, techniciens, médiateurs, conservateurs) qui contribuent effectivement à l'existence sociale des œuvres. L'[[Dictionnaire de philosophie/Anthropocentrisme|anthropocentrisme]] qui caractérise la tradition esthétique occidentale, centrant l'expérience et le jugement humains comme seules instances légitimes d'évaluation de la beauté et de l'art, se révèle également problématique à l'ère de l'Anthropocène où l'impact dévastateur de l'activité humaine sur les écosystèmes planétaires exige que nous décentrisions radicalement notre perspective pour reconnaître la valeur intrinsèque et l'agentivité propre des entités non-humaines. Peut-on imaginer une esthétique véritablement écologique qui tiendrait compte des perspectives et des affects d'autres espèces vivantes, voire d'entités non-vivantes comme les fleuves, les montagnes, les écosystèmes considérés comme sujets de droit dans certaines législations contemporaines ? Comment l'art peut-il nous aider à développer des modes de perception et de relation au monde naturel qui dépassent l'instrumentalisation utilitariste et la contemplation esthétisante détachée pour reconnaître notre intrication profonde dans des processus écologiques qui nous constituent et nous dépassent infiniment ? L'eurocentrisme implicite de l'histoire de l'art et de l'esthétique philosophique, qui a longtemps présenté le développement de l'art occidental comme trajectoire universelle dont les autres traditions ne constitueraient au mieux que des variantes marginales ou des stades préliminaires, se trouve radicalement contesté par les perspectives postcoloniales et décoloniales. Les catégories conceptuelles fondamentales de l'esthétique moderne (art vs artisanat, beauté désintéressée, contemplation esthétique autonome, originalité créatrice) se sont historiquement constituées en légitimant implicitement les productions européennes comme seules véritablement artistiques, reléguant les créations des peuples colonisés aux catégories inférieures d'ethnographie, de folklore, d'art primitif. Cette colonialité épistémologique persiste longtemps après la fin formelle du colonialisme politique, structurant encore les institutions muséales, les marchés de l'art, les canons académiques, les critères d'évaluation. Décoloniser l'esthétique ne signifie pas simplement inclure davantage d'artistes non-occidentaux dans les institutions existantes mais transformer radicalement les cadres conceptuels eux-mêmes pour reconnaître la légitimité de modes de création, de perception et d'évaluation esthétiques enracinés dans d'autres traditions épistémologiques. Face à ces défis multiples et interconnectés, la philosophie de l'art contemporaine se trouve à un carrefour historique. Elle peut soit s'arc-bouter défensivement sur les paradigmes hérités, cherchant à préserver la cohérence des théories classiques contre les perturbations du présent, soit accepter la nécessité d'une refondation théorique profonde qui prenne pleinement en compte les transformations en cours. Cette seconde voie, plus périlleuse mais intellectuellement plus féconde, exige d'abandonner certaines certitudes rassurantes pour explorer des territoires conceptuels inédits. Elle requiert également un dialogue intense et constant avec les pratiques artistiques vivantes, avec les institutions culturelles en transformation, avec les sciences sociales qui analysent empiriquement les modes de production, circulation et réception des œuvres, avec les sciences naturelles et les technologies qui bouleversent nos capacités de création et de perception, avec les mouvements sociaux qui contestent les hiérarchies et les exclusions historiques. Cette introduction générale propose une cartographie raisonnée des principales problématiques, théories et débats qui structurent actuellement le champ de la philosophie de l'art. Elle adopte une perspective résolument contemporaine sans pour autant négliger les héritages historiques indispensables pour comprendre la généalogie des questions présentes. Elle accorde une attention particulière aux développements théoriques récents, aux pratiques artistiques émergentes, aux transformations institutionnelles en cours, tout en les inscrivant dans les continuités longues de la réflexion esthétique. Elle assume explicitement une position critique vis-à-vis de nombreux présupposés de la tradition esthétique moderne tout en reconnaissant la valeur durable de certaines de ses conquêtes conceptuelles. Elle privilégie une approche pluraliste reconnaissant la légitimité de perspectives théoriques diverses plutôt que de défendre dogmatiquement une position unique, tout en maintenant une exigence de rigueur argumentative et de cohérence théorique. L'objectif est de fournir aux lecteurs, qu'ils soient étudiants, chercheurs, artistes, professionnels des institutions culturelles ou simplement citoyens désireux de comprendre les enjeux contemporains de l'art, un panorama à la fois complet et accessible des principales questions qui animent actuellement la philosophie de l'art. Il s'agit également de montrer que ces questions, loin d'être des spéculations abstraites déconnectées du réel, engagent des dimensions fondamentales de notre existence individuelle et collective : notre rapport au sensible, à la beauté, à la créativité, à la culture, aux autres, au monde naturel, aux technologies, à l'histoire, au futur. L'art n'est pas un domaine séparé et optionnel de l'expérience humaine mais une dimension constitutive de notre humanité, mode spécifique de connaissance et de transformation du monde qui mérite pleinement l'effort de compréhension philosophique le plus rigoureux. == Fondements Théoriques et Ontologie de l'Art == === La question de la définition de l'art === La problématique centrale de la [[Dictionnaire de philosophie/Définition|définition]] de l'art traverse toute l'histoire de l'esthétique et constitue sans doute son interrogation la plus fondamentale. Depuis Platon jusqu'aux débats contemporains, les philosophes se sont efforcés de déterminer ce qui distingue une œuvre d'art d'un simple objet ordinaire, ce qui confère à certains artefacts humains ce statut particulier qui les soustrait à la pure fonctionnalité ou à la simple existence matérielle. Cette question n'est pas demeurée purement académique : elle engage directement notre compréhension de la valeur culturelle, de l'expérience esthétique et du rôle que les arts jouent dans nos sociétés. Au vingtième siècle, cette interrogation connaît un renouvellement radical sous l'impulsion de transformations artistiques majeures qui mettent à mal les définitions héritées, obligeant la philosophie à repenser entièrement ses catégories. [[File:Andy-Warhol-Stockholm-1968.jpg|thumb|upright=1.2|Andy Warhol photographié par Lasse Olsson au Moderna Museet de Stockholm le 9 février 1968, devant ses ''Brillo Boxes''. Ces sculptures en bois sérigraphié, reproduisant à l'identique des cartons de savon commerciaux, ont inspiré à Arthur Danto sa théorie de la fin de l'art.]] Arthur Danto développe dans les années 1960 une théorie révolutionnaire en réponse aux ''Brillo Boxes'' d'Andy Warhol exposées en avril 1964 à la Stable Gallery de New York. Ces boîtes de savon reproduites à l'identique en bois peint posent un problème philosophique inédit : comment distinguer l'œuvre d'art de son double ordinaire lorsque les deux objets sont perceptuellement indiscernables ? Cette question devient centrale dans la philosophie dantienne de l'art. Pour Danto, un objet devient art lorsqu'il remplit deux conditions nécessaires et conjointement suffisantes. Premièrement, l'œuvre d'art possède un contenu sémantique, elle est « à propos de quelque chose » (''aboutness''), elle exprime une signification. Deuxièmement, cette signification est « incarnée » (''embodied'') dans sa forme matérielle : les moyens de présentation sont appropriés au contenu exprimé. Cette notion d'incarnation du sens (''embodied meaning'') signifie que l'œuvre ne se contente pas de véhiculer un message abstrait mais que sa matérialité même, son apparence sensible, participe intrinsèquement à la production et à l'appréhension de ce sens. La boîte Brillo de Warhol fonctionne ainsi comme œuvre d'art parce qu'elle exprime quelque chose sur la nature de l'art lui-même, sur la société de consommation et sur les frontières entre art et vie quotidienne, et que cette interrogation est précisément incarnée dans le choix d'un objet banal reproduit à l'identique. Cette approche définitionnelle s'inscrit dans ce que Danto nomme le « monde de l'art » (''artworld''), concept qu'il introduit dans son article fondateur de 1964. Le monde de l'art désigne l'ensemble des théories artistiques, des pratiques historiques, des institutions et des connaissances qui forment l'atmosphère dans laquelle un objet peut être reconnu et interprété comme art. Danto écrit qu'identifier quelque chose comme art requiert « quelque chose que l'œil ne peut déceler : une atmosphère de théorie artistique, une connaissance de l'histoire de l'art, un monde de l'art ». Ce monde de l'art s'enrichit rétroactivement au fil du temps : chaque nouvelle œuvre introduisant des prédicats artistiquement pertinents jusqu'alors inconnus permet de redécrire l'ensemble des œuvres antérieures selon ces nouveaux critères. Ainsi, l'appropriation d'objets ordinaires par Marcel Duchamp avec son urinoir ''Fontaine'' (1917) ou sa pelle à neige ''In Advance of the Broken Arm'' (1915) introduit le prédicat « être perceptuellement indiscernable des choses réelles », qui devient dès lors applicable rétroactivement à l'ensemble de l'histoire de l'art, permettant de nouvelles interprétations des œuvres passées selon ce nouveau critère. Cette dimension historique du monde de l'art explique pourquoi certaines œuvres ne pouvaient être créées qu'à des moments spécifiques : les conditions théoriques et culturelles de leur reconnaissance comme art n'existaient pas auparavant. La théorie dantienne culmine dans sa thèse provocatrice de la « fin de l'art », développée notamment dans ''After the End of Art'' (1997). Selon Danto, l'art moderniste, de l'impressionnisme au pop art, constitue une période durant laquelle l'art s'interroge progressivement sur sa propre nature. Les artistes modernistes font de la question « qu'est-ce que l'art ? » le contenu même de leurs œuvres. Malevitch avec son ''Carré noir'' (1915) interroge la nécessité de la représentation figurative, Duchamp avec ses ready-mades questionne la nécessité du faire artistique manuel, Warhol avec ses Brillo Boxes démontre que n'importe quoi peut devenir art. En 1964, lorsque Warhol expose ses boîtes, l'art atteint selon Danto sa maturité philosophique : il a découvert sa propre essence, les conditions qui le définissent sont portées à la conscience dans le domaine artistique lui-même. Dès lors, aucun style ni mouvement ne peut prétendre représenter la vérité historique de l'art. Cette « fin de l'art » ne signifie nullement que la production artistique cesse, mais qu'elle n'a plus de signification historique au sens hégélien : l'art entre dans une période post-historique caractérisée par un pluralisme radical où toutes les formes coexistent sans hiérarchie, où les artistes peuvent librement combiner et recombiner des formes connues sans que ces innovations constituent des développements historiques nécessaires. Cette thèse présuppose une philosophie substantielle de l'histoire selon laquelle l'art se développait nécessairement vers cette auto-compréhension philosophique. L'approche essentialiste de Danto contraste radicalement avec l'anti-essentialisme défendu dès les années 1950 par Morris Weitz. S'inspirant de la philosophie tardive de Ludwig Wittgenstein et particulièrement de sa notion de « ressemblances de famille » (''Familienähnlichkeit''), Weitz soutient dans son article influent « The Role of Theory in Aesthetics » (1956) qu'il est impossible et même indésirable de définir l'art par des conditions nécessaires et suffisantes. Wittgenstein, dans ses ''Recherches philosophiques'', démontrait qu'il n'existe pas de propriété commune à toutes les activités que nous appelons « jeux » : certains jeux sont compétitifs, d'autres non, certains requièrent de l'habileté, d'autres du hasard, certains se jouent en équipe, d'autres seuls. Ces activités forment plutôt un réseau complexe de similitudes qui se chevauchent et s'entrecroisent, comme les ressemblances physiques entre membres d'une même famille où aucun trait unique n'est partagé par tous mais où chacun partage certains traits avec quelques autres. Weitz applique ce modèle au concept d'art, affirmant que les œuvres d'art ne partagent aucune essence commune mais présentent plutôt des ressemblances partielles et variables. Tenter de définir l'art reviendrait à figer artificiellement un concept qui est par nature « ouvert » (''open concept''), c'est-à-dire susceptible d'extensions imprévisibles vers de nouvelles formes artistiques. Imposer une définition fermée limiterait la créativité artistique en excluant d'avance des pratiques innovantes qui ne correspondraient pas aux critères établis. L'argument de Weitz possède une force considérable : l'histoire de l'art montre effectivement que chaque nouvelle avant-garde transgresse les définitions antérieures, qu'il s'agisse de l'[[Dictionnaire de philosophie/Abstraction|abstraction]] rompant avec la figuration, du ready-made contestant la nécessité de la fabrication manuelle, ou de l'art conceptuel remettant en cause la matérialité même de l'œuvre. Toute définition formulée à un moment donné risque d'être invalidée par des développements ultérieurs. Weitz suggère que plutôt que de chercher à définir l'art, les philosophes feraient mieux de s'intéresser aux usages du concept d'art dans différents contextes, suivant ainsi l'approche wittgensteinienne d'analyse du langage ordinaire. Cette position anti-essentialiste a exercé une influence majeure sur l'esthétique analytique pendant plusieurs décennies, Margaret Macdonald ayant d'ailleurs développé des [[Dictionnaire de philosophie/Argument|arguments]] similaires dès le début des années 1950, avant même Weitz, selon des recherches récentes. Néanmoins, la position de Weitz soulève des objections sérieuses. Si l'art n'a pas de définition, comment pouvons-nous identifier ce qui relève ou non du domaine artistique ? Comment distinguer une innovation artistique légitime d'un objet qui n'est simplement pas de l'art ? L'ouverture du concept ne risque-t-elle pas de conduire à une dilution complète où tout pourrait prétendre au statut d'art ? De plus, affirmer que l'art ne peut être défini constitue déjà une forme de théorie générale sur la nature de l'art, ce qui semble contradictoire avec le refus même de théoriser. Maurice Mandelbaum, dans sa critique de Weitz (1965), souligne que les ressemblances de famille wittgensteiniennes concernent des propriétés manifestes et directement observables, alors que dans le cas de l'art, ce qui fait qu'un objet est une œuvre d'art pourrait relever de propriétés relationnelles non manifestes, comme l'intention de l'artiste ou l'inscription dans un contexte institutionnel. Dès lors, l'impossibilité de trouver des propriétés manifestes communes ne prouve pas l'impossibilité d'une définition basée sur des propriétés relationnelles ou institutionnelles. Danto lui-même reconnaît la pertinence de l'analyse wittgensteinienne tout en contestant ses conclusions. Dans plusieurs textes, il admet que Weitz a raison de souligner la diversité irréductible des œuvres d'art et l'impossibilité de les subsumer sous des propriétés perceptuelles communes. Cependant, Danto maintient qu'il existe bel et bien une essence de l'art, mais que cette essence ne réside pas dans des qualités sensibles ou formelles mais dans des propriétés sémantiques et relationnelles : être à propos de quelque chose et incarner ce contenu dans une forme appropriée. Ces conditions transcendent les variations historiques et stylistiques : elles s'appliquent aussi bien aux peintures rupestres préhistoriques qu'aux installations contemporaines, pourvu que l'objet soit interprété comme porteur de sens dans le cadre du monde de l'art. Danto se proclame ainsi à la fois historiciste et essentialiste : historiciste parce qu'il reconnaît que la reconnaissance concrète des œuvres dépend du contexte historique et théorique, essentialiste parce qu'il affirme l'existence de conditions définitionnelles invariantes qui distinguent ontologiquement l'art du non-art. Cette tension entre essentialisme et historicisme traverse toute la philosophie contemporaine de l'art. Thierry de Duve, dans son ouvrage majeur ''Kant after Duchamp'' (1996), propose une voie médiane qui reconnaît la transformation historique radicale opérée par les avant-gardes tout en maintenant la structure formelle du jugement esthétique kantien. Pour de Duve, le jugement esthétique moderne ne dit plus « ceci est beau » comme chez [[Philosophie/Vocabulaire/Kant|Kant]], mais « ceci est de l'art ». Cette substitution ne constitue pas un simple changement de vocabulaire mais marque le passage de la modernité esthétique à la condition contemporaine. Le readymade duchampien incarne cette transformation : en désignant un objet manufacturé ordinaire comme art, Duchamp force le spectateur à formuler un jugement de type nouveau, qui ne porte plus sur la beauté mais sur l'appartenance à la catégorie de l'art elle-même. De Duve montre que ce jugement conserve néanmoins la structure universalisante du jugement kantien : en affirmant « ceci est de l'art », le spectateur prétend à l'assentiment d'autrui, il invite les autres à partager son appréciation. La différence réside dans l'objet du jugement et dans les critères mobilisés, qui ne sont plus ceux de la beauté désintéressée mais ceux de l'appartenance au monde de l'art et de la pertinence conceptuelle. Le débat entre essentialistes et anti-essentialistes révèle finalement deux conceptions profondément différentes de la philosophie de l'art et de ses objectifs. Les anti-essentialistes privilégient une approche descriptive et ouverte, attentive à la diversité des pratiques artistiques et soucieuse de ne pas contraindre la création future par des définitions rigides. Les essentialistes recherchent au contraire des principes explicatifs généraux permettant de comprendre ce qui distingue ontologiquement l'art des autres activités humaines, même si ces principes doivent être suffisamment abstraits pour accommoder l'immense variété des formes artistiques. Cette opposition structure encore largement les discussions contemporaines, même si des positions intermédiaires tentent de concilier reconnaissance de la diversité historique et recherche de critères définitionnels, comme le propose notamment la théorie institutionnelle de George Dickie ou les définitions fonctionnalistes qui voient dans l'art non une essence fixe mais un rôle social et culturel spécifique. La question de la définition de l'art demeure ainsi un chantier philosophique ouvert, constamment renouvelé par les transformations des pratiques artistiques elles-mêmes. === Modernisme et spécificité du médium === [[File:Kazimir Malevich, 1915, Black Suprematic Square, oil on linen canvas, 79.5 x 79.5 cm, Tretyakov Gallery, Moscow.jpg|thumb|300px|Kazimir Malevitch, ''Carré noir'' (1915). Œuvre suprématiste qui interroge la nécessité de la représentation figurative.]] Clement Greenberg demeure la figure tutélaire du modernisme formaliste et l'un des critiques d'art les plus influents du vingtième siècle. Sa théorisation de l'art moderniste, développée principalement entre les années 1940 et 1960, a durablement marqué la compréhension de la peinture abstraite et de l'expressionnisme abstrait américain. Dans son essai fondateur « Modernist Painting » publié en 1960 pour la série Forum Lectures de Voice of America, Greenberg articule une vision cohérente du modernisme comme processus d'autocritique disciplinaire. Il identifie [[Philosophie/Vocabulaire/Kant|Kant]] comme le premier véritable moderniste, dans la mesure où le philosophe prussien fut le premier à utiliser les méthodes caractéristiques d'une discipline pour critiquer cette discipline elle-même. Kant utilisa la logique pour établir les limites de la logique, délimitant avec précision son domaine de compétence légitime. Le modernisme prolonge et généralise cette démarche kantienne dans tous les domaines de l'activité culturelle, y compris les arts. Selon Greenberg, l'essence du modernisme réside dans l'usage des méthodes caractéristiques d'une discipline pour critiquer cette discipline de l'intérieur, non pas dans le but de la subvertir mais au contraire de l'ancrer plus fermement dans son domaine de compétence spécifique. Cette autocritique moderniste se distingue radicalement de la critique des Lumières qui s'exerçait de l'extérieur, imposant aux différentes pratiques culturelles des critères rationnels généraux. Le modernisme critique de l'intérieur, à travers les procédures mêmes de ce qui est critiqué. Les arts se trouvèrent confrontés à une exigence de justification rationnelle après que les Lumières leur eurent retiré toutes les tâches qu'ils pouvaient prendre au sérieux, notamment les fonctions religieuses, morales ou didactiques. Face à la menace d'être assimilés au simple [[Dictionnaire de philosophie/Divertissement|divertissement]] ou à la thérapie, les arts ne pouvaient se sauver qu'en démontrant que le type d'expérience qu'ils procuraient possédait une valeur propre, irréductible à celle fournie par toute autre activité. Chaque art devait effectuer cette démonstration pour son propre compte, exhibant non seulement ce qui était unique et irréductible dans l'art en général, mais aussi ce qui était unique et irréductible dans chaque art particulier. Chaque art devait déterminer, à travers ses propres opérations et œuvres, les effets qui lui étaient exclusifs. Ce faisant, il rétrécissait certes son domaine de compétence, mais rendait du même coup sa possession de ce domaine d'autant plus certaine et incontestable. Il apparut rapidement que le domaine propre et unique de chaque art coïncidait avec tout ce qui était unique dans la nature de son médium. La tâche de l'autocritique devint ainsi d'éliminer des effets spécifiques de chaque art tout effet qui pourrait être emprunté au médium de n'importe quel autre art. Chaque art serait ainsi rendu « pur », et dans cette « pureté » trouverait la garantie à la fois de ses standards de qualité et de son indépendance. La pureté signifiait l’auto-définition, et l'entreprise d'autocritique dans les arts devint une entreprise d’auto-définition acharnée. Greenberg utilise le terme « pureté » entre guillemets pour signaler qu'il s'agit d'un idéal régulateur plutôt que d'un état absolument réalisable, mais cela n'empêche pas cette notion de structurer toute sa compréhension de l'évolution de l'art moderne. L'art réaliste et naturaliste avait dissimulé le médium, utilisant l'art pour cacher l'art et créer l'illusion d'une fenêtre transparente ouvrant sur le monde. Le modernisme inversait cette logique : il utilisait l'art pour attirer l'attention sur l'art lui-même. Les limitations qui constituent le médium de la peinture, à savoir la surface plane, la forme du support et les propriétés du pigment, étaient traitées par les Anciens Maîtres comme des facteurs négatifs qui ne pouvaient être reconnus qu'implicitement ou indirectement. Sous le modernisme, ces mêmes limitations en vinrent à être considérées comme des facteurs positifs et furent reconnues ouvertement. Pour la peinture, cette essence résidait dans la planéité inéluctable de la surface picturale. Édouard Manet produisit les premières peintures véritablement modernistes en vertu de la franchise avec laquelle elles déclaraient les surfaces planes sur lesquelles elles étaient peintes. Les impressionnistes, dans le sillage de Manet, renoncèrent aux sous-couches et aux glacis pour ne laisser aucun doute à l'œil sur le fait que les couleurs qu'ils utilisaient étaient faites de peinture sortant de tubes ou de pots. Paul Cézanne sacrifia la vraisemblance ou la correction pour adapter son dessin et sa composition plus explicitement à la forme rectangulaire de la toile. Greenberg soutient que l'insistance sur la planéité de la surface demeura plus fondamentale que tout autre aspect dans les processus par lesquels l'art pictural se critiqua et se définit sous le modernisme. Car la planéité seule était unique et exclusive à l'art pictural. La forme enclose du tableau constituait une condition limitative, ou norme, qui était partagée avec l'art du théâtre ; la couleur était une norme et un moyen partagés non seulement avec le théâtre mais aussi avec la sculpture. Parce que la planéité était la seule condition que la peinture ne partageait avec aucun autre art, la peinture moderniste s'orienta vers la planéité comme vers rien d'autre. Les Anciens Maîtres avaient compris qu'il était nécessaire de préserver ce qu'on appelle l'intégrité du plan pictural, c'est-à-dire de signifier la présence permanente de la planéité en dessous et au-dessus de l'illusion la plus vive d'espace tridimensionnel. La contradiction apparente était essentielle au succès de leur art, comme elle l'est à celui de tout art pictural. Les modernistes n'ont ni évité ni résolu cette contradiction ; ils en ont plutôt inversé les termes. Le spectateur prend conscience de la planéité de leurs tableaux avant, au lieu d'après, avoir pris conscience de ce que la planéité contient. Alors qu'on tend à voir ce qui se trouve dans un Ancien Maître avant de voir le tableau lui-même, on voit un tableau moderniste comme tableau d'abord. C'est là, bien entendu, la meilleure façon de voir n'importe quel type de tableau, qu'il soit ancien ou moderniste, mais le modernisme l'impose comme la seule et nécessaire façon, et le succès du modernisme à le faire constitue un succès de l'autocritique. La peinture moderniste dans sa phase la plus récente n'a pas abandonné en principe la représentation d'objets reconnaissables. Ce qu'elle a abandonné en principe, c'est la représentation du type d'espace que peuvent habiter des objets reconnaissables. L'[[Dictionnaire de philosophie/Abstraction|abstraction]], ou le non-figuratif, ne s'est pas encore avéré un moment absolument nécessaire dans l'autocritique de l'art pictural, même si des artistes aussi éminents que Kandinsky et Mondrian l'ont pensé. Ce qui aliène véritablement l'espace pictural de la bidimensionnalité littérale qui garantit l'indépendance de la peinture comme art, ce sont les associations d'objets représentés. Toutes les entités reconnaissables, incluant les tableaux eux-mêmes, existent dans l'espace tridimensionnel, et la plus mince suggestion d'une entité reconnaissable suffit à évoquer des associations de ce type d'espace. La silhouette fragmentaire d'une figure humaine ou d'une tasse de thé le fera, et ce faisant aliénera l'espace pictural de la bidimensionnalité littérale. Car, comme on l'a déjà dit, la tridimensionnalité est la province de la sculpture. Pour atteindre l'autonomie, la peinture devait avant tout se dépouiller de tout ce qu'elle pouvait partager avec la sculpture, et c'est dans son effort pour le faire, et non tant pour exclure le représentatif ou le littéraire, que la peinture s'est rendue abstraite. Cette analyse révèle que la résistance au sculptural date de bien avant l'avènement du modernisme. La peinture occidentale, dans la mesure où elle est naturaliste, doit une grande dette à la sculpture, qui lui enseigna au commencement comment ombrer et modeler pour créer l'illusion du relief, et même comment disposer cette illusion dans une illusion complémentaire d'espace profond. Pourtant, quelques-uns des plus grands exploits de la peinture occidentale sont dus à l'effort qu'elle a accompli durant les quatre derniers siècles pour se débarrasser du sculptural. [[File:Pollock-Krasner House studio floor.jpg|thumb|Le sol de l'atelier de Jackson Pollock à la Pollock-Krasner House, témoignage matériel de la technique du dripping]] Jackson Pollock incarne pour Greenberg l'aboutissement de cette logique moderniste et représente l'expression la plus avancée de la peinture d'après-guerre. Greenberg introduit en 1948 dans son essai « The Crisis of the Easel Picture » le terme « all-over » pour décrire une manière de traiter l'espace et la surface picturaux, approche qu'il identifie comme une tendance émergente dans l'art abstrait américain. Pour Greenberg, les drip paintings de Pollock incarnent l'apothéose de la technique all-over. Le tableau « décentralisé », « polyphonique », all-over, dont la surface est tissée d'une multiplicité d'éléments identiques ou similaires qui se répètent sans variation forte d'un bout à l'autre de la toile, se dissout en « pure texture, pure sensation ». Le procédé all-over consiste à répartir de manière plus ou moins uniforme les éléments picturaux sur toute la surface du tableau, qui semble ainsi se prolonger au-delà des bords, éliminant le problème du champ et de la composition hiérarchisée. Chaque coup de pinceau, ou plutôt chaque projection de peinture, annule le précédent dans son rapport à la surface du fond, créant un réseau homogène et isotrope. Pollock créait un enchevêtrement de fils de peinture s'étendant sur toute la toile, sans qu'aucune zone particulière ne soit mise en valeur comme plus intéressante qu'une autre, permettant à l'œil du spectateur d'errer sur l'ensemble de la surface. Bien qu'on puisse trouver des points d'intérêt discrets parmi la composition, notamment des objets incorporés comme des clous, des punaises, des boutons, des cigarettes ou des allumettes dans des œuvres comme « Full Fathom Five » (1947), l'effet d'ensemble demeurait primordial pour Greenberg. La sensation immédiate de la texture du tableau, de sa répétition apparemment infinie qui pourrait se poursuivre au-delà des bords de la toile, constituait la percée de Pollock. Greenberg soutient que cette approche correspond à quelque chose de profondément ancré dans la sensibilité contemporaine, au sentiment que toutes les distinctions hiérarchiques ont été épuisées, qu'aucun domaine ou ordre d'expérience n'est intrinsèquement ou relativement supérieur à un autre. La technique du dripping que Pollock développe systématiquement à partir de 1947 consiste à déverser ou à faire goutter la peinture directement du pot sur des toiles posées à plat, en contrôlant la fluidité et l'épaisseur des lignes par le mouvement de son corps entier. Pollock lui-même décrivait ainsi sa méthode : « Je ne tends pratiquement jamais ma toile avant de peindre. Je préfère clouer ma toile non tendue au mur ou au sol. J'ai besoin de la résistance d'une surface dure. Au sol je suis plus à l'aise. Je me sens plus proche du tableau, j'en fais davantage partie ; car de cette façon, je peux marcher tout autour, travailler à partir des quatre côtés et être littéralement dans le tableau. » Cette méthode ressemble à celle des peintres indiens de l'Ouest américain qui travaillent sur le sable, établissant une continuité entre pratiques rituelles traditionnelles et modernisme pictural. L'abstraction de Pollock, loin d'être arbitraire ou décorative, réalise selon Greenberg l'insistance impressionniste sur l'optique comme seul sens qu'un art pictural complètement et quintessentiellement pictural peut invoquer. La peinture abstraite la plus récente tente d'accomplir cette exigence en créant une illusion strictement picturale, strictement optique de troisième dimension, dans laquelle on ne peut entrer qu'avec l'œil, et non physiquement ou imaginairement comme dans l'espace illusionniste des Anciens Maîtres. Michael Fried prolonge et complexifie la pensée greenbergienne dans son article polémique « Art and Objecthood » publié en 1967 dans Artforum. Cet essai constitue l'une des interventions critiques les plus vigoureuses et controversées de l'histoire de l'art contemporain. Fried y oppose l'art moderniste authentique, caractérisé par l'absorption et la présence (« presentness »), au minimalisme ou « littéralisme » qu'il accuse de « théâtralité ». Pour Fried, la théâtralité constitue une dégradation fondamentale de l'expérience artistique car elle rend le spectateur conscient de lui-même, de sa situation spatiale et temporelle, et de sa propre relation à l'œuvre, au lieu de le transporter dans une expérience de grâce transcendante. L'art littéraliste de Donald Judd, Robert Morris et Tony Smith crée selon Fried des objets qui ne sont ni peintures ni sculptures mais de simples objets tridimensionnels dont la présence physique dans l'espace réel établit une situation théâtrale impliquant le spectateur. Cette situation est caractérisée par la durée : l'expérience de l'œuvre minimaliste se déploie dans le temps, variant selon la position et les mouvements du spectateur autour de l'objet. Cette temporalité est précisément ce que Fried refuse comme corruption de l'art. Fried affirme de manière tranchante que « l'art dégénère à mesure qu'il approche la condition du théâtre ». Le théâtre constitue le dénominateur commun qui lie ensemble une grande variété d'activités apparemment disparates. Le théâtre et la théâtralité sont aujourd'hui en guerre non seulement avec la peinture moderniste et la sculpture moderniste, mais avec l'art comme tel. Cette affirmation catégorique a suscité d'innombrables débats et controverses. Fried qualifie l'œuvre littéraliste d'« incurablement théâtrale » parce qu'elle dépend essentiellement de la situation dans laquelle elle se trouve, incluant le spectateur et l'espace environnant. L'œuvre minimaliste existe comme objet parmi d'autres objets dans le monde, plutôt que comme monde autonome dans lequel le spectateur peut être absorbé. La présence qu'elle impose est une présence physique brute, une objectité (« objecthood ») qui s'oppose à la qualité d'objet d'art (« art object »). L'expérience qu'elle procure ressemble à celle de rencontrer une autre personne, une confrontation qui engendre une conscience de soi et une auto-conscience temporelle. Cette conscience rend le spectateur théâtral, conscient de jouer un rôle dans une situation scénographique. À l'opposé de cette théâtralité dégradante, Fried valorise l'absorption et la présence caractéristiques de l'art moderniste authentique. L'absorption désigne la capacité d'une œuvre à captiver totalement l'attention du spectateur, le transportant dans un état de contemplation où il oublie sa propre situation physique et temporelle. La présence (« presentness ») constitue un instant de grâce où l'œuvre se révèle dans son intégralité, sans médiation temporelle, dans une expérience de complétude immédiate. Fried conclut son essai par l'affirmation célèbre et mystérieuse : « La présence est grâce. » Cette formulation quasi-théologique, précédée d'une épigraphe tirée du théologien puritain Jonathan Edwards sur l'assurance de la présence de Dieu, confère à l'argument esthétique de Fried une dimension spirituelle ou métaphysique. L'art authentique offre une forme d'expérience transcendante, un accès à une dimension de sens et de valeur qui excède le monde ordinaire de l'expérience pratique et sociale. Cette vision quasi-religieuse de l'art moderniste explique la véhémence avec laquelle Fried dénonce le minimalisme, qu'il perçoit comme une profanation du domaine sacré de l'art. Cette distinction entre absorption et théâtralité trouve ses racines profondes dans les travaux ultérieurs de Fried sur la peinture française du dix-huitième siècle. Dans son livre « Absorption and Theatricality: Painting and the Beholder in the Age of Diderot » publié en 1980, Fried démontre que Denis Diderot utilisait le terme « théâtral » (« le théâtral ») comme synonyme de fausseté, impliquant la conscience d'être observé. Pour être vrais, les personnages représentés dans un tableau devaient être totalement absorbés dans leur activité, ignorant le regard du spectateur, de sorte qu'ils puissent modéliser pour le spectateur l'immersion totale ou la présence. Diderot écrivait : « Si vous perdez le sentiment de la différence entre l'homme qui se présente en société et l'homme engagé dans une action, entre l'homme qui est seul et l'homme qui est regardé, jetez vos pinceaux au feu. » Il n'y a aucun intérêt à faire de l'art si l'on ne reconnaît pas la différence entre l'affectation et l'action véritable. Cette conviction diderotienne structure la philosophie esthétique de Fried : l'absorption est simple, gracieuse et vraie, tandis que l'affectation ou l'auto-conscience est laide, ordinaire et fausse. L'art devrait modéliser une sensibilité ou un mode d'être meilleur que celui largement accepté comme norme dans la société. Il importe de souligner que Greenberg lui-même prit ses distances avec certaines interprétations de son essai « Modernist Painting ». Dans un post-scriptum ajouté en 1978, il clarifiait que beaucoup de lecteurs avaient pris la « rationalité » de l'art moderniste qu'il exposait comme représentant une position qu'il adoptait lui-même, c'est-à-dire qu'il souscrivait aux choses qu'il décrivait. Greenberg insiste sur le fait qu'il tentait de rendre compte en partie de la manière dont le meilleur art des cent dernières années était apparu, mais qu'il n'impliquait pas que c'était ainsi qu'il devait apparaître, encore moins que c'était ainsi que le meilleur art devait continuer d'apparaître. L'art « pur » était une illusion utile, mais cela ne le rendait pas moins illusoire. Greenberg rejetait également l'interprétation absurde selon laquelle il considérait la planéité et l'enfermement de la planéité non seulement comme les conditions limitatives de l'art pictural, mais comme des critères de qualité esthétique, ou que plus une œuvre avançait l’auto-définition d'un art, meilleure elle était nécessairement. Ces clarifications révèlent la complexité et la subtilité de la position de Greenberg, souvent simplifiée ou caricaturée par ses critiques. Le formalisme greenbergien, malgré son influence massive, demeure une construction théorique historiquement située, tentant de donner sens à des transformations artistiques spécifiques plutôt qu'une prescription normative universelle et atemporelle pour toute création artistique future. === Le champ étendu et la critique du formalisme === Rosalind Krauss révolutionne la pensée sculpturale avec son essai fondateur « Sculpture in the Expanded Field » publié en 1979 dans la revue ''October'' qu'elle cofonde avec Annette Michelson. Cet article constitue l'une des interventions théoriques les plus influentes de l'histoire de l'art contemporain et marque un tournant décisif dans la compréhension des pratiques artistiques tridimensionnelles. Krauss y développe une critique radicale de l'historicisme qui cherche à légitimer les nouvelles pratiques artistiques en les rattachant artificiellement à une généalogie linéaire de la sculpture traditionnelle. Elle propose un modèle structural permettant de penser les pratiques artistiques émergentes des années 1960-1970 non plus comme des extensions ou des variations de la sculpture moderne mais comme des catégories autonomes occupant un « champ étendu » dont la logique organisatrice diffère fondamentalement de celle qui structurait l'art moderniste. L'essai s'ouvre sur une description saisissante d'une œuvre de Mary Miss intitulée ''Perimeters/Pavilions/Decoys'' (1978). Vers le centre d'un champ se trouve un léger monticule, un renflement qui constitue le seul avertissement de la présence de l'œuvre. En s'approchant, on peut voir la face carrée d'une excavation, ainsi que les extrémités d'une échelle qui descend dans la fosse. L'œuvre elle-même se trouve ainsi entièrement sous terre, formant un atrium à demi-tunnel, une frontière entre extérieur et intérieur, délicatement construite de poteaux et poutres de bois. Cette œuvre, Krauss la qualifie de sculpture ou, plus précisément, d'« earthwork ». Au cours des dix années précédentes, affirme-t-elle, des choses plutôt surprenantes en sont venues à porter le nom de sculpture : des corridors étroits avec des moniteurs de télévision aux extrémités, de grandes photographies documentant des randonnées en campagne, des miroirs placés à des angles étranges dans des pièces ordinaires, des lignes temporaires tracées dans le sol du désert. Rien, semblerait-il, ne pourrait donner à un tel assemblage hétéroclite d'efforts le droit de revendiquer la cohérence d'une catégorie dont nous pourrions entendre parler comme étant la sculpture, à moins que cette catégorie ne devienne presque infiniment malléable. Krauss attribue cette malléabilité excessive aux opérations critiques qui ont accompagné l'art américain d'après-guerre. Entre les mains d'une telle critique, des catégories comme sculpture et peinture ont été pétries, étirées et tordues dans une démonstration extraordinaire d'élasticité, un étalage de la manière dont un terme culturel peut être étendu pour inclure à peu près n'importe quoi. Et bien que cet étirement d'un terme tel que sculpture soit ouvertement exécuté au nom de l'esthétique d'avant-garde, l'idéologie du nouveau, son message dissimulé est celui de l'historicisme. Le nouveau est rendu confortable en étant rendu familier, puisqu'il est perçu comme ayant graduellement évolué à partir des formes du passé. L'historicisme travaille sur le nouveau et le différent pour diminuer la nouveauté et atténuer la différence. Il crée une place pour le changement dans notre expérience en évoquant le modèle de l'évolution, de sorte que l'homme qui existe maintenant puisse être accepté comme étant différent de l'enfant qu'il était autrefois, tout en étant simultanément perçu, à travers l'action invisible du telos, comme étant le même. Et nous sommes rassurés par cette perception de similitude, cette stratégie pour réduire tout ce qui est étranger, que ce soit dans le temps ou l'espace, à ce que nous connaissons déjà et sommes. Cette critique de l'historicisme vise directement l'approche greenbergienne et son postulat d'une évolution linéaire de l'art vers une pureté croissante. Pour légitimer les nouvelles formes artistiques incompatibles avec la définition moderniste de la sculpture, les critiques historicistes élargissent rétroactivement la généalogie de la sculpture pour y inclure des structures anciennes telles que Stonehenge, les lignes de Nazca au Pérou, les tumuli néolithiques ou les jardins japonais, aucune de ces réalisations n'ayant été conçue comme sculpture au sens moderne du terme. Cette manœuvre rhétorique permet de présenter les earthworks contemporains comme s'inscrivant dans une tradition millénaire, dissimulant ainsi la rupture radicale qu'ils représentent par rapport à la logique moderniste. Krauss refuse cette manipulation historiciste et propose une approche structurale qui reconnaît explicitement la discontinuité entre modernisme et postmodernisme. [[File:Coloana fără Sfârșit.jpg|thumb|upright=0.7|Constantin Brâncuși, ''Colonne sans fin'' (''Coloana fără sfârșit''), 1937-1938, Târgu Jiu, Roumanie. Cette œuvre monumentale de 29,33 mètres illustre la recherche brancusienne de la forme pure et de l'essence spirituelle.]] La sculpture moderniste, dans sa logique interne, s'était définie négativement : sculpture était ce qui se trouvait sur ou devant un piédestal, donc ce qui n'était pas architecture (le piédestal faisant la médiation entre l'œuvre sculpturale et le site architectural). Simultanément, la sculpture se définissait comme ce qui n'était pas paysage : l'œuvre possédait une autonomie, une autosuffisance qui la séparait du site environnant. Le piédestal fonctionnait précisément comme médiateur entre l'espace architectural et la sculpture, assurant que l'œuvre demeure distincte à la fois de l'architecture et du paysage. Cette double négation définissait positivement l'espace propre de la sculpture moderniste. Auguste Rodin, dans ses expérimentations avec le socle, notamment dans le ''Monument à Balzac'' (1897) ou ''Les Bourgeois de Calais'' (1889), amorce déjà une problématisation de cette convention, explorant les possibilités de réduire ou d'éliminer le piédestal. Constantin Brancusi poursuit cette investigation, transformant le socle en partie intégrante de l'œuvre sculpturale elle-même, comme dans sa ''Colonne sans fin'' (1918-1938) où le socle devient l'œuvre. Au cours des années 1950 et 1960, la sculpture moderniste entreprend une extension de cette logique négative. Les sculpteurs minimalistes éliminent le piédestal, plaçant leurs œuvres directement sur le sol, abolissant ainsi la médiation traditionnelle entre sculpture et architecture. Cette manœuvre transforme le site architectural en simple extension du piédestal, étendant la sculpture au-delà de sa base matérielle pour englober l'espace environnant. Krauss cite l'exemple d'une sculpture minimale récente du sculpteur George Trakas, ''Rock River Union'' (1976), qui consiste en un alignement de tronçons de voies ferrées posés sur le sol d'une galerie. Le site architectural devient ici partie intégrante de l'œuvre. Cependant, affirme Krauss, même si cette sculpture exclut le piédestal, ce qui la définit demeure encore essentiellement un ensemble de négations : elle n'est toujours pas paysage et elle n'est toujours pas architecture. La sculpture moderniste, même dans ses développements les plus radicaux, conserve cette structure négative, cette définition par opposition. Vers 1968-1970, un nombre important d'artistes franchissent un seuil critique qui transforme radicalement les conditions logiques de leur pratique. Robert Morris, Carl Andre, Robert Smithson, Michael Heizer, Richard Serra, Walter De Maria, Robert Irwin, Sol LeWitt et Bruce Nauman, entre autres, entrent dans une situation dont les conditions logiques ne peuvent plus être décrites comme modernistes. Pour nommer cette rupture historique et la transformation structurelle du champ culturel qui la caractérise, il faut recourir à un autre terme, celui de postmodernisme. Krauss construit un diagramme structural, inspiré du « groupe de Klein » utilisé en mathématiques et en théorie structuraliste, pour cartographier ce nouveau territoire. Ce diagramme quaternaire prend pour point de départ les deux termes négatifs qui définissaient la sculpture moderniste : non-architecture et non-paysage. En inversant ces termes pour produire leurs contraires positifs (architecture et paysage), puis en générant les termes complexes résultant de l'addition de chaque terme à son contraire, Krauss obtient quatre positions logiques qui définissent le champ étendu. Le diagramme de Krauss situe la sculpture comme un terme parmi d'autres, occupant la position neutre définie par la double négation (non-architecture ET non-paysage). Les trois autres positions du champ étendu correspondent à des pratiques artistiques émergentes. La position « site marqué » (''marked site'') combine paysage et non-architecture : il s'agit d'interventions qui marquent ou transforment un site paysager sans pour autant construire une structure architecturale. Les earthworks de Robert Smithson, notamment sa ''Spiral Jetty'' (1970) construite dans le Grand Lac Salé de l'Utah, exemplifient cette catégorie. Smithson projette dans le paysage une forme spiralée de quatre cent soixante mètres de longueur réalisée avec des roches basaltiques, de la boue et des cristaux de sel. Cette œuvre modifie le paysage lui-même, le marquant d'une intervention humaine tout en évitant toute construction architecturale permanente. La spirale s'intègre au site au point que les variations du niveau d'eau du lac la submergent périodiquement, la rendant invisible puis la révélant à nouveau, soulignant ainsi son caractère processuel et son inscription dans les cycles naturels. La position « construction de site » (''site construction'') combine architecture et paysage : il s'agit de structures qui possèdent des qualités architecturales tout en étant intimement liées à un site paysager spécifique. L'œuvre de Mary Miss ''Perimeters/Pavilions/Decoys'' mentionnée au début de l'essai illustre cette catégorie. Robert Morris crée en 1971 un observatoire en bois et tourbe en Hollande, structure à la fois architecturale et paysagère. Ces constructions ne fonctionnent pleinement que dans leur relation spécifique au site qui les accueille ; elles ne pourraient être déplacées sans perdre leur sens. Alice Aycock, dans ses labyrinthes et structures souterraines comme ''Maze'' (1972) ou ''Low Building with Dirt Roof (for Mary)'' (1973), crée des architectures élémentaires qui engagent le corps du spectateur dans une expérience spatiale intense, explorant des sensations de claustrophobie, de désorientation et de découverte. Ces œuvres combinent des techniques de construction architecturale avec une inscription paysagère qui fait du terrain lui-même un élément constitutif de l'œuvre. La position « structure axiomatique » (''axiomatic structure'') combine architecture et non-paysage : il s'agit de structures qui partagent certaines qualités de l'architecture tout en se distinguant du paysage. Cette catégorie correspond en partie au minimalisme et à certaines installations. Les boîtes de Donald Judd, bien qu'elles ne soient pas fonctionnellement architecturales, évoquent l'architecture par leur relation à l'espace, leur modularité et leur échelle. Sol LeWitt, avec ses structures modulaires répétitives, crée des œuvres qui explorent des systèmes logiques de construction sans fonction architecturale pratique. Ces structures axiomatiques fonctionnent selon des règles ou principes internes qui déterminent leur configuration, indépendamment du site spécifique qui les accueille, bien qu'elles établissent nécessairement une relation spatiale avec leur environnement d'exposition. [[File:Spiral-jetty-from-rozel-point.png|thumb|''Spiral Jetty'' (1970) de Robert Smithson, vue depuis Rozel Point. Cette œuvre emblématique du land art exemplifie la catégorie du "site marqué" dans le champ étendu de Krauss.]] L'importance théorique du modèle de Krauss réside dans sa capacité à penser ces nouvelles pratiques non comme des extensions de la sculpture mais comme des catégories distinctes possédant leurs propres logiques internes. Le champ étendu ne se définit plus par rapport à un médium spécifique (le matériau sculptural) mais par rapport à un ensemble d'opérations logiques sur des termes culturellement codés (architecture et paysage). Cette approche structurale permet à Krauss de résoudre le paradoxe apparent de pratiques artistiques qui semblent n'avoir rien en commun : elles partagent en réalité une même structure logique, même si elles utilisent des moyens matériels très différents. Un artiste peut ainsi travailler successivement dans plusieurs de ces positions sans incohérence, puisque c'est la position logique qui définit le type d'œuvre, non le matériau employé. Krauss observe que Robert Smithson occupe la position du site marqué avec ''Spiral Jetty'', mais explore également d'autres positions du champ étendu à différents moments de sa carrière. Cette théorisation implique également que le postmodernisme, contrairement au modernisme, ne se caractérise pas par la spécificité du médium mais par ce que Krauss appellera plus tard la « condition post-médium ». Dans un essai ultérieur intitulé « A Voyage on the North Sea: Art in the Age of the Post-Medium Condition » (1999), Krauss développe cette intuition, affirmant que l'art contemporain ne se définit plus par les propriétés matérielles d'un médium spécifique mais par des conventions ou des règles structurales qui peuvent se manifester à travers divers supports. Cette évolution représente une rupture fondamentale avec la logique greenbergienne qui faisait de l'auto-purification du médium le moteur du développement artistique. Pour Greenberg, chaque art devait explorer et affirmer ce qui lui était propre et irréductible ; pour Krauss au contraire, l'art postmoderne se caractérise par sa capacité à hybrider, à combiner, à travailler dans les interstices entre catégories établies. La critique que Krauss adresse à l'historicisme et au formalisme greenbergien ne se limite pas à des considérations théoriques abstraites. Elle engage une compréhension profondément différente de ce que fait l'art et de ce qu'il signifie. Là où Greenberg privilégiait l'expérience optique pure, l'immédiateté de la présence visuelle et la qualité esthétique transcendante, Krauss s'intéresse aux opérations conceptuelles, aux structures sous-jacentes et aux conventions culturelles qui rendent possible la production et la réception des œuvres. Son approche, influencée par le structuralisme français (notamment Claude Lévi-Strauss et Roland Barthes) ainsi que par la sémiotique, accorde une importance centrale aux systèmes de signification et aux cadres interprétatifs dans lesquels les œuvres s'inscrivent. Cette perspective théorique marque le passage d'une esthétique de la perception immédiate à une esthétique de la réflexion conceptuelle, d'un intérêt pour les qualités formelles à une attention portée aux opérations logiques et aux contextes culturels. Les implications du modèle du champ étendu dépassent largement le domaine de la sculpture. De nombreux théoriciens ont tenté d'adapter le diagramme de Krauss à d'autres disciplines artistiques. Dans le domaine de l'architecture, l'exposition et le catalogue « Architecture in the Expanded Field » organisés en 2012 au Wattis Institute à San Francisco, conçus par Ila Berman et Douglas Burnham, appliquent la méthodologie kraussienne pour analyser les pratiques architecturales contemporaines qui brouillent les frontières entre architecture, installation, sculpture, design d'intérieur et paysage. Le pavillon de la Serpentine Gallery de Toyo Ito, les installations de SHoP Architects ou les environnements immersifs de Ryoji Ikeda et Tomas Saraceno sont analysés comme occupant des positions dans un champ étendu de l'architecture, explorant des idées architecturales et expérimentant avec des stratégies technologiques émergentes sans produire des bâtiments fonctionnels permanents. De même, des adaptations du modèle de Krauss ont été proposées pour la performance, la photographie, le cinéma et même la pratique curatoriale, témoignant de la fécondité heuristique de cette approche structurale. Néanmoins, le modèle de Krauss a aussi suscité des critiques et des réserves. Certains commentateurs ont souligné que le diagramme quaternaire, malgré sa prétention à l'objectivité structurale, demeure une construction théorique contingente qui reflète un moment historique spécifique plutôt qu'une structure universelle et atemporelle. Les catégories qu'il propose correspondent aux pratiques artistiques émergentes des années 1970 mais peinent à accommoder les développements ultérieurs, notamment l'art numérique, l'art biotechnologique ou les pratiques relationnelles qui ne se laissent pas facilement subsumer sous les oppositions architecture/paysage. D'autres critiques ont questionné la pertinence de maintenir la sculpture comme terme central du diagramme alors même que Krauss démontre que les pratiques postmodernes dépassent cette catégorie. Si la sculpture n'est qu'une position parmi d'autres dans le champ étendu, pourquoi conserver ce terme comme point de référence privilégié ? Cette objection suggère que Krauss, tout en critiquant l'historicisme, reproduit partiellement sa logique en maintenant une continuité terminologique avec la tradition qu'elle prétend dépasser. Malgré ces limites, « Sculpture in the Expanded Field » demeure un texte fondateur qui a profondément renouvelé la compréhension des pratiques artistiques contemporaines. En proposant un modèle structural capable de penser la diversité des formes artistiques postmodernes sans les réduire à des variantes d'une tradition unifiée, Krauss ouvre la voie à une théorisation pluraliste qui reconnaît la légitimité de pratiques radicalement hétérogènes. Son refus de l'historicisme linéaire et son insistance sur les ruptures et discontinuités historiques anticipent les débats ultérieurs sur la périodisation et la caractérisation du contemporain. Enfin, sa critique du formalisme greenbergien, menée depuis une position initialement formée par ce même formalisme, illustre la possibilité d'une auto-critique productive qui ne rejette pas simplement les paradigmes antérieurs mais les transforme dialectiquement en incorporant leurs acquis tout en dépassant leurs limitations. Cette capacité à penser le changement artistique non comme simple évolution mais comme restructuration logique du champ des possibles demeure l'apport le plus durable de Krauss à la théorie de l'art contemporain. == Esthétique et Expérience de l'Art == === Critique de l'interprétation et attention au sensible === Susan Sontag ouvre une voie critique majeure avec son essai polémique « Against Interpretation » publié pour la première fois en décembre 1964 dans la revue ''Evergreen Review'' avant d'être repris dans son recueil fondateur ''Against Interpretation and Other Essays'' en 1966. Cet essai constitue l'une des interventions les plus influentes de la critique culturelle du vingtième siècle et inaugure une nouvelle manière de penser le rapport à l'art qui privilégie l'expérience sensible sur l'excavation herméneutique. Sontag y dénonce avec véhémence l'herméneutique dominante qui réduit les œuvres d'art à leur contenu présumé, substituant à l'expérience sensible immédiate une démarche intellectuelle qui, selon elle, appauvrit fondamentalement l'art. Son argument procède d'une analyse historique de l'émergence de l'interprétation comme pratique critique, suivie d'un diagnostic de ses effets délétères sur l'art contemporain, pour culminer dans l'appel célèbre à développer une « érotique de l'art » qui privilégierait l'expérience directe des formes plutôt que l'excavation systématique des significations cachées. Sontag commence par établir une distinction cruciale entre deux conceptions de l'art. La première, qu'elle attribue à la pensée mimétique platonicienne, comprend l'art comme imitation de la réalité. Dans cette perspective, l'art ne possède pas de valeur propre mais fonctionne comme représentation plus ou moins fidèle d'une réalité qui lui préexiste et qui seule possède une véritable importance. Platon, dans ''La République'', condamne notablement les artistes comme producteurs d'illusions trompeuses, situant leurs créations à deux degrés de distance de la [[Dictionnaire de philosophie/Vérité|vérité]] : le lit particulier fabriqué par l'artisan imite l'Idée du lit, et la peinture du lit imite à son tour cet objet particulier. L'art occupe ainsi le rang le plus bas dans la hiérarchie ontologique. La deuxième conception, qui émerge au vingtième siècle, envisage l'art comme expression subjective, comme extériorisation des sentiments, émotions ou perceptions intérieures de l'artiste. Cette approche expressiviste, bien qu'apparemment plus favorable à l'art que le mépris platonicien, pose selon Sontag un problème similaire : elle présuppose que l'art possède un contenu, quelque chose qu'il dit ou exprime, distinct de sa forme sensible. Cette bifurcation entre forme et contenu constitue précisément ce que Sontag identifie comme la racine du problème. En distinguant ce que l'art dit de la manière dont il le dit, en séparant le sens de l'apparence, la critique traditionnelle instaure une hiérarchie implicite où le contenu prime sur la forme, où la signification transcende la matérialité sensible de l'œuvre. Sontag écrit avec force : « Quelle que soit sa pertinence dans le passé, l'idée de contenu constitue aujourd'hui principalement un obstacle, une nuisance, un philistinisme subtil ou pas si subtil. » Cette affirmation provocatrice vise directement la pratique critique dominante de son époque qui, face à toute œuvre d'art, pose invariablement la question : que signifie-t-elle ? Quel est son contenu ? Que veut-elle dire ? Pour Sontag, cette insistance sur le contenu révèle une incapacité à accepter l'art dans sa pure présence sensible, une anxiété face à l'immédiateté de l'expérience esthétique qui doit être apaisée par la traduction de l'œuvre en un discours conceptuel. Sontag trace l'origine de la pratique interprétative à l'antiquité tardive, lorsque le pouvoir et la crédibilité du mythe avaient été brisés par la vision « réaliste » du monde introduite par l'illumination scientifique. Face à des textes fondateurs comme les poèmes homériques dont les contenus littéraux étaient devenus embarrassants ou inacceptables pour des esprits rationnels, les philosophes stoïciens développèrent la méthode de l'interprétation allégorique. Plutôt que de rejeter ces textes, ils les réinterprétèrent comme véhicules de vérités philosophiques ou morales cachées sous le voile de la fable mythologique. Zeus n'était plus littéralement un dieu, mais représentait allégoriquement le pouvoir, la justice ou un principe cosmique quelconque. Philon d'Alexandrie, philosophe juif hellénisé du premier siècle, appliqua systématiquement cette méthode aux textes bibliques : l'exode d'Égypte, l'errance dans le désert pendant quarante ans et l'entrée en terre promise constituaient en réalité une allégorie de l'émancipation, des tribulations et de la délivrance finale de l'âme individuelle. Cette pratique allégorique permettait de sauver des textes anciens en les rendant acceptables pour une sensibilité contemporaine, réconciliant tradition et raison. Sontag reconnaît la légitimité historique de cette démarche dans son contexte originel, mais affirme que les conditions qui la justifiaient ont disparu. L'interprétation moderne ne vise plus à sauver des textes anciens mais s'exerce sur des œuvres contemporaines qui n'ont aucun besoin d'être « sauvées ». La pratique interprétative moderne, écrit Sontag, « creuse et, en creusant, détruit ; elle fouille derrière le texte pour trouver un sous-texte qui serait le véritable texte ». Les doctrines les plus célèbres et influentes de la modernité, celles de [[Dictionnaire de philosophie/Karl Marx|Marx]] et de Freud, constituent selon elle des systèmes élaborés d'herméneutique, des « théories agressives et impies de l'interprétation ». L'herméneutique marxiste interprète les œuvres d'art comme expressions des rapports de production et des idéologies de classe, dévoilant sous l'apparence esthétique les contradictions économiques et sociales qui la déterminent. L'herméneutique freudienne déchiffre dans les œuvres les pulsions refoulées de l'artiste, les complexes inconscients qui s'y expriment de manière déguisée, transformant le tableau ou le poème en symptôme psychopathologique. Par « interprétation », Sontag précise qu'elle n'entend pas le sens large nietzschéen selon lequel « il n'y a pas de faits, seulement des interprétations », c'est-à-dire l'idée que toute perception implique déjà une construction perspectivale. Elle vise un sens beaucoup plus spécifique : « un acte conscient de l'esprit qui illustre un certain code, certaines 'règles' d'interprétation ». Dirigée vers l'art, l'interprétation consiste à prélever un ensemble d'éléments de l'œuvre entière et à affirmer : « Voyez-vous, X signifie réellement A, Y signifie réellement B, Z signifie réellement C. » Il s'agit d'une opération de traduction qui substitue à l'œuvre dans sa complexité sensible un schéma conceptuel censé révéler sa véritable signification. Cette pratique repose sur deux présupposés dommageables : d'abord, que l'œuvre dissimule son sens véritable sous des apparences trompeuses ; ensuite, que la tâche du critique consiste à percer ce voile d'apparence pour extraire le noyau de signification authentique qui se cache en dessous. L'interprétation fait ainsi de l'art « un article d'usage, destiné à être rangé dans un schéma mental de catégories ». Sontag diagnostique dans la culture de son époque une « hypertrophie de l'intellect aux dépens de l'énergie et de la capacité sensuelle ». La société moderne se caractérise par une surproduction matérielle, une « abondance matérielle » qui émousse et anéantit les sens. Les automobiles et l'industrie lourde empoisonnent l'atmosphère urbaine de leurs fumées ; similairement, « l'effusion d'interprétations de l'art aujourd'hui empoisonne nos sensibilités ». L'interprétation constitue « la revanche de l'intellect sur l'art », et même plus, « la revanche de l'intellect sur le monde ». Interpréter, c'est appauvrir et dépléter le monde afin d'instaurer un monde fantomatique de « significations ». C'est transformer le monde en « ce » monde, comme s'il pouvait en exister un autre. Ce diagnostic sontaguien d'une anesthésie sensorielle généralisée rappelle les analyses contemporaines de la société du spectacle par Guy Debord ou de l'industrie culturelle par Theodor Adorno et Max Horkheimer, bien que Sontag se garde de tout engagement systématiquement marxiste. Face à cette situation, quelle alternative Sontag propose-t-elle ? Elle ne prône certainement pas un silence complet face aux œuvres d'art, ni l'abandon de toute réflexion critique. Sa position demeure plus nuancée et plus subtile qu'une lecture superficielle pourrait le suggérer. Sontag appelle à développer un vocabulaire critique descriptif plutôt que prescriptif, un langage des formes plutôt qu'une herméneutique des contenus. « Ce dont nous avons besoin, c'est d'un vocabulaire — un vocabulaire descriptif, plutôt que prescriptif — pour les formes. » La meilleure critique, affirme-t-elle, et elle est rare, dissout les considérations de contenu dans celles de forme. Également précieux seraient des actes critiques qui fourniraient une description vraiment précise, aiguë et aimante de l'apparence d'une œuvre d'art, des essais « qui révèlent la surface sensuelle de l'art sans y patauger ». Cette formulation indique que Sontag ne rejette pas l'écriture sur l'art mais préconise un type d'écriture différent : une écriture qui reste au plus près de la matérialité sensible de l'œuvre, qui décrit avec précision et amour ce qui se donne à voir, à entendre, à sentir, plutôt que de percer au-delà des apparences vers des profondeurs cachées hypothétiques. Sontag invoque positivement certaines œuvres d'art contemporaines qui, par leur nature même, résistent à l'interprétation et forcent le spectateur à demeurer attentif à leur surface. Elle mentionne notamment l'art [[Dictionnaire de philosophie/Abstraction|abstrait]], qui ne représente rien et ne peut donc pas être décodé selon une grille allégorique, ainsi que l'art pop d'Andy Warhol et Jasper Johns dont les boîtes Brillo ou les drapeaux américains refusent la profondeur symbolique en présentant des objets banals dans toute leur platitude littérale. Ces œuvres incarnent ce que Sontag appelle la « transparence », valeur suprême et libératrice dans l'art. La transparence signifie « faire l'expérience de la luminosité de la chose en soi, des choses telles qu'elles sont ». L'art transparent ne prétend pas à signifier autre chose que lui-même ; il existe dans sa pure présence matérielle et sensible. Un tableau transparent n'invite pas à chercher ce qu'il représente ou symbolise, mais offre simplement la rencontre avec des formes, des couleurs, des textures, des relations spatiales qui s'organisent sur une surface. Le cinéma occupe une place particulière dans la réflexion de Sontag, étant selon elle l'art le plus piteusement victime de la surinterprétation. Sontag prend l'exemple d'une scène du film ''Le Silence'' d'Ingmar Bergman dans laquelle un tank roule dans une rue nocturne déserte. Des critiques ont interprété ce tank comme symbole phallique. Sontag concède que Bergman a peut-être intentionnellement conçu l'image comme telle, mais ajoute immédiatement : « si c'est le cas, c'était une pensée stupide ». Même si l'artiste a délibérément introduit un symbole, cela ne légitime pas l'interprétation symbolique si celle-ci appauvrit l'expérience de l'œuvre. Ce qui importe n'est pas ce que le tank « signifie » mais la puissance visuelle de l'image elle-même, la présence inquiétante de cette masse métallique mécanique dans l'espace urbain nocturne, les sonorités qu'elle produit, l'atmosphère qu'elle crée. Chaque film, écrit Sontag, fait l'objet de dizaines de critiques qui se concentrent exclusivement sur le « sens » du film, sur ses parallèles supposés, comme si un bon film ne pouvait qu'être allégorique. L'essai culmine dans l'affirmation célèbre et énigmatique : « À la place d'une herméneutique, nous avons besoin d'une érotique de l'art. » Cette formule saisissante a suscité d'innombrables commentaires et débats, souvent mal compris ou sur-interprétés. Par « érotique de l'art », Sontag ne suggère pas que l'expérience artistique doive se limiter à une pure sensation physique déconnectée de toute dimension intellectuelle ou réflexive. Elle n'appelle pas à un hédonisme irréfléchi ou à une célébration naïve du plaisir sensuel. Le terme « érotique » doit être compris dans un sens élargi qui dépasse la connotation strictement sexuelle. L'érotique désigne une forme d'engagement avec le monde qui mobilise la totalité de l'être — corps et esprit —, qui reste ouverte à la séduction et à la surprise, qui accepte de se laisser affecter sans chercher immédiatement à maîtriser intellectuellement ce qui se présente. Une érotique de l'art implique une réceptivité accrue, une disponibilité sensorielle et affective, une conscience intensifiée de la surface sensuelle des œuvres. Cette érotique s'oppose à l'herméneutique en tant que celle-ci représente une approche distanciée, analytique, suspicieuse qui maintient l'œuvre à distance pour mieux la disséquer. L'herméneutique creuse derrière la surface pour atteindre une profondeur cachée ; l'érotique reste attentive à la surface elle-même comme lieu où tout se joue. Cette opposition entre surface et profondeur anticipait de près de cinquante ans ce que les théoriciennes littéraires Stephen Best et Sharon Marcus nommeront en 2009 la « lecture de surface » (''surface reading''), approche critique qui refuse la « lecture symptômale » héritée de la tradition marxiste et psychanalytique qui considère les textes comme manifestations superficielles de structures profondes qu'il s'agit de dévoiler. De même, Heather Love théorisera en 2010 le « tournant descriptif » dans les études littéraires, reconnaissant explicitement la dette envers Sontag. Ces développements ultérieurs confirment la prescience de l'intervention sontaguienne et sa pertinence durable pour repenser les pratiques critiques. L'appel de Sontag à « retrouver nos sens » — « nous devons apprendre à voir davantage, à entendre davantage, à sentir davantage » — résonne également avec les développements contemporains dans les études sensorielles et l'attention portée aux dimensions affectives et corporelles de l'expérience esthétique. Le « tournant affectif » dans les sciences humaines depuis les années 2000, s'inspirant notamment des travaux de Brian Massumi et Eve Kosofsky Sedgwick, explore comment l'art agit sur les corps et les affects avant toute intellectualisation, question qui se trouve au cœur des préoccupations sontaguiennes. L'érotique de l'art peut ainsi être comprise comme une invitation à reconnaître et à valoriser ces dimensions pré-réflexives, incarnées et affectives de la rencontre avec l'art, dimensions que l'obsession herméneutique pour le sens occulte et marginalise. Il convient néanmoins de noter que la position de Sontag a suscité des objections et des réserves substantielles. Le philosophe Hans-Georg Gadamer, figure majeure de l'herméneutique philosophique au vingtième siècle, pourrait opposer à Sontag que l'interprétation ne constitue pas une violence faite à l'œuvre mais au contraire la condition de possibilité de toute compréhension. Pour Gadamer, nous sommes toujours déjà pris dans des horizons historiques et linguistiques qui médiatisent nécessairement notre accès aux œuvres. L'idée d'une rencontre immédiate, non-interprétative avec l'art relève d'une illusion naïve qui méconnaît la structure herméneutique fondamentale de l'existence humaine. Tout voir, tout entendre est déjà interpréter, car la perception elle-même s'opère à travers des schèmes conceptuels et culturels préalables. L'« innocence de l'œil » que Sontag semble valoriser n'existe pas ; comme l'écrivait Ernst Gombrich, l'œil n'est jamais innocent. Nous ne pouvons jamais simplement « voir » une œuvre ; nous la voyons toujours comme quelque chose, à travers des catégories qui organisent notre perception. D'autres critiques ont souligné que la distinction tranchée entre forme et contenu que Sontag semble présupposer demeure problématique. Dans de nombreuses œuvres d'art, forme et contenu sont inextricablement liés ; le sens ne préexiste pas à la forme qui l'exprimerait mais émerge précisément de l'organisation formelle spécifique de l'œuvre. Une description purement formelle qui ferait abstraction du contenu sémantique risquerait de manquer ce qui fait la spécificité de l'œuvre. De plus, l'injonction à « décrire » plutôt qu'à « interpréter » suppose une distinction claire entre ces deux opérations qui, à l'examen, se révèle difficile à maintenir. Toute description implique des choix sur ce qui mérite d'être décrit, sur les catégories descriptives appropriées, sur l'organisation du discours descriptif — autant de décisions qui engagent nécessairement une interprétation implicite. On pourrait dire que Sontag ne refuse pas tant l'interprétation en soi que certains types d'interprétation — ceux qui réduisent l'œuvre à un schéma préétabli, qui appliquent mécaniquement des grilles herméneutiques sans égard pour la singularité de l'œuvre. Malgré ces limites et ambiguïtés, « Against Interpretation » demeure un texte fondateur qui a profondément renouvelé les approches critiques de l'art. Son influence s'étend bien au-delà du champ strictement esthétique pour toucher les études littéraires, cinématographiques, culturelles. L'essai inaugure une nouvelle sensibilité critique qui valorise l'attention, la description minutieuse, la réceptivité sensorielle contre les systèmes interprétatifs totalisants. Il rappelle que l'art ne se réduit pas à un message à décoder, qu'il possède une dimension sensible, matérielle, affective irréductible aux significations conceptuelles qu'on peut en extraire. Cette insistance sur la « surface sensuelle » de l'art, sur sa présence immédiate et sa capacité à affecter les corps et les sens, continue de résonner dans les débats contemporains sur les modes de lecture, les pratiques critiques et la nature même de l'expérience esthétique. L'érotique de l'art que Sontag appelle de ses vœux demeure un horizon vers lequel tendre, un idéal régulateur qui nous invite à cultiver une relation plus vivante, plus incarnée, plus passionnée avec les œuvres qui nous entourent et nous transforment. === L'esthétique relationnelle et l'art participatif === Nicolas Bourriaud propose dans son ouvrage fondateur ''Esthétique relationnelle'' publié en 1998 aux Presses du réel une théorisation ambitieuse et controversée des pratiques artistiques des années 1990 qui placent les relations humaines et le contexte social au cœur de leur démarche. Ce livre rassemble des articles antérieurement publiés entre 1995 et 1998 dans la revue ''Documents sur l'art'' que Bourriaud avait cofondée en 1992 et dont il fut directeur jusqu'en 2000. Au moment de sa parution, l'ouvrage répond à une nécessité critique pressante : comment comprendre et évaluer des pratiques artistiques qui semblent résister aux catégories esthétiques établies, qui ne produisent pas toujours des objets matériels permanents, et qui sollicitent la participation active du spectateur devenu acteur ou participant ? Ces pratiques, jugées par certains critiques comme disparates, informes ou inclassables, souffraient d'un déficit théorique que Bourriaud entreprend de combler en proposant un cadre conceptuel unifié. Pour Bourriaud, ces artistes créent des « situations » plutôt que des objets autonomes, transformant l'art en espace de sociabilité et d'échange. L'esthétique relationnelle se définit comme « une théorie esthétique consistant à juger les œuvres d'art en fonction des relations interhumaines qu'elles figurent, produisent ou suscitent ». Bourriaud écrit que « l'art est un état de rencontre », formule synthétique qui concentre l'essentiel de son propos et qu'il emprunte à Louis Althusser qui l'appliquait à la ville comme lieu de rencontre. L'esthétique relationnelle pourrait aussi se résumer ainsi : « un art prenant pour horizon théorique la sphère des interactions humaines et son contexte social, plutôt que l'affirmation d'un espace symbolique autonome et privé ». Cette définition marque une rupture avec la conception moderniste de l'œuvre d'art comme objet autonome, autosuffisant, détaché des contingences sociales et se suffisant à lui-même dans sa pure présence formelle. Bourriaud distingue soigneusement l'esthétique relationnelle de la simple interactivité. Loin de se limiter à un « art interactif » au sens technologique du terme, il s'agit de montrer comment la sphère des relations humaines, au même titre que celle de la consommation dans les années 1960 qui avait inspiré le pop art, reconfigure les pratiques artistiques et produit des formes originales. Le principe de transitivité de l'œuvre, c'est-à-dire la relation commune qui s'établit entre l'artiste et le monde et entre le regardeur et le monde, constitue certes une constante dans toute l'histoire de l'art. Cependant, ce qui fait la particularité de l'art relationnel selon Bourriaud, c'est que cette transitivité se traduit par la « production de relations externes au champ de l'art ». La sphère des relations humaines devient elle-même « forme artistique à part entière », dépassant ainsi le caractère relationnel intrinsèque à toute œuvre d'art. L'ensemble des modes de la rencontre et de l'invention de relations représente dès lors des objets esthétiques susceptibles d'être étudiés et évalués. Les figures formelles de l'art relationnel identifiées par Bourriaud incluent la collaboration entre artistes ou avec le public, l'entretien comme format artistique, la manifestation ou l'événement collectif, la modélisation de relations sociales dans des dispositifs artistiques, et la construction d'outils de communication. Philippe Parreno, figure majeure de ce mouvement, écrit : « On ne peut plus s'installer devant une image comme au temps du premier degré ». Rirkrit Tiravanija définit ses expositions comme « des cadres de références pour ce qui pourrait en transpirer dans l'usage ». Ces contrats esthétiques exigeants, basés sur une architecture des modes de socialité et sur une production de situations relationnelles, insistent sur la notion de co-présence de l'œuvre et du regardeur dans l'espace d'exposition. L'exposition joue un rôle particulier dans l'art relationnel parce qu'elle permet, contrairement à d'autres formes culturelles, d'ouvrir un espace collectif et de permettre une discussion immédiate : l'art « resserre l'espace des relations ». S'il s'intègre dans le système global des relations humaines, il introduit toutefois des « interstices » suggérant d'autres possibilités d'échange ou de communication que celles qui sont en vigueur dans la société dominante. Bourriaud convoque une généalogie artistique qui remonte aux pratiques des années 1960-1970, notamment les happenings, Fluxus, les environnements participatifs de Franz West, les interventions urbaines de Gordon Matta-Clark et les installations minimalistes qui, comme l'analysait Michael Fried, rendaient le spectateur conscient de sa propre situation spatiale et corporelle. Toutefois, Bourriaud insiste sur une différence fondamentale de propos. Alors que l'objet de l'art des années 1960-1970 était largement la définition de l'art lui-même et de ses frontières, l'interrogation institutionnelle et l'exploration des limites du médium, les artistes des années 1990 tournent leur intérêt vers les relations entre l'art et la société. Ils tentent, par des micro-événements favorisant la proximité et la convivialité, de résister de l'intérieur à une culture de communication de masse dans laquelle la représentation médiatique de la réalité se substitue trop souvent à l'expérience directe de celle-ci. Les œuvres relationnelles fonctionnent ainsi comme des « interstices » dans le tissu social et culturel, donnant naissance à des pratiques d'exploration des liens sociaux qui ouvrent sur des opportunités d'émergence de nouveaux modes de pensée, de nouvelles possibilités de vie collective. Les principaux artistes associés au mouvement relationnel par Bourriaud et par les commentateurs ultérieurs incluent Rirkrit Tiravanija, figure emblématique de ce courant, dont les œuvres les plus célèbres consistent à cuisiner et servir de la nourriture aux visiteurs dans des espaces d'exposition. Son œuvre ''Untitled (Free)'' présentée en 1992 à la galerie 303 de New York transformait l'espace d'exposition en cuisine où l'artiste préparait du curry thaïlandais qu'il offrait gratuitement aux visiteurs. Les restes du repas, la vaisselle sale, les traces de présence humaine constituaient les seuls vestiges matériels de l'œuvre après sa « consommation ». En 1996, Tiravanija présente au Consortium de Dijon une exposition intitulée ''Untitled, 1996 (one revolution per minute)'' qui réunit plusieurs de ses stratégies : utilisation d'œuvres de la collection du musée (Dan Graham, Allan McCollum, Michel Verjux, Olivier Mosset, On Kawara), installation d'un espace de vie avec matelas et équipements de cuisine permettant aux visiteurs de séjourner dans l'exposition, et projection de films. Cette approche vise à « recharger les œuvres d'art qui perdent leur énergie dans les réserves et dans les collections », transformant le musée en lieu de vie plutôt qu'en mausolée. Felix Gonzalez-Torres, artiste cubano-américain décédé prématurément du sida en 1996, crée des œuvres participatives d'une grande économie formelle et d'une puissance émotionnelle considérable. Ses « stacks » (piles) de papiers imprimés ou ses « spills » (déversements) de bonbons emballés, disposés dans des coins ou le long des murs, sont offerts aux visiteurs qui peuvent en prendre librement. L'œuvre se reconstitue périodiquement selon les instructions de l'artiste, mais sa forme varie constamment selon le degré de participation du public. Ces gestes généreux de don et de partage résonnent avec les thématiques de perte, de deuil et de [[Dictionnaire de philosophie/Mort|mémoire]] qui traversent son œuvre, souvent lue à travers le prisme autobiographique de la maladie de son compagnon Ross Laycock. Philippe Parreno explore la temporalité et les modalités de l'exposition elle-même comme médium. Ses projets, souvent réalisés en collaboration avec d'autres artistes (Pierre Huyghe, Dominique Gonzalez-Foerster, Liam Gillick, Rirkrit Tiravanija), questionnent les formats de monstration et la manière dont l'art peut créer des expériences temporelles spécifiques. Son projet ''No More Reality'' (1991) constitue une des premières manifestations de cette approche. Parreno affirme rechercher une « polyphonie » plutôt qu'une vision monographique monolithique, transformant l'exposition en « show quotidien » plutôt qu'en présentation statique d'objets. Pierre Huyghe développe des projets qui brouillent les frontières entre documentation, fiction et réalité. Son projet ''Chantier Barbès-Rochechouart'' (1994) consistait à exposer les photographies d'ouvriers en plein travail à proximité immédiate de leur chantier, créant ainsi une boucle réflexive entre le travail réel et sa représentation. Avec Melik Ohanian, il réalise ''Mobile TV'' (1996), un dispositif de télévision mobile qui devient outil de communication et d'enregistrement de situations. Ces projets incarnent la « modélisation de relations sociales » et la « construction d'outils de communication » que Bourriaud identifie comme figures formelles de l'art relationnel. Dominique Gonzalez-Foerster crée des environnements immersifs qui fonctionnent comme des décors de vie, des « chambres » où les visiteurs sont invités à séjourner, lire, écouter de la musique. Ses installations convoquent des atmosphères littéraires ou cinématographiques, créant des espaces de rêverie collective. Liam Gillick produit des structures architecturales modulaires, des plateformes, des éléments mobiliers qui reconfigurent l'espace d'exposition et invitent à de nouveaux usages, de nouvelles formes de rassemblement. Maurizio Cattelan, avec son humour provocateur, crée des situations sociales absurdes ou inconfortables, comme ''Errotin, le vrai lapin'' (1995) où il habillait son galeriste Emmanuel Perrotin d'un costume de lapin phallique rose. Ces artistes partagent selon Bourriaud une même ambition : constituer des « modes d'existence ou des modèles d'action à l'intérieur du réel existant », plutôt que de préparer un monde futur utopique comme le faisaient les avant-gardes historiques. L'esthétique relationnelle s'inscrit ainsi dans une critique de la société du spectacle théorisée par Guy Debord et de la marchandisation généralisée, proposant l'art comme modèle alternatif de lien social, comme espace de résistance micro-politique. Bourriaud écrit que l'art des années 1990 ne cherche plus à « imaginer des utopies, mais à construire des espaces concrets ». Cette « microtopie » ou « utopie de proximité » se distingue des grandes utopies modernistes par son échelle réduite, sa temporalité éphémère et son refus de tout programme prescriptif. Il ne s'agit plus de transformer radicalement la société mais d'expérimenter localement et temporairement d'autres formes de socialité, d'autres manières d'être ensemble. Cependant, l'esthétique relationnelle telle que théorisée par Bourriaud a rapidement suscité des critiques substantielles. Claire Bishop, historienne de l'art et critique britannique, publie en 2004 dans la revue ''October'' un article retentissant intitulé « Antagonism and Relational Aesthetics » qui constitue la critique la plus influente et la plus systématique du cadre bourriaudien. Bishop reconnaît l'importance descriptive du travail de Bourriaud pour identifier et nommer un ensemble de pratiques artistiques émergentes, mais elle lui reproche fondamentalement son manque de critères normatifs d'évaluation. Bourriaud « veut équivaloir jugement esthétique et jugement éthico-politique des relations produites par une œuvre d'art. Mais comment mesurer ou comparer ces relations ? » interroge Bishop. Si l'art relationnel produit des relations humaines, la question logique suivante devient : quels types de relations sont produits, pour qui, et pourquoi ? La critique normative de Bishop opère sur l'hypothèse de bon sens que toutes les relations ne valent pas d'être célébrées, esthétiquement ou autrement. L'exploitation, l'humiliation et l'abus physique ou psychologique constituent également des relations humaines, mais présumément pas celles que les artistes relationnels veulent encourager. Bishop affirme que Bourriaud se limite à une conception consensuelle de la relation, valorisant la convivialité, l'harmonie et le sentiment d'appartenance communautaire, tout en négligeant ou en excluant des pratiques artistiques basées sur le conflit, la tension et ce que Jacques Rancière nomme le « dissensus ». Les œuvres exemplifiées par Bourriaud se déroulent typiquement dans des galeries ou des institutions artistiques, rassemblant un public déjà initié au monde de l'art contemporain, créant ainsi ce que Bourriaud appelle des « microtopies » mais que Bishop qualifie plutôt de « communautés » homogènes plutôt que de véritables « publics » caractérisés par leur hétérogénéité et leur composition aléatoire. Bishop souligne que si la seule communauté rassemblée par l'œuvre de Tiravanija consiste en « initiés du monde de l'art qui ont quelque chose en commun », cela limite considérablement la portée critique et politique de son travail. Elle propose une alternative théorique qu'elle nomme « esthétique antagoniste » ou « antagonisme relationnel », s'inspirant de la théorie politique d'Ernesto Laclau et Chantal Mouffe développée dans ''Hegemony and Socialist Strategy'' (1985). Pour Laclau et Mouffe, la démocratie radicale ne repose pas sur le consensus mais sur l'agonisme, c'est-à-dire la reconnaissance et la valorisation du conflit comme moteur du politique. Bishop applique cette logique à l'art, affirmant que les œuvres les plus politiquement efficaces sont celles qui créent des « sensations de malaise et d'inconfort plutôt que d'appartenance », qui « reconnaissent l'impossibilité d'une microtopie et maintiennent plutôt une tension entre spectateurs, participants et contexte ». Bishop examine le travail de deux artistes, Santiago Sierra et Thomas Hirschhorn, qu'elle positionne comme alternatives antagonistes à l'art relationnel consensuel. Santiago Sierra, artiste espagnol, crée des situations où il paie des personnes économiquement marginalisées pour effectuer des tâches dégradantes, humiliantes ou dangereuses : se faire tatouer une ligne sur le dos, rester enfermés dans des boîtes en carton, obstruer l'entrée d'une galerie. Ces œuvres mettent en scène crûment les relations d'exploitation capitaliste plutôt que de proposer des espaces harmonieux de partage. Thomas Hirschhorn construit des monuments temporaires dédiés à des philosophes (Spinoza, Deleuze, Gramsci, Bataille) dans des quartiers défavorisés, collaborant avec les habitants locaux mais sans prétendre créer une communauté idéale. Ses installations chaotiques, surchargées d'informations et de matériaux, produisent une esthétique du désordre qui contraste radicalement avec la convivialité épurée de l'art relationnel. La controverse entre Bourriaud et Bishop révèle des enjeux théoriques profonds concernant le rapport entre esthétique, éthique et politique dans l'art contemporain. Liam Gillick, artiste fréquemment associé à l'esthétique relationnelle, répond à Bishop dans un article de 2006 où il conteste son usage du concept d'antagonisme et lui reproche de construire une opposition artificielle entre consensus et conflit. D'autres commentateurs soulignent que l'antagonisme proposé par Bishop risque de réinscrire l'art dans la logique moderniste de l'autonomie et de la négativité adornienne, alors même qu'elle prétend s'en distancer. L'insistance de Bishop sur la « disruption », l'« obstruction » et le « malaise » comme valeurs esthétiques pourrait simplement substituer un ensemble de critères normatifs (valorisant le conflit) à un autre (valorisant la convivialité), sans résoudre fondamentalement la question de la manière dont nous évaluons la qualité des relations produites par l'art. Au-delà de ces débats théoriques, l'esthétique relationnelle a exercé une influence massive sur les pratiques artistiques, curatoriales et institutionnelles depuis les années 1990. Bourriaud lui-même a pu mettre en œuvre ses conceptions en cofondant en 1999 avec Jérôme Sans le Palais de Tokyo à Paris, dont il fut codirecteur jusqu'en 2006. Cette institution s'est voulue l'incarnation architecturale et programmatique de l'esthétique relationnelle, proposant un modèle de centre d'art comme « laboratoire » plutôt que comme musée, privilégiant les projets in situ, les résidences d'artistes, les formats expérimentaux et l'ouverture à des publics diversifiés. Les biennales et grandes expositions internationales ont largement adopté les principes relationnels, multipliant les workshops, les performances, les événements participatifs et les formats discursifs. Néanmoins, cette généralisation institutionnelle de l'esthétique relationnelle a paradoxalement contribué à émousser son potentiel critique. Ce qui se voulait initialement une forme de résistance aux logiques marchandes et spectaculaires a été rapidement récupéré et instrumentalisé par les institutions culturelles et le marché de l'art. Les œuvres relationnelles, précisément parce qu'elles produisent des expériences conviviales et accessibles, se sont révélées particulièrement adaptées aux stratégies de communication des musées cherchant à élargir leurs publics et à justifier leur pertinence sociale. L'« arty party », comme l'a ironiquement nommé Hal Foster, risque de devenir simple animation culturelle, [[Dictionnaire de philosophie/Divertissement|divertissement]] consensuel qui neutralise toute dimension critique au profit d'une sociabilité agréable mais superficielle. Cette tension entre ambition critique et récupération institutionnelle demeure au cœur des débats sur l'art participatif, socially engaged art et les diverses formes d'art dit social ou collaboratif qui ont proliféré depuis les années 2000, héritant largement des problématiques soulevées par et contre l'esthétique relationnelle. === Politique de l'esthétique et distribution du sensible === Jacques Rancière développe dans ''Le Partage du sensible : Esthétique et politique'' publié en 2000 aux éditions La Fabrique une pensée philosophique originale qui relie intrinsèquement esthétique et politique. Cet ouvrage relativement bref, né d'un « double sollicitation » selon l'auteur — d'une part les questions posées par deux jeunes philosophes, Muriel Combes et Bernard Aspe, d'autre part la demande d'Eric Hazan et Stéphanie Grégoire que les réponses soient « autant que possible, explicitées » — constitue néanmoins l'une des contributions théoriques les plus influentes de la philosophie contemporaine à la compréhension du rapport entre art et politique. Rancière ne propose ni une théorie de la création artistique ni une théorie de la réception esthétique, mais inscrit la question des formes de l'une et de l'autre dans une interrogation plus vaste portant sur la manière dont s'organise et se structure l'expérience sensible partagée d'une communauté. Le concept central qui organise toute la pensée rancièrienne est celui du « partage du sensible ». Rancière définit ce partage comme « ce système d'évidences sensibles qui donne à voir en même temps l'existence d'un commun et les découpages qui y définissent les places et les parts respectives ». Un partage du sensible fixe donc en même temps un commun partagé et des parts exclusives. Cette répartition des parts et des places se fonde sur un partage des espaces, des temps et des formes d'activité qui détermine la manière même dont un commun se prête à participation et dont les uns et les autres ont part à ce partage. Le terme « partage » possède ici une double signification essentielle : il désigne à la fois ce qui est partagé au sens de commun à tous, et ce qui est partagé au sens de divisé, réparti inégalement entre les membres de la communauté. Cette double signification n'est nullement accidentelle mais constitutive de la structure même du politique et du sensible. Pour expliciter cette notion fondamentale, Rancière la fait remonter à Platon et Aristote. Chez Platon, dans ''La République'', il est établi que les artisans n'ont pas le temps de se consacrer à autre chose que leur travail. Ils ne peuvent pas être ailleurs parce que le travail n'attend pas, parce que leurs occupations matérielles les assignent à un lieu et à un temps spécifiques qui les excluent de l'espace public de la délibération politique. Cette impossibilité constitue bien plus qu'une contrainte pratique : elle marque une division ontologique entre ceux qui sont visibles dans l'espace commun et ceux qui ne le sont pas, entre ceux qui sont dotés d'une parole commune susceptible d'être entendue et ceux dont les énoncés ne valent que comme bruit indifférencié exprimant peine ou plaisir. Aristote, dans sa ''Politique'', approfondit cette division en distinguant la simple voix (''phonè'') que possèdent également les animaux pour manifester peine et plaisir, et la parole (''logos'') proprement humaine qui permet de déterminer le juste et l'injuste. L'esclave, affirme Aristote, participe au langage seulement sous le mode de la compréhension (''aisthesis''), non de la possession (''hexis''). Il comprend les ordres qu'on lui donne mais ne possède pas véritablement le logos qui lui permettrait de participer à la délibération commune sur les affaires de la cité. Cette différence marque une « transition spécifique entre l'animalité et l'humanité » selon Rancière. Le partage du sensible fait donc voir qui peut avoir part au commun en fonction de ce qu'il fait et du lieu où il est. Avoir telle occupation en tel type de lieu définit des compétences ou des incompétences au commun. Cela définit le fait d'être ou non visible dans un espace commun, doué d'une parole commune, capable de participer aux affaires publiques plutôt que d'être simplement assigné à des tâches privées. Il y a donc, à la base de la politique, une « esthétique », à entendre en un sens kantien éventuellement revisité par Michel Foucault : un découpage des temps et des espaces, du visible et de l'invisible, de la parole et du bruit qui définit à la fois le lieu et l'enjeu de la politique comme forme d'expérience. La politique porte sur ce qu'on voit et ce qu'on peut en dire, sur qui a la compétence pour voir et la qualité pour dire, sur les propriétés des espaces et les possibles du temps. Cette « esthétique première », cette distribution originaire du sensible, précède et conditionne ce que nous entendons habituellement par esthétique au sens des pratiques artistiques. Rancière ne propose pas une théorie de l'art ou de l'esthétique au sens traditionnel du terme. Il récuse explicitement l'acception courante de l'esthétique comme « théorie de l'art en général ou une théorie de l'art qui le renverrait à ses effets sur la sensibilité ». L'esthétique désigne chez lui « un régime spécifique d'identification et de pensée des arts : un mode d'articulation entre des manières de faire, des formes de visibilité de ces manières de faire et des modes de pensabilité de leurs rapports, impliquant une certaine idée de l'effectivité de pensée ». Cette définition complexe signifie que l'esthétique ne concerne pas seulement les œuvres d'art comme objets isolés mais le système global qui détermine ce qui compte comme art, comment les œuvres sont perçues, comprises et évaluées, et quelle efficacité on leur reconnaît dans le monde social. Pour penser l'histoire de ce que nous appelons art, Rancière distingue trois régimes d'identification successifs. Le '''régime éthique''' des images, premier régime historiquement, correspond à la position platonicienne. Dans ce régime, les images, les productions artistiques sont interrogées du point de vue de leurs origines et de leurs destinations, c'est-à-dire de leur vérité et de leurs effets sur l'ethos de la communauté, sur le mode d'être collectif. Platon ne s'intéresse pas aux œuvres en tant qu'art mais en tant qu'images susceptibles de produire certains effets sur les citoyens. Sont-elles vraies ou mensongères ? Forment-elles des citoyens vertueux ou corrompent-elles les mœurs ? Ces questions éthiques priment sur toute considération proprement artistique ou esthétique. Les poètes sont ainsi chassés de la cité idéale non parce que leur art manquerait de qualités formelles mais parce que leurs récits mensongers sur les dieux et les héros risquent de pervertir l'éducation des gardiens. Le '''régime poétique ou représentatif''' émerge avec la ''Poétique'' d'Aristote et structure la compréhension de l'art jusqu'à la fin du dix-huitième siècle. Ce régime identifie les arts du point de vue de leur manière de faire (''poiesis''), c'est-à-dire selon les normes qui règlent les modes d'imitation (''mimesis''). Aristote établit une distribution entre les différents arts selon leurs moyens d'imitation (rythme, langage, harmonie), leurs objets (les hommes en action) et leurs modes (narratif ou dramatique). Cette distribution institue une hiérarchie des genres : la tragédie occupe le sommet car elle imite les actions nobles des grands hommes selon des règles strictes de vraisemblance et de bienséance. La comédie, qui représente des personnages de basse condition, se trouve reléguée à un rang inférieur. Le régime représentatif institue ainsi un ordre du représentable qui fait correspondre hiérarchie sociale et hiérarchie des genres artistiques. Les âmes nobles représentent les actions d'éclat des héros et des dieux selon le plus haut degré de perfection formelle, devenant poètes épiques ou tragiques. Les imitateurs de moindre vertu choisissent de représenter les hommes ordinaires et leurs actions triviales, se faisant poètes comiques. Chaque genre possède des règles spécifiques qui déterminent ce qui peut ou non y être représenté, comment les sujets doivent être traités, quel style convient à quel contenu. Le '''régime esthétique''' de l'art, qui émerge à la fin du dix-huitième siècle et structure encore largement notre compréhension contemporaine, rompt radicalement avec ces ordonnances hiérarchiques. Rancière situe son origine philosophique dans les ''Lettres sur l'éducation esthétique de l'homme'' (1795) de Friedrich Schiller, texte fondateur qui pense la possibilité d'une éducation à la liberté par l'expérience esthétique. Selon Schiller, l'homme ne peut accéder à l'humanité véritable qu'en passant par l'état esthétique, état d'indétermination où les contraintes opposées de la forme et de la matière, de l'activité rationnelle et de la passivité sensible, se neutralisent mutuellement pour produire une libre apparence (''Schein'') et un libre jeu (''Spiel''). Cet état esthétique réalise une forme d'égalité ontologique : en lui s'annulent les divisions hiérarchiques qui structuraient aussi bien le régime éthique que le régime représentatif. Le régime esthétique repose ainsi sur une égalité fondamentale : en n'importe qui, en n'importe quel sujet, peuvent se rencontrer l'activité fabricatrice et l'émotion sensible. N'importe quel objet peut devenir objet d'expérience esthétique, n'importe quel sujet peut devenir sujet de cette expérience. Cette égalité esthétique entraîne un effondrement des hiérarchies qui structuraient l'ancien régime de l'art. Les frontières entre beaux-arts et arts appliqués, entre arts majeurs et arts mineurs, entre sujets nobles et sujets vulgaires s'effondrent. Le régime esthétique se caractérise par « une disparition des frontières entre ce qui appartient aux catégories des beaux-arts et ce qui ne leur appartient pas », ainsi que par « un effondrement des hiérarchies et des genres ». La littérature peut s'intéresser aux existences les plus ordinaires, la peinture peut représenter des scènes triviales sans les soumettre à la codification des genres, la sculpture peut prendre pour modèle le corps mutilé plutôt que la perfection idéale. Dans ''Aisthesis : Scènes du régime esthétique de l'art'' (2011), Rancière retrace quatorze moments historiques qui exemplifient cette reconfiguration du sensible, depuis la description par Johann Joachim Winckelmann du Torse du Belvédère mutilé d'Hercule (1764) jusqu'au film de Charlie Chaplin ''Les Temps modernes'' (1936) ou aux photographies de James Agee documentant la vie des métayers du Sud américain (1941). Chacune de ces « scènes » manifeste comment l'art moderne abolit les anciennes hiérarchies pour accueillir l'ordinaire, le trivial, le fragmentaire, le banal dans le domaine de l'expérience esthétique. Le régime esthétique possède une dimension intrinsèquement politique selon Rancière, mais cette politicité ne réside pas dans les contenus militants ou engagés que les œuvres pourraient véhiculer. La dimension politique de l'art ne se trouve pas dans ses messages, dans ses prises de position explicites sur les questions sociales, mais dans sa capacité à redistribuer le partage du sensible, à reconfigurer l'espace de ce qui est visible et dicible. Lorsque Gustave Flaubert décrit minutieusement, dans ''Madame Bovary'', les pensées et les rêveries d'une petite bourgeoise de province, il accomplit un geste démocratique radical en conférant à cette existence médiocre la même dignité littéraire qu'aux héros aristocratiques de la tragédie classique. Il manifeste que n'importe quelle vie, n'importe quelle expérience mérite d'être racontée avec le même soin, la même attention au détail, la même complexité psychologique. Émile Zola, dans ''Le Ventre de Paris'' (1873), installe son personnage de peintre Claude Lantier au cœur des Halles, fasciné par les étalages de jambons et de saucisses, élevant ainsi les nourritures ordinaires au rang de sujet pictural légitime et manifestant la beauté moderne des espaces commerciaux. Cette reconfiguration du sensible qu'opère l'art possède une efficacité politique spécifique que Rancière nomme « dissensus ». Le dissensus ne désigne pas un simple désaccord ou une opposition d'opinions dans le cadre d'un débat ordonné, mais une remise en cause des évidences sensibles elles-mêmes, un bouleversement de ce qui apparaît comme allant de soi dans la perception commune. Le dissensus révèle que ce que l'ordre social présente comme naturel, nécessaire, évident, constitue en réalité une construction contingente, un certain découpage du visible et de l'invisible, du dicible et de l'indicible qui pourrait être autrement. L'art produit du dissensus lorsqu'il donne à voir ce qui n'était pas visible, lorsqu'il fait entendre comme parole ce qui n'était perçu que comme bruit, lorsqu'il manifeste la capacité de n'importe qui à produire des formes, des pensées, des affects qui relevaient jusqu'alors du privilège de quelques-uns. Rancière oppose le dissensus au « consensus » qui caractérise selon lui la politique contemporaine, devenue simple gestion technique des affaires communes selon des critères d'efficacité prétendument neutres. Le consensus postule qu'il n'existe qu'une seule réalité partagée par tous, qu'un seul monde commun dont les contours et les propriétés sont parfaitement définis et connus. Le dissensus au contraire manifeste qu'il existe plusieurs mondes sensibles possibles, plusieurs manières de découper le réel, plusieurs configurations de ce qui compte comme réalité commune. Cette pluralité n'est pas relativiste car elle engage toujours la question de l'égalité : ceux qui produisent du dissensus revendiquent précisément leur égalité avec ceux qui prétendent monopoliser la définition du monde commun. Cette problématique conduit Rancière à élaborer sa conception de la politique, qu'il distingue radicalement de la « police ». La police désigne chez Rancière, dans un sens non péjoratif, l'ordre social établi, la distribution des places et des fonctions, l'organisation du vivre-ensemble selon un partage du sensible déterminé. La police est « l'ensemble des processus par lesquels s'opèrent l'agrégation et le consentement des collectivités, l'organisation des pouvoirs, la distribution des places et des fonctions et les systèmes de légitimation de cette distribution ». La police ne se réduit pas aux forces de l'ordre mais englobe toute la structure qui assigne chacun à sa place, qui détermine qui est visible et qui ne l'est pas, qui possède une parole légitime et qui n'émet que du bruit. La politique, au contraire, désigne l'activité qui vient perturber cet ordre policier, qui introduit du dissensus dans la répartition établie. La politique apparaît lorsque ceux qui n'avaient pas de part au commun revendiquent d'y prendre part, lorsque ceux qui étaient invisibles se rendent visibles, lorsque ceux dont les énoncés n'étaient pas entendus comme parole articulée manifestent leur capacité à tenir un discours sur le juste et l'injuste. Cette manifestation de l'égalité par ceux qui en étaient exclus, Rancière la nomme « la part des sans-part » ou « le compte des incomptés ». Cette expression paradoxale ne désigne pas une catégorie sociale préexistante, comme les pauvres, les exclus ou les dominés, mais une position politique qui émerge dans l'acte même de sa manifestation. La part des sans-part n'existe que dans le moment de sa subjectivation politique, dans l'événement par lequel des [[Dictionnaire de philosophie/Individu|individus]] jusque-là assignés à une place subalterne dans l'ordre social se constituent comme [[Philosophie/Sujet|sujets]] politiques en affirmant leur égalité avec ceux qui les dominaient. Les esclaves, les prolétaires, les femmes, les colonisés, les sans-papiers deviennent « part des sans-part » non en vertu de leur situation de domination mais par leur action collective qui conteste le partage établi et revendique une reconfiguration du commun. Cette part ne préexiste pas au conflit qu'elle nomme et dans lequel elle se fait compter. Elle surgit dans l'acte même de parler, d'apparaître, de revendiquer, manifestant ainsi que le démos (le peuple) ne coïncide jamais parfaitement avec lui-même, qu'il existe toujours un excès, un supplément par rapport à toute tentative de le dénombrer et de le représenter exhaustivement. La démocratie, dans la perspective rancièrienne, ne désigne pas un régime politique institutionnel parmi d'autres mais le principe même de la politique. La démocratie consiste en l'affirmation de l'égalité de n'importe qui avec n'importe qui, en la reconnaissance que la capacité politique ne dépend d'aucune compétence spéciale, d'aucun savoir ésotérique, d'aucun titre particulier. Cette démocratie radicale, qui repose sur ce que Rancière nomme « l'égalité des intelligences » (reprise du pédagogue Joseph Jacotot qu'il étudie dans ''Le Maître ignorant'', 1987), demeure toujours scandaleuse pour l'ordre policier qui ne cesse de vouloir limiter, encadrer, domestiquer l'exercice du politique en le réservant à des experts, des représentants, des spécialistes. Les institutions démocratiques telles que nous les connaissons constituent ainsi des formes mixtes, hybrides, combinant des éléments proprement politiques (égalitaires, démocratiques) et des éléments policiers (hiérarchiques, oligarchiques). La tension entre ces deux logiques ne peut jamais être résolue définitivement mais constitue la dynamique même de la vie politique. L'art, dans le régime esthétique, entretient un rapport complexe avec cette conception de la politique. D'un côté, l'art partage avec la politique démocratique la présupposition d'égalité : n'importe qui peut être sujet d'expérience esthétique, n'importe quel objet peut devenir objet artistique. Cette égalité esthétique résonne avec l'égalité politique. D'un autre côté, l'efficacité propre de l'art ne consiste pas à produire directement des effets politiques, à mobiliser les masses ou à servir des causes militantes. L'art qui prétend avoir une efficacité politique immédiate, qui voudrait directement transformer la société, manque généralement ses objectifs car il se soumet à une logique didactique ou propagandiste qui contredit la structure même du régime esthétique. L'efficacité politique de l'art réside plutôt dans sa capacité à créer des « formes de dissensus », à inventer de nouvelles formes de partage du sensible qui ouvrent des possibles jusque-là impensables. Cette efficacité demeure indirecte, différée, imprévisible. Elle ne se mesure pas à l'aune des mobilisations qu'elle susciterait mais à sa capacité à transformer les manières de voir, de sentir, de penser qui conditionnent la possibilité même de l'action politique. Rancière critique ainsi vigoureusement ce qu'il nomme « l'éthique du témoin » ou la « religion du sublime » qui ont dominé une partie de l'art contemporain, particulièrement après la Shoah. Cette tendance, exemplifiée par les réflexions de Jean-François Lyotard sur l'« irreprésentable » ou par certaines positions d'Adorno, voudrait que l'art après Auschwitz doive témoigner d'un événement qui excède toute possibilité de représentation. Rancière soutient au contraire qu'un « art de l'irreprésentable » constitue une contradiction dans les termes, une manière d'imposer à l'art des interdits éthiques qui le ramènent précisément au régime éthique des images dont le régime esthétique nous avait émancipés. La radicalité éthique contemporaine hérite ainsi paradoxalement de la radicalité moderniste l'idée d'un temps coupé par un événement décisif, la Shoah remplaçant la révolution à venir comme horizon d'attente. Cette sacralisation de l'événement traumatique risque de réduire l'art à une fonction commémorative ou testimoniale qui le prive de sa puissance propre de reconfiguration du sensible. La pensée rancièrienne a exercé une influence considérable sur la théorie de l'art contemporain, la critique culturelle et la philosophie politique depuis les années 2000. Son vocabulaire conceptuel — partage du sensible, dissensus, part des sans-part, régimes de l'art — s'est largement diffusé dans les discours critiques, les études curatoriales, les recherches en sciences sociales. Cette réception n'a pas été exempte de critiques et de débats. Certains commentateurs reprochent à Rancière une conception insuffisamment matérialiste de la politique, qui négligerait les déterminations économiques et sociales au profit d'une approche trop centrée sur les dimensions symboliques et discursives. D'autres pointent une ambiguïté dans son rapport à la représentation politique : en affirmant que tout sujet politique ne peut jamais être identifié à un groupe social préexistant, Rancière ne rend-il pas impossible toute politique organisée, toute construction de mouvements collectifs durables ? Sa valorisation de l'événementiel, de l'éphémère, de la subjectivation politique momentanée ne conduit-elle pas à sous-estimer l'importance des institutions, des organisations, des luttes inscrites dans la durée ? Ces questions demeurent ouvertes et continuent de structurer les débats théoriques sur l'articulation entre esthétique et politique dans le monde contemporain. == Sociologie de l'Art et Mécanismes de Distinction == === Capital culturel et reproduction sociale === [[Fichier:Espace social de Bourdieu.svg|thumb|upright=1.2|Représentation graphique de l'espace social selon Pierre Bourdieu, montrant la distribution des agents selon le volume global de capital (axe vertical) et la structure du capital entre capital économique et culturel (axe horizontal).]] Pierre Bourdieu révolutionne la sociologie de l'art avec ''La Distinction : Critique sociale du jugement'' publié en 1979 aux Éditions de Minuit, démontrant que les goûts esthétiques, loin d'être naturels, individuels ou universels comme le postulaient les philosophies esthétiques classiques, constituent des marqueurs de position sociale et des instruments de domination symbolique. Cette œuvre monumentale, fruit de plus de dix ans de recherches empiriques menées avec Luc Boltanski, Monique de Saint-Martin, et d'autres collaborateurs, repose sur une enquête statistique d'envergure portant sur les pratiques culturelles et les préférences esthétiques des Français, complétée par des photographies, des extraits d'entretiens et une analyse secondaire de données issues d'enquêtes diverses. ''La Distinction'' représente l'aboutissement d'un parcours intellectuel commencé avec ''Les Héritiers'' (1964) et ''La Reproduction'' (1970), coécrits avec Jean-Claude Passeron, qui établissaient déjà que le système d'enseignement français, loin d'être l'instrument de démocratisation et d'émancipation qu'affirme l'idéologie républicaine, fonctionne comme principal mécanisme de reproduction des inégalités sociales. Bourdieu établit que la capacité à apprécier l'art « légitime », à porter un jugement esthétique « pur » sur les œuvres, à adopter une posture contemplative désintéressée face à l'art, dépend du '''capital culturel''' accumulé, lui-même étroitement lié à l'origine sociale et au parcours éducatif. Le capital culturel se présente sous trois formes ou « états » distincts mais articulés. Premièrement, la '''forme incorporée''' désigne l'ensemble des dispositions durables acquises par un long processus de socialisation et d'éducation, inscrites dans le corps et l'esprit sous forme d''''habitus''' culturel. Cette incorporation suppose un travail d'assimilation qui prend du temps et qui ne peut être effectué par procuration : on ne peut déléguer à quelqu'un d'autre le soin d'acquérir pour nous la culture. L'habitus culturel inclut la maîtrise du langage légitime, l'aisance corporelle dans les situations sociales, la familiarité avec les codes de présentation de soi, la capacité à reconnaître les œuvres et les styles artistiques, le sentiment de légitimité à fréquenter les institutions culturelles. Deuxièmement, la '''forme objectivée''' correspond à la possession de biens culturels matériels : livres, tableaux, instruments de musique, disques, équipements informatiques. Cependant, Bourdieu insiste sur le fait que posséder matériellement ces objets ne suffit pas : pour se les approprier réellement, pour en faire usage, il faut disposer du capital culturel incorporé nécessaire. Acheter tous les livres d'une bibliothèque ne confère pas automatiquement la culture si l'on ne possède pas les dispositions pour les lire et les comprendre. Troisièmement, la '''forme institutionnalisée''' désigne les titres scolaires, diplômes et certifications qui objectivent et garantissent le capital culturel de leur détenteur. Le diplôme institue une reconnaissance officielle, socialement garantie, du capital culturel possédé, permettant sa conversion en capital économique sur le marché du travail. Cette institutionnalisation établit des différences formelles entre les autodidactes et les diplômés, entre ceux dont le capital culturel est socialement certifié et ceux dont il demeure informel. L'habitus, concept central de la théorie bourdieusienne développé dès ''Esquisse d'une théorie de la pratique'' (1972), désigne un « système de dispositions durables et transposables, structures structurées prédisposées à fonctionner comme structures structurantes ». Cette formule dense signifie que l'habitus est à la fois le produit de l'intériorisation des structures objectives du monde social (structures structurées) et le principe générateur de pratiques et de représentations qui tendent à reproduire ces structures (structures structurantes). L'habitus fonctionne comme un sens pratique, une intuition sociale qui permet aux agents de s'orienter dans l'espace social, de savoir immédiatement ce qui est possible ou impossible pour eux, ce qui leur convient ou non, sans avoir besoin de calcul rationnel conscient. Cet habitus s'acquiert par un long apprentissage inconscient au sein de la famille, de l'école et des différentes sphères de socialisation, s'inscrivant dans les corps sous forme de postures, de manières de parler, de goûts, d'appétences et de répulsions qui apparaissent comme naturels mais qui sont en réalité le produit de conditions sociales spécifiques. L'habitus de classe, partagé par les membres d'une même classe sociale ayant été soumis à des conditionnements similaires, engendre des pratiques homogènes et immédiatement ajustées aux positions occupées dans l'espace social, assurant ainsi la reproduction des structures sociales à travers les générations. Le « goût pur » défendu par Emmanuel [[Philosophie/Vocabulaire/Kant|Kant]] dans la ''Critique de la faculté de juger'' (1790) et repris par Clement Greenberg et la tradition moderniste, loin d'être une disposition universelle de l'esprit humain, apparaît ainsi comme le privilège de la bourgeoisie cultivée, qui peut se permettre une relation « désintéressée » à l'art précisément parce qu'elle possède les dispositions nécessaires, l'habitus approprié, pour le décoder, l'apprécier et en tirer une satisfaction. Ce prétendu désintéressement esthétique, cette capacité à suspendre les urgences pratiques pour contempler la pure forme, à considérer les œuvres indépendamment de leur fonction ou de leur contenu, constitue en réalité le produit d'une situation de privilège social où les nécessités matérielles de l'existence sont assurées. Les classes populaires, soumises à l'urgence de la nécessité économique, développent une « esthétique populaire » radicalement différente qui privilégie la substance sur la forme, la fonction sur la pure apparence, le réalisme sur l'abstraction, la participation sur la distance contemplative. Bourdieu cite une enquête où, face à une photographie de mains de vieille femme, les membres des classes populaires demandent « à qui sont ces mains ? » alors que les bourgeois cultivés admirent l'éclairage, la composition, le traitement formel, manifestant ainsi deux rapports au monde radicalement hétérogènes. Cette analyse dévoile la '''violence symbolique''' par laquelle la classe dominante impose la légitimité de ses préférences culturelles, transformant un arbitraire social en nécessité naturelle. La violence symbolique, concept élaboré dans ''La Reproduction'' (1970), désigne « tout pouvoir qui parvient à imposer des significations et à les imposer comme légitimes en dissimulant les rapports de force qui sont au fondement de sa force ». Cette violence s'exerce avec la complicité, souvent inconsciente, de ceux sur qui elle s'exerce : les dominés reconnaissent la légitimité de la culture dominante et intériorisent leur propre « indignité » culturelle, leur incompétence supposée, leur illégitimité à porter des jugements esthétiques. Le système d'enseignement joue un rôle crucial dans l'exercice de cette violence symbolique en présentant comme objectifs et universels des contenus et des modes d'évaluation qui correspondent en réalité à l''''arbitraire culturel''' de la classe dominante. Cet arbitraire culturel désigne le fait que les « choix » constitutifs d'une culture particulière, bien que personne ne les choisisse véritablement, révèlent leur contingence lorsqu'on les compare à d'autres cultures possibles ou existantes, mais apparaissent comme nécessaires et naturels aux membres de cette culture qui ont intériorisé ses normes. L'école, en sanctionnant par des notes et des diplômes la maîtrise de codes culturels que seuls les héritiers de la bourgeoisie cultivée possèdent dès l'origine familiale, transforme des différences sociales en différences de « dons », d'« intelligence » ou de « mérite » individuels. Les enfants issus de familles cultivées entrent à l'école déjà dotés du capital culturel que l'institution présuppose sans jamais l'enseigner explicitement : familiarité avec le langage soutenu, aisance face aux textes écrits, rapport au savoir comme fin en soi plutôt que comme instrument pratique, capacité à adopter la posture scolastique de distance réflexive. Ces « héritiers », selon le titre de l'ouvrage de 1964, réussissent scolairement non grâce à des mérites personnels exceptionnels mais parce qu'ils possèdent déjà, transmis par leur milieu familial, ce que l'école exige. À l'inverse, les enfants des classes populaires se trouvent en situation de handicap structurel : ils doivent acquérir à l'école, en quelques années et souvent sans enseignement explicite, ce que les héritiers ont assimilé dès la petite enfance par osmose familiale. Cette inégalité de départ, systématiquement occultée par l'idéologie du « don » naturel et du mérite individuel, conduit à des taux de réussite scolaire fortement corrélés à l'origine sociale. Le système scolaire opère ainsi une '''reproduction sociale''', c'est-à-dire qu'il contribue à maintenir et légitimer la structure des positions sociales d'une génération à l'autre, tout en faisant croire à une sélection méritocratique basée uniquement sur les capacités individuelles. Bourdieu construit dans ''La Distinction'' un modèle de l''''espace social''' où les agents se distribuent selon deux dimensions principales : le '''volume global de capital''' (économique + culturel + social) qu'ils possèdent, et la '''structure de ce capital''', c'est-à-dire la répartition relative entre capital économique (revenus, patrimoine) et capital culturel (diplômes, pratiques culturelles légitimes). Ce modèle bidimensionnel, représenté graphiquement par une analyse des correspondances multiples, permet de visualiser les distances objectives entre les différentes classes et fractions de classe. On observe ainsi que les classes populaires se situent dans la zone de faible volume global de capital, avec une prédominance du capital économique (lorsqu'il existe) sur le capital culturel. Les classes moyennes occupent une position intermédiaire, caractérisée par une bonne volonté culturelle et des stratégies ascensionnelles de reconversion de leur capital économique modeste en capital culturel scolaire. Les classes supérieures se divisent en deux fractions antagonistes : d'un côté la fraction dominante (patrons d'industrie et de commerce, professions libérales) riche en capital économique mais relativement pauvre en capital culturel, de l'autre la fraction dominée (enseignants, intellectuels, artistes) riche en capital culturel mais moins dotée économiquement. Cette opposition interne à la classe dominante structure de nombreux enjeux culturels et politiques, chaque fraction cherchant à imposer comme légitime le type de capital qu'elle possède. Les pratiques culturelles et les goûts esthétiques se distribuent dans cet espace social selon une logique homologue. Bourdieu démontre statistiquement que les préférences en matière de musique, peinture, littérature, cinéma, mais aussi d'alimentation, d'habillement, de sport, de loisirs, de décoration intérieure, varient systématiquement selon la position dans l'espace social. Les classes supérieures cultivées valorisent l'art légitime (musique classique, peinture abstraite, littérature moderniste), la distinction formelle, l'esthétisation de tous les domaines de la vie quotidienne. Les cadres et professions intellectuelles apprécient le jazz, le cinéma d'auteur, l'art contemporain, manifestant une disposition « informée » et « cultivée ». Les classes moyennes oscillent entre prétention culturelle (lecture de magazines culturels comme ''Télérama'', visites d'expositions) et insécurité face au jugement légitime, développant ce que Bourdieu nomme une « bonne volonté culturelle » qui les conduit à survaloriser ce qu'elles ne maîtrisent pas complètement. Les classes populaires préfèrent la chanson populaire, le cinéma commercial, les variétés, les pratiques culturelles fondées sur la convivialité et la participation plutôt que sur la contemplation distanciée, manifestant ainsi un rapport au monde structurellement différent de celui des classes cultivées. Cette correspondance entre position sociale et goûts culturels ne résulte pas d'une détermination mécanique mais de l'ajustement inconscient des dispositions (habitus) aux conditions objectives d'existence. Les travaux récents prolongeant Bourdieu montrent que si les formes concrètes de distinction culturelle évoluent au fil du temps, les mécanismes fondamentaux de reproduction sociale par la culture demeurent opérants. L'émergence de l''''omnivorisme culturel''' parmi les élites contemporaines, documentée par Richard Peterson et d'autres sociologues anglo-saxons, ne contredit pas la théorie bourdieusienne mais en révèle l'adaptabilité. Les classes supérieures contemporaines ne se distinguent plus seulement par leur consommation exclusive de culture légitime « highbrow » mais par leur capacité à naviguer avec aisance entre registres culturels multiples, appréciant aussi bien l'opéra baroque que le hip-hop underground, le cinéma d'auteur que certaines séries télévisées, manifestant ainsi une compétence culturelle éclectique qui demeure socialement distinctive. Cette capacité omnivore ne signifie nullement une démocratisation culturelle mais constitue une nouvelle forme de distinction, d'autant plus puissante qu'elle se présente sous les dehors de l'ouverture et de la tolérance esthétique plutôt que sous ceux du snobisme élitiste classique. Des études récentes montrent que l'origine sociale continue de déterminer fortement les parcours scolaires, les orientations universitaires et les destins socio-professionnels dans les sociétés contemporaines, malgré l'expansion scolaire et les discours méritocratiques. Le concept bourdieusien de '''champ''', introduit notamment dans ''Les Règles de l'art'' (1992), permet de penser l'art comme un espace social relativement autonome, doté de règles et d'enjeux spécifiques. Le champ artistique se structure autour de l'opposition entre pôle commercial (art destiné au marché, production pour le grand public, rentabilité économique immédiate) et pôle de production restreinte (« l'art pour l'art », production pour les pairs, reconnaissance symbolique différée, autonomie esthétique). Les agents du champ (artistes, critiques, galeristes, collectionneurs, institutions) luttent pour accumuler du '''capital symbolique''', forme spécifique de capital qui consiste en la reconnaissance et la légitimité accordées par les pairs, et pour imposer leur définition légitime de ce qui compte comme art de qualité. Cette lutte n'est pas consciemment stratégique mais résulte de l'ajustement des dispositions (habitus) aux positions occupées dans le champ. Les avant-gardes artistiques ne constituent pas des ruptures purement esthétiques motivées par la seule recherche formelle mais des stratégies de positionnement dans le champ, où les nouveaux entrants, dépourvus du capital symbolique accumulé par les dominants établis, contestent les hiérarchies existantes en inversant les valeurs : ce qui était considéré comme vulgaire devient intéressant, ce qui était légitime devient académique et dépassé. Cette dialectique explique pourquoi les mouvements artistiques successifs se définissent toujours par opposition aux précédents, dans une surenchère permanente de transgression qui paradoxalement reproduit la structure du champ plutôt qu'elle ne la bouleverse. L'autonomisation progressive du champ artistique aux dix-neuvième et vingtième siècles, analysée par Bourdieu dans ''Les Règles de l'art'', s'accompagne d'une définition de plus en plus autoréférentielle de l'art, culminant dans les pratiques conceptuelles qui font de la réflexion sur l'art leur contenu même, comme le théorisait Arthur Danto à partir des ''Brillo Boxes'' de Warhol. Cette autonomie demeure toutefois relative : le champ artistique entretient des relations complexes avec le champ économique et le champ du pouvoir, et l'illusion de l'autonomie absolue fait elle-même partie des stratégies par lesquelles les artistes légitiment leurs pratiques. La croyance en l'autonomie de l'art, en la création désintéressée guidée par la seule recherche esthétique, constitue précisément ce que Bourdieu nomme l''''illusio''', cet investissement dans le jeu qui fait que les agents prennent au sérieux les enjeux du champ, croyant à la valeur intrinsèque de ce pour quoi ils luttent alors que cette valeur résulte de rapports sociaux et historiques contingents. Reconnaître que les œuvres d'art n'ont pas de valeur transcendante mais tirent leur prix du jeu social qui les constitue comme telles ne revient pas à nier leur importance ou leur beauté, mais à en comprendre la genèse sociale. Les critiques adressées à Bourdieu, nombreuses et souvent virulentes, portent principalement sur trois points. Premièrement, on lui reproche un '''déterminisme sociologique''' qui réduirait les agents à des automates exécutant des programmes sociaux inscrits dans leur habitus, sans capacité réflexive, sans possibilité d'échapper aux déterminations de classe. Bourdieu a toujours récusé cette accusation, affirmant que l'habitus n'est pas un destin mais un principe générateur de pratiques qui laisse une marge d'improvisation, que la connaissance sociologique elle-même peut contribuer à desserrer l'emprise des déterminismes en les portant à la conscience. Deuxièmement, on critique sa vision supposément négative ou cynique de la culture, qui dissoudrait toute valeur esthétique authentique dans les stratégies de distinction sociale. Bourdieu rétorque qu'il ne nie pas l'existence du plaisir esthétique mais en analyse les conditions sociales de possibilité, montrant que ce plaisir lui-même est socialement constitué. Troisièmement, certains lui reprochent une fixation sur la reproduction au détriment de l'analyse du changement social, des mobilités ascendantes, des transformations historiques. Bourdieu répond que la reproduction n'est jamais parfaite, que le système génère ses propres contradictions et que comprendre les mécanismes de reproduction constitue précisément la condition pour les transformer politiquement. Malgré ces débats, l'œuvre bourdieusienne demeure incontournable pour toute réflexion sur les rapports entre art, culture et société, ayant profondément marqué la sociologie de l'art, les cultural studies, les études muséales et les politiques culturelles contemporaines. === Champ artistique et autonomie === Le concept bourdieusien de '''champ''', introduit notamment dans ''Les Règles de l'art : Genèse et structure du champ littéraire'' publié en 1992 aux Éditions du Seuil, permet de penser l'art comme un espace social relativement autonome, doté de règles et d'enjeux spécifiques qui ne se réduisent ni aux lois de l'économie générale ni aux déterminations sociales directes. Ce concept, que Bourdieu forge progressivement dès la fin des années 1960 en s'inspirant de la théorie du champ de forces du psychologue social Kurt Lewin, constitue l'un des apports théoriques majeurs de sa sociologie. Il vise à dépasser un double écueil : d'une part, l'idéologie romantique du créateur incréé, du génie artistique surgissant ex nihilo sans déterminations sociales, vision défendue notamment par Jean-Paul Sartre avec sa notion de « projet créateur » ; d'autre part, le réductionnisme marxiste vulgaire qui dissoudrait l'œuvre dans les intérêts de classe de son producteur ou les conditions matérielles de sa production, sans reconnaître la spécificité des logiques proprement culturelles. Le champ désigne précisément cet espace intermédiaire, structuré par des positions objectives et des prises de position esthétiques, où se joue l'activité artistique selon des règles partiellement autonomes. Bourdieu définit le champ comme « un espace structuré de positions » où les agents (artistes, critiques, marchands, collectionneurs, institutions) occupent des places différenciées selon le volume et la structure du capital qu'ils détiennent. Ces positions objectives dans le champ génèrent des dispositions (habitus) et des stratégies qui orientent les pratiques et les prises de position esthétiques des agents. Le champ fonctionne simultanément comme champ de forces, structure objective qui s'impose aux agents qui y entrent, et comme champ de luttes où ces mêmes agents s'affrontent pour conserver ou transformer cette structure selon leurs intérêts spécifiques. Cette double dimension, statique et dynamique, distingue la théorie du champ d'une simple description structurale : le champ n'est jamais figé mais constamment reconfiguré par les luttes qui s'y déroulent, même si ces luttes ne remettent généralement pas en cause l'existence même du champ et de ses enjeux fondamentaux, ce que Bourdieu nomme l'''illusio'', cet investissement collectif dans le jeu qui fait que tous les participants, malgré leurs antagonismes, s'accordent tacitement sur le fait que le jeu vaut la peine d'être joué. Le champ artistique se structure autour de l'opposition fondamentale entre '''pôle de production restreinte''' (ou pôle autonome) et '''pôle de grande production''' (ou pôle hétéronome). Le pôle de production restreinte correspond à « l'art pour l'art », à la production pour les pairs, à la recherche de la reconnaissance symbolique différée auprès d'un public restreint de connaisseurs et de producteurs. Ce pôle valorise l'originalité formelle, la rupture avec les conventions établies, le désintéressement économique immédiat, l'autonomie esthétique maximale par rapport aux demandes externes (du marché, du pouvoir politique, du public bourgeois). Les artistes qui occupent ce pôle accumulent du '''capital symbolique''', forme spécifique de capital qui consiste en la reconnaissance, la légitimité, le prestige accordés par les instances de consécration légitimes du champ : critiques d'avant-garde, revues spécialisées, cénacles artistiques, musées, historiens de l'art. Ce capital symbolique obéit à une '''économie inversée''' : la consécration symbolique maximale s'obtient souvent au prix du renoncement aux profits économiques immédiats, et réciproquement. Le pôle de grande production au contraire correspond à l'art commercial, à la production pour le marché, à la recherche du succès immédiat auprès du grand public et de la rentabilité économique rapide. Ce pôle privilégie la conformité aux attentes du public, le respect des conventions établies, l'efficacité commerciale, la subordination aux demandes externes. Les artistes de ce pôle accumulent du capital économique mais au prix d'une moindre reconnaissance symbolique légitime. Cette opposition structurante ne se superpose pas mécaniquement à l'opposition entre art de qualité et art médiocre, bien qu'elle tende historiquement à coïncider avec elle dans les représentations dominantes du champ. La structure du champ artistique génère une hiérarchie des légitimités où le pôle autonome détient le monopole de la définition légitime de ce qui compte comme art véritable, imposant ses critères d'évaluation à l'ensemble du champ. Cette domination symbolique du pôle autonome masque néanmoins sa domination économique par le pôle hétéronome : les artistes « purs » dépendent matériellement, directement ou indirectement, des ressources économiques produites par l'art commercial, soit parce qu'ils exercent parallèlement des activités rémunératrices (enseignement, critique, commandes occasionnelles), soit parce que les institutions qui les soutiennent (académies, musées, subventions publiques) tirent leurs ressources de l'économie générale. Cette dépendance économique dans l'indépendance symbolique affirmée constitue une des contradictions structurales du champ artistique moderne. Bourdieu retrace minutieusement dans ''Les Règles de l'art'' le processus historique d''''autonomisation''' du champ littéraire français au dix-neuvième siècle, processus qu'il considère comme paradigmatique de l'émergence du champ artistique moderne en général. Avant cette autonomisation, la production littéraire et artistique demeurait largement soumise à des contraintes externes : commandes aristocratiques ou ecclésiastiques, mécénat des grands, dépendance envers les salons mondains, subordination aux académies contrôlées par l'État. Les artistes et écrivains ne constituaient pas un groupe professionnel autonome mais occupaient des positions subalternes dans l'espace social, dépendant des faveurs et de la protection des puissants. Le dix-neuvième siècle voit émerger progressivement les conditions d'une relative autonomie : développement d'un marché du livre et de l'art qui libère partiellement les producteurs du mécénat direct, multiplication des instances de diffusion (revues, journaux, galeries, expositions), constitution d'un public cultivé suffisamment large, affirmation d'un corps de spécialistes (critiques, éditeurs, marchands) qui médiatisent la relation entre producteurs et consommateurs. Les figures de '''Charles Baudelaire''' et de '''Gustave Flaubert''' incarnent selon Bourdieu deux stratégies distinctes mais convergentes dans cette conquête de l'autonomie. Baudelaire, avec ''Les Fleurs du mal'' (1857) et ses écrits critiques, affirme radicalement l'autonomie de l'art contre toute fonction morale, sociale ou politique, théorisant « l'art pour l'art » comme refus de toute subordination externe. Sa vie de dandy marginal, ses provocations scandaleuses, son refus du succès bourgeois, sa revendication de l'artificiel contre le naturel, du beau contre l'utile, manifestent dans sa trajectoire biographique même les principes de l'autonomie esthétique. Baudelaire occupe une position objectivement dominée dans le champ (peu de ressources économiques, marginalité sociale, reconnaissance limitée de son vivant) mais revendique subjectivement cette domination comme marque d'authenticité artistique, inversant ainsi le stigmate en emblème distinctif. Cette alchimie symbolique par laquelle le dominé se transforme en élu, le maudit en prophète, l'échec commercial en réussite artistique, caractérise le pôle autonome en voie de constitution. Flaubert, analysé longuement dans la troisième partie des ''Règles de l'art'' consacrée à ''L'Éducation sentimentale'' (1869), occupe une position différente mais tout aussi stratégique. Fils de notable provincial enrichi, disposant d'une rente qui le dispense de chercher des revenus par sa plume, Flaubert peut se permettre le luxe suprême de l'indépendance économique qui fonde la possibilité d'une indépendance esthétique radicale. Il consacre des années à l'écriture d'œuvres refusant toute concession au goût du public, travaillant obsessionnellement le style, cherchant « le mot juste » avec une exigence proche de l'ascèse. Son refus simultané de l'art social prôné par les républicains progressistes et de l'art bourgeois commercial lui permet d'occuper une position médiane qui transcende les oppositions dominantes de son époque. ''L'Éducation sentimentale'', roman de la désillusion et du désenchantement qui déçoit les attentes narratives conventionnelles, refuse l'intrigue dramatique, multiplie les descriptions objectives et les silences, représente l'accomplissement de ce programme d'autonomisation esthétique. Bourdieu montre comment les choix formels les plus techniques de Flaubert (style indirect libre, asyndète généralisée, neutralité apparente du narrateur) traduisent et réalisent dans l'écriture même sa position objectivement ambiguë dans le champ, ni totalement du côté de l'art pur ni du côté de l'art commercial, occupant un espace interstitiel qu'il constitue précisément en l'occupant. Cette double rupture, baudelairienne et flaubertienne, avec les contraintes externes (demandes du marché, subordination politique, fonctions sociales assignées) marque selon Bourdieu l'entrée du champ littéraire et artistique dans sa phase véritablement autonome. Désormais, les producteurs produisent d'abord pour leurs pairs, les œuvres s'évaluent selon des critères internes au champ, la reconnaissance symbolique légitime s'obtient par la conformité aux valeurs d'autonomie plutôt que par le succès commercial ou mondain. Cette autonomisation ne signifie nullement une indépendance absolue : le champ artistique demeure inscrit dans le '''champ du pouvoir''' (l'espace des positions dominantes dans la société) dont il constitue la fraction dominée (riche en capital culturel mais pauvre en capital économique et politique). Les artistes et intellectuels occupent ainsi une position structuralement ambiguë : dominants par leur capital culturel et symbolique qui leur confère prestige et autorité, dominés par leur dépendance économique et leur faible poids politique effectif. Les '''avant-gardes''' artistiques, qui se succèdent du romantisme au surréalisme en passant par le réalisme, l'impressionnisme, le symbolisme, le cubisme et les autres -ismes qui ponctuent l'histoire de l'art moderne, constituent selon Bourdieu non pas des ruptures purement esthétiques motivées par la seule recherche formelle mais des '''stratégies de positionnement''' dans le champ. Les nouveaux entrants, jeunes artistes dépourvus du capital symbolique accumulé par les dominants établis (artistes académiques, maîtres reconnus, gloires consacrées), ne peuvent s'imposer qu'en renversant les hiérarchies existantes, en contestant les valeurs esthétiques dominantes, en inversant les critères de légitimité. Ce qui était considéré comme vulgaire, trivial, indigne de l'art (la vie quotidienne des classes populaires pour Courbet, les effets lumineux fugitifs pour les impressionnistes, les formes « primitives » pour Gauguin et Picasso) devient intéressant, novateur, authentique. Ce qui était légitime et consacré (la grande peinture d'histoire, le portrait académique, le dessin précis et la composition équilibrée) devient académique, dépassé, conventionnel, « pompier ». Cette dialectique de la distinction, par laquelle chaque avant-garde se définit négativement contre la génération précédente, engendre une dynamique de radicalisation permanente, une surenchère dans la transgression qui paradoxalement reproduit la structure du champ plutôt qu'elle ne la bouleverse. Les luttes au sein du champ artistique portent fondamentalement sur le '''monopole de la légitimité artistique''', c'est-à-dire sur le pouvoir de définir ce qui compte comme art véritable, quels sont les critères d'évaluation pertinents, qui possède l'autorité pour porter des jugements légitimes. Ces luttes ne sont pas consciemment stratégiques au sens d'un calcul rationnel instrumental : elles résultent de l'ajustement inconscient des dispositions (habitus) aux positions occupées et aux trajectoires suivies dans le champ. Un artiste issu des classes populaires, entré tardivement dans le champ par des voies marginales, ayant connu l'échec et la marginalité, développera spontanément des stratégies subversives, contestant les hiérarchies établies, valorisant l'authenticité contre la virtuosité académique, l'originalité brute contre le raffinement cultivé. Un artiste héritier, formé dans les meilleures écoles, bénéficiant de réseaux familiaux dans le milieu artistique, tendra au contraire à défendre l'ordre établi, à valoriser la maîtrise technique, le respect des traditions, la continuité avec les grands maîtres. Ces dispositions ne déterminent pas mécaniquement les pratiques mais structurent l'espace des possibles et orientent probabilistiquement les choix esthétiques. Le capital symbolique accumulé dans le champ artistique possède des propriétés spécifiques qui le distinguent du capital économique. Premièrement, il s'acquiert lentement, par un long processus de reconnaissance progressif auprès des instances légitimes, et se transmet difficilement : les enfants d'artistes célèbres ne héritent pas automatiquement du prestige parental, chaque génération devant refaire ses preuves selon les critères spécifiques du champ à son époque. Deuxièmement, il obéit à des logiques temporelles inversées : un artiste peut acquérir une reconnaissance symbolique posthume après avoir été ignoré de son vivant (Vincent van Gogh exemplifie ce cas paradigmatique), manifestant ainsi que les verdicts du champ ne coïncident pas nécessairement avec les succès commerciaux contemporains. Troisièmement, il dépend crucialement des '''instances de consécration''' qui médiatisent la relation entre producteurs et public : critiques d'art dans les revues spécialisées, conservateurs de musées, historiens de l'art académiques, prix et distinctions officielles, inclusion dans les collections permanentes des grands musées, entrée dans les programmes scolaires et universitaires. Ces instances fonctionnent comme entrepreneurs de capital symbolique, investissant leur propre crédit dans la reconnaissance de certains artistes plutôt que d'autres, pariant sur leur valeur future, contribuant ainsi activement à la production de la valeur symbolique des œuvres. L’'''illusion charismatique''', dénoncée par Bourdieu, consiste à attribuer à l'artiste individuel, à son génie personnel, à sa créativité unique, ce qui résulte en réalité d'un travail collectif de production de la croyance en la valeur de l'œuvre. Une œuvre ne vaut que parce que le champ dans son ensemble reconnaît qu'elle vaut, parce que des critiques en parlent, des musées l'exposent, des historiens l'étudient, des collectionneurs la recherchent, des enseignants l'utilisent comme référence. Cette valeur symbolique, loin d'être intrinsèque aux propriétés matérielles de l'œuvre, résulte d'un processus social complexe de consécration collective. Bourdieu écrit : « L'œuvre d'art n'existe comme objet symbolique doté de valeur que si elle est connue et reconnue, c'est-à-dire socialement instituée comme œuvre d'art par des spectateurs dotés de la disposition et de la compétence esthétiques nécessaires pour la connaître et la reconnaître comme telle. » Cette formulation provocatrice vise à désacraliser l'art en révélant les conditions sociales de possibilité de sa valeur, sans pour autant nier l'existence de différences qualitatives objectives entre les œuvres : simplement, ces différences ne deviennent pertinentes que dans et par le système de relations qui constitue le champ. L'autonomie du champ artistique, conquise au dix-neuvième siècle, demeure néanmoins fragile et constamment menacée. Bourdieu identifie plusieurs processus qui tendent à '''hétéronomiser''' le champ, c'est-à-dire à le soumettre à nouveau à des logiques externes. Le '''marché de l'art''' contemporain, avec sa financiarisation croissante, transforme les œuvres en actifs spéculatifs, en placements financiers dont la valeur dépend moins de leur reconnaissance symbolique légitime que des stratégies des grands collectionneurs et des maisons de ventes. Les '''industries culturelles''' (édition, cinéma, musique enregistrée) imposent des contraintes de rentabilité commerciale qui limitent la prise de risque esthétique et favorisent les productions standardisées conformes aux goûts du public le plus large. Les '''politiques culturelles d'État''', malgré leurs intentions démocratiques affichées, peuvent subordonner le soutien aux artistes à des critères non artistiques : représentation de la diversité, impact social mesurable, attractivité touristique, rayonnement national. Ces pressions hétéronomes ne détruisent pas l'autonomie du champ mais la limitent, créant des tensions permanentes entre exigences économiques et valeurs esthétiques, entre succès commercial et reconnaissance symbolique légitime. Bourdieu défend néanmoins l'autonomie du champ artistique comme valeur à préserver, non par fétichisme de l'art pour l'art mais parce que cette autonomie constitue la condition de possibilité d'une production culturelle authentiquement critique et novatrice. Dans ''Les Règles de l'art'' et plus encore dans ses interventions publiques tardives (notamment ''Contre-feux'', 1998), il appelle les intellectuels et les artistes à un « corporatisme de l'universel », c'est-à-dire à la défense collective des conditions sociales qui rendent possible l'activité intellectuelle et artistique autonome. Cette position apparemment paradoxale — défendre corporativement des intérêts particuliers (ceux du champ intellectuel et artistique) au nom de l'universel — se justifie selon Bourdieu par le fait que les champs autonomes (science, art, littérature) constituent les lieux sociaux où peuvent se produire des œuvres et des connaissances qui transcendent les intérêts particuliers immédiats. L'autonomie des champs culturels représente ainsi un acquis historique fragile, une conquête collective qu'il faut défendre contre les menaces permanentes de subordination aux logiques économiques et politiques. Cette défense n'implique nullement un repli élitiste ou un mépris du public, mais au contraire la conviction que seule l'autonomie permet aux producteurs culturels de produire des œuvres véritablement universalisables plutôt que de simples reflets des demandes immédiates du marché ou du pouvoir. == Art et Pouvoir : Critiques Idéologiques == === Postmodernisme et critique culturelle === Le postmodernisme constitue l'un des phénomènes culturels et intellectuels les plus controversés de la fin du vingtième siècle, suscitant des débats passionnés et des interprétations conflictuelles. Le terme lui-même, utilisé sporadiquement dès les années 1950 dans le domaine architectural, acquiert une résonance théorique majeure avec la publication en 1979 de ''La Condition postmoderne : Rapport sur le savoir'' de Jean-François Lyotard, commandé par le gouvernement du Québec pour évaluer l'état du savoir dans les sociétés contemporaines. Lyotard y définit le postmoderne comme « l'incrédulité à l'égard des méta-récits », c'est-à-dire la perte de confiance dans les grands récits de légitimation qui structuraient la modernité : récit du progrès des Lumières, récit de l'émancipation par la raison, récit de la révolution prolétarienne menant à une société sans classes. Cette « fin des méta-récits » ne relève pas d'un choix philosophique délibéré mais résulte selon Lyotard de transformations objectives dans les conditions de production et de circulation du savoir, liées notamment à l'informatisation de la société. Les critères de performativité et d'efficacité opérationnelle tendent à remplacer les anciennes questions de vérité et de justice, fragmentant le savoir en une multitude de « jeux de langage » incommensurables. Hal Foster, historien et critique d'art américain, propose en 1983 dans son introduction au recueil collectif ''The Anti-Aesthetic: Essays on Postmodern Culture'' une distinction conceptuelle influente entre deux formes de postmodernisme. D'un côté, le '''postmodernisme de résistance''' constitue une contestation critique du modernisme orthodoxe et de ses prétentions à l'autonomie, à la pureté, à l'universalité. Ce postmodernisme déconstruit les oppositions binaires qui structuraient la pensée moderniste (haut/bas, art/culture de masse, original/copie), interroge les conditions institutionnelles de légitimation de l'art, dénaturalise les évidences idéologiques dissimulées dans les images. Il se manifeste dans les pratiques de la « Pictures Generation » (Cindy Sherman, Barbara Kruger, Richard Prince, Sherrie Levine) qui utilisent l'appropriation photographique, le pastiche, la citation pour mettre à nu les mécanismes de construction des identités et des désirs par la culture visuelle. D'un autre côté, le '''postmodernisme de réaction''' ou néo-conservateur constitue selon Foster un retour nostalgique à des formes expressives traditionnelles (néo-expressionnisme allemand et italien, trans-avant-garde), une célébration du pluralisme éclectique qui masque en réalité le refus de toute critique systématique, une soumission complaisante aux logiques du marché de l'art. Ce postmodernisme réactionnaire récupère les stratégies avant-gardistes historiques tout en vidant leur contenu subversif, transformant la transgression en spectacle consommable, le scandale en produit marketable. Foster reconnaît que cette distinction demeure parfois difficile à maintenir dans la pratique, comme en témoignent ses propres hésitations ultérieures. La frontière entre critique et complicité s'avère poreuse : des œuvres initialement conçues comme subversives peuvent être récupérées et neutralisées par les institutions ; inversement, des productions apparemment commerciales peuvent révéler des dimensions critiques inattendues. Cette ambivalence structurelle du postmodernisme le distingue radicalement du modernisme qui maintenait une séparation nette entre culture haute et culture basse, entre avant-garde critique et kitsch conformiste. Le postmodernisme brouille délibérément ces frontières, pratiquant l'hybridation, le mélange des registres, l'indécidabilité générique. Cette indistinction peut être lue positivement comme démocratisation culturelle, abolition des hiérarchies élitistes, reconnaissance de la légitimité des cultures populaires et minoritaires. Mais elle peut aussi être interprétée négativement comme perte de toute capacité critique, dissolution du jugement esthétique dans le relativisme généralisé, absorption de toute altérité par la logique marchande. Fredric Jameson, critique marxiste américain et figure majeure de la théorie culturelle contemporaine, développe dans ''Postmodernism, or, The Cultural Logic of Late Capitalism'' (article de 1984, livre de 1991) l'analyse la plus ambitieuse et la plus systématique du postmodernisme comme phénomène culturel total. Reprenant et prolongeant la thèse de l'économiste belge Ernest Mandel exposée dans ''Late Capitalism'' (1972), Jameson affirme que le postmodernisme constitue la logique culturelle dominante d'un troisième stade du capitalisme, qu'il nomme '''capitalisme tardif''' ou capitalisme multinational. Ce stade, caractérisé par la mondialisation des échanges, la financiarisation de l'économie, la révolution informatique et l'extension de la marchandisation à tous les domaines de l'existence, engendre nécessairement des formes culturelles spécifiques qui reflètent et reproduisent ses structures profondes. Le postmodernisme ne représente donc pas un simple « style » parmi d'autres mais l'expression culturelle nécessaire d'un nouveau mode de production capitaliste. Cette thèse matérialiste distingue radicalement Jameson des poststructuralistes français (Lyotard, Baudrillard, Derrida) qu'il critique pour leur idéalisme linguistique et leur abandon de la critique de l'économie politique. Jameson identifie plusieurs caractéristiques formelles du postmodernisme qui le différencient du modernisme. Premièrement, le '''pastiche''' remplace la parodie moderniste. Alors que la parodie suppose un écart normatif entre l'original imité et sa reprise comique ou critique, le pastiche constitue une « imitation neutre », une citation sans guillemets qui ne se situe plus par rapport à aucune norme linguistique stable. Le pastiche postmoderne ne juge pas, ne hiérarchise pas, ne prend pas position : il juxtapose simplement des fragments stylistiques hétérogènes sans les soumettre à une synthèse unifiante. Cette pratique généralisée du pastiche témoigne selon Jameson d'une crise plus profonde : la disparition du style individuel, de la « voix » singulière de l'artiste qui caractérisait le modernisme. Si les modernistes (Picasso, Kafka, Schönberg) possédaient des manières immédiatement reconnaissables, des idiomes personnels inimitables, les postmodernes pratiquent systématiquement l'emprunt, l'appropriation, le recyclage, manifestant ainsi l'épuisement de l'innovation formelle comme valeur cardinale. Deuxièmement, le postmodernisme se caractérise par une '''crise de l'historicité''', c'est-à-dire par l'incapacité à relier organiquement le passé au présent et à projeter un futur distinct. Cette crise se manifeste dans la '''mode rétro''', dans l'obsession nostalgique pour les décennies antérieures (années 1930, 1950, 1960), dans la transformation de l'histoire en réservoir de styles visuels consommables. Le film ''Chinatown'' (1974) de Roman Polanski exemplifie cette esthétique rétro : il ne reconstitue pas authentiquement les années 1930 mais notre image stéréotypée de cette période telle que construite par les films noirs classiques, produisant ainsi une « image de l'image » plutôt qu'un accès direct au passé historique. Cette perte de profondeur historique conduit à un '''présentisme''' caractéristique où seul existe l'instant présent, déconnecté de toute continuité narrative, de toute téléologie progressiste. Jameson compare l'expérience postmoderne au vécu schizophrénique décrit par Jacques Lacan : une succession d'instants purs, intenses, déliés de toute chaîne signifiante, sans mémoire du passé ni anticipation de l'avenir. Troisièmement, Jameson identifie un '''affaiblissement de l'affect''' (''waning of affect'') dans la culture postmoderne. Les œuvres modernistes exprimaient des émotions intenses, même négatives : angoisse existentielle, aliénation, révolte, désespoir. Les œuvres postmodernes cultivent au contraire une certaine froideur émotionnelle, une distance ironique, un détachement ludique. Jameson compare deux tableaux de chaussures : ''Les Souliers'' de Vincent van Gogh (1886) et ''Diamond Dust Shoes'' d'Andy Warhol (années 1980). Le tableau de van Gogh, selon l'interprétation heideggérienne, révèle la vérité du monde paysan, exprime la pénibilité du travail agricole, manifeste une présence quasi mystique de l'être dans l'usure du cuir. Les chaussures de Warhol au contraire, photographiées dans une publicité de magazine puis sérigraphiées et saupoudrées de poudre de diamant, ne renvoient à rien d'autre qu'elles-mêmes comme images plates, surfaces décoratives dépourvues de toute profondeur herméneutique. Cette comparaison cristallise le passage du modernisme au postmodernisme : de la profondeur à la surface, de l'expression à la citation, de l'original à la copie, de l'aura au simulacre. Quatrièmement, l'espace postmoderne se caractérise par une '''hyperspacialité''' qui dépasse nos capacités cognitives de cartographie mentale. Jameson analyse longuement le '''Westin Bonaventure Hotel''' à Los Angeles (architecte John Portman, 1976), gigantesque complexe hôtelier dont l'organisation spatiale désoriente systématiquement les visiteurs. Les entrées multiples ne signalent pas clairement leur statut, les ascenseurs panoramiques deviennent attractions spectaculaires occultant leur fonction pratique, les passages et les niveaux s'enchevêtrent selon une logique labyrinthique. Cette architecture postmoderne incarne selon Jameson notre incapacité contemporaine à nous situer dans la totalité sociale : de même que le visiteur se perd dans le Bonaventure, le sujet postmoderne ne parvient plus à se représenter mentalement le système capitaliste mondial dans lequel il est pourtant inextricablement pris. Jameson appelle de ses vœux une nouvelle '''cartographie cognitive''' (''cognitive mapping''), un art capable de nous aider à nous orienter dans l'espace déréalisé du capitalisme multinational. Jean Baudrillard, sociologue et philosophe français, développe parallèlement une théorie du postmoderne centrée sur les notions de '''simulacre''' et d''''hyperréalité'''. Dans ''Simulacres et simulation'' (1981), Baudrillard affirme que la société contemporaine a franchi un seuil qualitatif où les signes ne renvoient plus à aucune réalité extérieure mais ne font que se référer circulairement les uns aux autres, produisant ce qu'il nomme l'hyperréalité. Le simulacre ne se contente pas de représenter ou de dissimuler la réalité : il la remplace entièrement, devient plus réel que le réel lui-même. Baudrillard distingue quatre phases historiques de l'image selon son rapport au réel. Premièrement, l'image reflète une réalité profonde (ordre sacramental, société traditionnelle). Deuxièmement, l'image masque et dénature une réalité profonde (ordre idéologique, société bourgeoise). Troisièmement, l'image masque l'absence de réalité profonde (ordre sorcier, entrée dans le simulacre). Quatrièmement, l'image n'a plus aucun rapport au réel quel qu'il soit, elle est son propre simulacre pur (ordre de la simulation, contemporanéité). Cette dernière phase, caractéristique du postmoderne, se manifeste exemplairement dans '''Disneyland''' que Baudrillard analyse comme « un modèle parfait de tous les ordres de simulacres enchevêtrés ». Disneyland ne se présente pas comme imaginaire pour faire croire que le reste de l'Amérique serait réel, alors que c'est tout Los Angeles et l'Amérique entière qui sont devenus Disneyland, c'est-à-dire simulation. Disneyland fonctionne comme alibi hyperréaliste : en se présentant ouvertement comme fictif et artificiel, le parc d'attractions dissimule que toute l'Amérique est déjà de l'ordre de l'hyperréel, que les frontières entre réalité et simulation se sont définitivement effacées. De même, la télé-réalité (''reality shows''), qui émerge dans les années 1970-1980, ne documente pas la réalité mais la remplace par sa mise en scène télévisuelle. Les participants eux-mêmes ne distinguent plus leur vie « réelle » de leur vie médiatisée, intériorisant le regard de la caméra jusqu'à perdre tout rapport authentique à eux-mêmes. Cette dissolution du réel dans le simulacre caractérise selon Baudrillard la condition postmoderne : nous ne vivons plus dans un monde réel représenté par des images mais dans un univers d'images sans référent, de signes qui ne signifient rien d'autre qu'eux-mêmes. La '''société de consommation''', analysée par Baudrillard dès 1970, constitue le terrain privilégié de cette prolifération des simulacres. Les objets de consommation ne se définissent plus principalement par leur valeur d'usage (fonction pratique) ni même par leur valeur d'échange (prix marchand) mais par leur '''valeur-signe''', c'est-à-dire par leur inscription dans un système de différences symboliques qui marque le statut social du consommateur. On ne consomme plus des aliments pour se nourrir mais des marques qui signalent notre appartenance à tel ou tel groupe social, notre adhésion à tel ou tel style de vie. La publicité ne vante plus les qualités objectives des produits mais vend des images, des atmosphères, des univers symboliques dans lesquels le consommateur est invité à se projeter. Cette sémiotisation généralisée transforme la réalité entière en système de signes où tout fait sens, où rien n'existe qui ne soit déjà codé, interprété, intégré dans les circuits de la communication marchande. Baudrillard en conclut au « meurtre du réel », au « crime parfait » par lequel la réalité disparaît sans laisser de cadavre, remplacée par son double opérationnel hyperréel. Les critiques adressées au postmodernisme et à ses théorisations portent sur plusieurs registres. Jürgen Habermas, philosophe allemand héritier de l'École de Francfort, accuse dans « La modernité : un projet inachevé » (1980) les postmodernes de '''néoconservatisme''' culturel. En renonçant à la raison critique, aux idéaux émancipateurs des Lumières, au projet d'une société rationnellement organisée, les postmodernes abandonnent selon Habermas toute perspective de transformation sociale progressive. Leur célébration du fragmentaire, de l'hétérogène, du local contre l'universel, loin de constituer une radicalisation de la critique, représente au contraire un renoncement politique qui fait objectivement le jeu des forces conservatrices. Habermas appelle à '''achever le projet de la modernité''' plutôt qu'à le dissoudre prématurément dans le relativisme postmoderne, à prolonger l'effort d'auto-clarification rationnelle que représentaient les Lumières plutôt qu'à y renoncer sous prétexte que cet effort aurait échoué ou conduit à des impasses. Cette accusation de néoconservatisme vise particulièrement la French Theory (Lyotard, Foucault, Derrida) mais aussi les postmodernes américains. D'autres critiques, notamment marxistes, reprochent aux théorisations postmodernes leur '''idéalisme culturaliste''' qui accorderait aux phénomènes culturels, langagiers, symboliques, une autonomie excessive, négligeant les déterminations économiques matérielles. Perry Anderson, historien marxiste britannique, affirme dans ''The Origins of Postmodernity'' (1998) que le postmodernisme constitue « l'équivalent culturel de la financiarisation de l'économie », la superstructure idéologique qui légitime et naturalise le capitalisme néolibéral mondialisé. Terry Eagleton, critique littéraire marxiste, dénonce dans ''The Illusions of Postmodernism'' (1996) le relativisme épistémologique, le ludisme dépolitisant et le nihilisme complice des théories postmodernes. L'insistance postmoderne sur la multiplicité des perspectives, sur la construction sociale de toute vérité, sur l'impossibilité de critères d'évaluation objectifs, conduirait selon ces critiques à une paralysie politique où toutes les positions se valent, où aucun engagement ne peut se légitimer rationnellement, où la seule attitude cohérente devient le cynisme désabusé ou l'ironie distanciée. Malgré ces controverses, les théories postmodernes ont exercé une influence considérable sur les pratiques artistiques, la critique culturelle, les études littéraires, les sciences sociales depuis les années 1980. Elles ont contribué à légitimer l'intérêt académique pour la culture populaire, les médias de masse, les pratiques vernaculaires, longtemps méprisées comme indignes d'analyse sérieuse. Elles ont encouragé l'attention portée aux phénomènes de citation, d'appropriation, de remix, de recyclage qui caractérisent la création contemporaine. Elles ont favorisé la critique des grands récits universalistes qui occultaient la diversité des expériences historiques, particulièrement celles des colonisés, des minorités, des femmes, des subalternes exclus de la narrativité dominante. Elles ont affiné notre compréhension des modes de fonctionnement du capitalisme contemporain et de ses mutations culturelles. Qu'on les approuve ou qu'on les récuse, les théorisations postmodernes demeurent incontournables pour penser les transformations de l'art et de la culture à l'époque contemporaine. === Art et idéologie === La question du rapport entre art et idéologie constitue l'un des terrains les plus fertiles et les plus conflictuels de la théorie critique, mobilisant des traditions philosophiques diverses et des enjeux politiques majeurs. Cette problématique s'inscrit dans le sillage de la pensée marxiste qui, depuis Karl Marx et Friedrich Engels, s'est efforcée de comprendre comment les productions culturelles et artistiques participent aux rapports de domination sociale, légitiment l'ordre établi ou au contraire contribuent à sa contestation. La question centrale peut se formuler ainsi : l'art reflète-t-il passivement l'idéologie dominante de la classe au pouvoir, ou possède-t-il une capacité critique spécifique qui lui permet de révéler et de contester les mécanismes de domination ? Cette alternative trop schématique a été progressivement dépassée par des théorisations plus dialectiques qui reconnaissent la complexité et l'ambivalence du rapport entre art et idéologie. Dans les écrits de Marx et Engels, dispersés dans leur correspondance et dans des textes polémiques plutôt que systématisés dans une esthétique cohérente, l'art apparaît comme une production superstructurelle déterminée en dernière instance par les rapports de production économiques qui constituent l'infrastructure matérielle de la société. Cette causalité structurale n'implique cependant pas un déterminisme mécanique : Marx reconnaît la possibilité d'un décalage entre les convictions idéologiques conscientes de l'artiste et le contenu objectif de son œuvre. La correspondance célèbre avec Margaret Harkness à propos d'Honoré de Balzac exemplifie cette problématique. Marx et Engels admiraient profondément Balzac bien que celui-ci fût monarchiste et catholique légitimiste, parce que son réalisme impitoyable révélait la décadence inéluctable de l'aristocratie et la montée de la bourgeoisie avec une lucidité que ne possédaient pas les écrivains progressistes de son époque, idéologiquement plus proches du marxisme. Cette « victoire du réalisme » sur les préjugés personnels de l'auteur témoigne selon Engels que la grande littérature possède une logique interne, une vérité propre qui peut contredire les intentions conscientes du créateur. Theodor W. Adorno développe dans ''Aesthetic Theory'', son œuvre posthume majeure publiée en 1970 et inachevée à sa mort en 1969, la théorisation la plus sophistiquée et la plus dialectique du rapport entre art et société dans la tradition de l'École de Francfort. Pour Adorno, l'art se caractérise par une '''double nature''' (''Doppelcharakter'') fondamentalement contradictoire : d'une part, il constitue un '''fait social''' (''fait social''), un produit historique déterminé par les conditions matérielles et idéologiques de sa production, inscrit dans les rapports sociaux de son époque, participant à l'industrie culturelle et au marché de l'art. D'autre part, l'art authentique possède une dimension d''''autonomie''' qui lui permet précisément de se distancier de la société qui le produit, de s'opposer à elle, de fonctionner comme sa négation déterminée. Cette autonomie ne signifie nullement une séparation absolue ou une indépendance totale de l'art par rapport à la société, ce qui serait une illusion idéaliste. L'autonomie esthétique constitue au contraire un phénomène historiquement situé, conquis progressivement par l'art moderne dans son émancipation des fonctions religieuses, cultuelles et représentatives qui l'assignaient auparavant à des fins externes. L'art n'est donc social ni par ses contenus thématiques explicites ni par son origine dans telle ou telle classe sociale, mais par sa '''forme''' même, par les contradictions objectives qu'elle cristallise. Les œuvres d'art authentiques, en tant que monades sans fenêtres selon l'expression leibnizienne qu'Adorno reprend et transforme, contiennent la société en elles-mêmes sans la refléter directement, sans l'imiter mimétiquement. Adorno écrit : « Le contenu social de l'art est sa protestation inconsciente contre le cours du monde. » Cette protestation ne s'exprime pas nécessairement dans des œuvres explicitement politiques ou engagées, qui risquent toujours de tomber dans la propagande ou le didactisme. Elle réside plutôt dans la résistance formelle que l'œuvre oppose aux normes esthétiques établies, dans son refus de la réconciliation facile, dans sa capacité à maintenir les tensions et les contradictions plutôt qu'à les résoudre harmonieusement. L'art moderne, depuis Baudelaire jusqu'à la musique sérielle de Schönberg et la peinture abstraite, manifeste cette négativité radicale par son hermétisme, sa difficulté d'accès, son refus du plaisir immédiat et de la consommation facile. L'autonomie de l'art, conquête historique fragile et constamment menacée, constitue paradoxalement la condition de sa '''vérité sociale'''. Plus l'œuvre s'arrache aux demandes immédiates de la société, plus elle affirme sa spécificité irréductible, plus elle peut révéler les contradictions objectives de cette société. L'art autonome fonctionne comme '''promesse de bonheur''' (''promesse du bonheur''), formule qu'Adorno emprunte à Stendhal : il anticipe utopiquement une réconciliation entre l'homme et la nature, entre le sujet et l'objet, entre la raison et la sensibilité, réconciliation impossible dans les conditions aliénées du capitalisme tardif mais néanmoins inscrite comme horizon dans les grandes œuvres d'art. Cette dimension utopique demeure cependant négative : l'art ne présente pas positivement l'utopie réalisée mais manifeste négativement l'impossibilité de sa réalisation dans le monde existant. Les dissonances de la musique moderne, les ruptures narratives du roman moderniste, l'abstraction picturale témoignent de cette impossibilité en refusant l'apparence de totalité harmonieuse qui caractérise l'art traditionnel et l'industrie culturelle contemporaine. Adorno distingue rigoureusement l''''art authentique''' (''echte Kunst'') de l''''industrie culturelle''' (''Kulturindustrie''), concept qu'il développe avec Max Horkheimer dans ''La Dialectique de la raison'' (1947). L'industrie culturelle désigne la production standardisée et massifiée de biens culturels selon les logiques de la rationalité instrumentale capitaliste : cinéma hollywoodien, musique de variété, best-sellers, télévision commerciale. Ces productions ne constituent pas de l'art véritable mais des marchandises culturelles destinées à la consommation de masse, fabriquées selon des formules éprouvées, visant le profit maximal par la satisfaction des attentes prévisibles du public. L'industrie culturelle ne laisse aucune place à l'imagination du consommateur, elle anticipe et programme ses réactions, transformant les individus en sujets passifs manipulés par les techniques publicitaires et les mécanismes de conditionnement psychologique. Cette pseudo-culture fonctionne comme idéologie pure : elle masque les contradictions sociales, naturalise l'ordre existant, intègre les individus dans le système de domination en leur procurant des satisfactions compensatoires illusoires. L'art authentique au contraire exige une participation active du récepteur, il résiste à la consommation immédiate, il maintient une distance critique. Cependant, cette distinction entre art et industrie culturelle ne constitue pas une opposition statique mais une tension dynamique. Adorno reconnaît que l'autonomie de l'art demeure précaire et constamment menacée par la pression de la marchandisation généralisée. L'art lui-même participe au '''caractère fétiche de la marchandise''' : les œuvres circulent sur le marché de l'art, acquièrent des valeurs marchandes démesurées, servent de placements spéculatifs, fonctionnent comme marqueurs de distinction sociale. Cette dimension fétichiste ne contredit pas l'autonomie esthétique mais en constitue paradoxalement la condition historique : c'est précisément parce que les œuvres deviennent des marchandises autonomes, détachées de toute fonction pratique immédiate, qu'elles peuvent développer leur logique propre. Adorno écrit : « L'autonomie de l'art a été achetée au prix du fétichisme. » Cette formulation dialectique refuse aussi bien l'idéalisation naïve de l'art comme sphère pure que sa réduction cynique à un simple commerce. Louis Althusser, philosophe marxiste français, propose dans « Idéologie et appareils idéologiques d'État » publié en 1970 dans la revue ''La Pensée'' un cadre théorique original pour penser les mécanismes de reproduction sociale et le rôle qu'y jouent les institutions culturelles. Althusser distingue les '''Appareils répressifs d'État''' (ARE) qui fonctionnent principalement par la violence (armée, police, tribunaux, prisons) et les '''Appareils idéologiques d'État''' (AIE) qui fonctionnent principalement par l'idéologie (école, église, famille, médias, institutions culturelles). Ces AIE, bien que diversifiés et apparemment indépendants, convergent tous vers l'objectif de reproduire les rapports de production capitalistes en formant des sujets adaptés à leurs positions respectives dans la division sociale du travail. L'école notamment a supplanté l'église comme AIE dominant dans les sociétés capitalistes avancées, inculquant simultanément des savoir-faire techniques et une soumission aux règles de l'ordre établi. Le concept d''''interpellation''' élaboré par Althusser décrit le mécanisme par lequel l'idéologie constitue les individus en sujets. L'idéologie « interpelle » les individus concrets en sujets concrets, leur assignant une identité et une place dans l'ordre social. Althusser illustre ce processus par la scène paradigmatique du policier qui hèle quelqu'un dans la rue : « Hé, vous, là-bas ! » L'individu interpellé se retourne, se reconnaît dans cet appel, devient par ce geste même le sujet de l'interpellation. Cette reconnaissance constitue simultanément une méconnaissance : le sujet se vit comme origine libre et autonome de ses actions alors qu'il n'est que l'effet de l'interpellation idéologique, assujetti aux structures qui le constituent. L'idéologie n'est donc pas une simple illusion ou fausse conscience qu'il suffirait de dissiper par la connaissance, mais elle possède une '''existence matérielle''' : elle s'incarne dans des pratiques, des rituels, des institutions, des appareils qui produisent effectivement les sujets dont la société a besoin pour se reproduire. Les institutions artistiques et culturelles fonctionnent comme AIE, participant à la reproduction de l'idéologie dominante en formant le goût, en légitimant certaines formes d'expression au détriment d'autres, en inculquant le respect des hiérarchies symboliques. Les musées, les écoles d'art, les académies, les critiques, les médias culturels constituent un dispositif complexe qui sélectionne, consacre, canonise certaines œuvres et certains artistes tout en marginalisant ou excluant d'autres. Cependant, Althusser reconnaît que l'art véritable entretient un rapport spécifique à l'idéologie, distinct de celui de la science ou de la philosophie. Dans une « Lettre sur la connaissance de l'art » adressée à André Daspre en 1966, Althusser affirme que l'art authentique nous permet de « voir », de « percevoir » et de « sentir » quelque chose de l'idéologie dont il est nourri, créant ainsi une distance interne qui distingue l'art de l'idéologie ordinaire. Cette formulation prudente, qui privilégie les verbes de perception plutôt que celui de connaissance, suggère que l'art ne produit pas de connaissance scientifique de l'idéologie mais en offre une expérience sensible spécifique. Terry Eagleton, critique littéraire marxiste britannique, développe dans ''The Ideology of the Aesthetic'' (1990) une généalogie critique de la catégorie esthétique depuis le dix-huitième siècle, montrant comment le discours sur l'art et le beau a constamment servi des fonctions idéologiques, particulièrement dans l'émergence et la consolidation de l'hégémonie bourgeoise. L'esthétique moderne naît avec Alexander Gottlieb Baumgarten et Emmanuel Kant au moment précis où la bourgeoisie européenne cherche à se constituer comme classe dominante, et elle remplit dès l'origine une fonction politique cruciale : réconcilier la raison et la sensibilité, l'universel et le particulier, la loi morale et le désir, tensions qui menacent l'ordre social bourgeois. Le jugement de goût kantien, prétendument désintéressé et universel, masque en réalité les intérêts de classe de la bourgeoisie cultivée qui impose ses normes esthétiques comme valeurs universelles de l'humanité. L'idéologie de l'esthétique consiste précisément à naturaliser ces normes contingentes, à présenter comme propriétés objectives des œuvres ce qui résulte de rapports sociaux historiquement déterminés. Eagleton analyse comment différents philosophes et théoriciens de l'esthétique, de Friedrich Schiller à [[Philosophie/Nietzsche|Friedrich Nietzsche]] en passant par Søren Kierkegaard et Arthur Schopenhauer, ont articulé diversement le rapport entre l'esthétique et le politique, oscillant entre une conception émancipatrice de l'art comme anticipation utopique d'une société réconciliée et une conception conservatrice de l'art comme compensation imaginaire aux frustrations de la vie réelle. L'esthétique moderne oscille constamment entre ces deux pôles : tantôt elle affirme l'autonomie radicale de l'art qui refuse toute subordination aux fins externes (l'art pour l'art), tantôt elle revendique son engagement politique et sa fonction sociale transformatrice (l'art engagé, le réalisme socialiste). Cette oscillation n'est pas accidentelle mais constitutive : elle reflète la position ambiguë de l'art et des intellectuels dans la structure de classes capitaliste, simultanément privilégiés par leur capital culturel et dominés par leur dépendance économique. La théorie critique marxiste de l'art se heurte à plusieurs difficultés théoriques persistantes. Premièrement, la question de l''''évaluation esthétique''' : si l'art est déterminé par l'idéologie, selon quels critères peut-on distinguer les grandes œuvres des productions médiocres ? Affirmer que Shakespeare ou Goethe « transcendent » leur idéologie de classe risque de réintroduire subrepticement une conception idéaliste du génie créateur. Inversement, réduire toutes les œuvres à leurs déterminations idéologiques conduit à un relativisme qui dissout tout jugement de valeur. Deuxièmement, la question de l''''intentionnalité''' : l'écart entre les intentions conscientes de l'auteur et le contenu objectif de l'œuvre soulève des problèmes méthodologiques complexes. Comment interpréter cet écart sans tomber dans la sur-interprétation arbitraire qui plaque sur les textes des significations que leurs auteurs n'y ont pas mises ? Troisièmement, la question de l''''efficacité politique''' de l'art : l'art critique possède-t-il véritablement une capacité transformatrice ou ne procure-t-il qu'une satisfaction symbolique compensatoire qui finalement consolide l'ordre établi en offrant aux dominés une illusion de liberté ? Ces apories ont suscité des réponses diverses au sein de la tradition marxiste. Bertolt Brecht défend un '''théâtre épique''' qui, par l'effet de distanciation (''Verfremdungseffekt''), vise à briser l'identification émotionnelle du spectateur avec les personnages pour susciter une attitude critique et réflexive. Georg Lukács au contraire défend le '''réalisme critique''' qui, par la création de types sociaux représentatifs, révèle les lois objectives du développement historique. Walter Benjamin explore les transformations de l'art à l'ère de sa '''reproductibilité technique''', montrant comment la photographie et le cinéma détruisent l'« aura » des œuvres uniques tout en ouvrant des possibilités politiques nouvelles. Herbert Marcuse théorise la '''dimension esthétique''' comme préservation d'un principe de plaisir subversif contre le principe de réalité répressif du capitalisme. Ces divergences témoignent de la richesse et de la vitalité du débat marxiste sur l'art, débat qui demeure d'une actualité brûlante à l'époque contemporaine où la marchandisation de la culture atteint des niveaux sans précédent. === Art postcolonial et appropriation culturelle === La théorie postcoloniale constitue l'un des développements intellectuels les plus significatifs de la fin du vingtième siècle, transformant radicalement la compréhension des rapports entre culture, pouvoir et identité dans le contexte de l'héritage colonial. Cette théorie ne se limite pas à analyser la période historique de la colonisation formelle et sa fin mais interroge les structures de domination, les modes de représentation et les dynamiques identitaires qui perdurent longtemps après les indépendances politiques. Le préfixe « post » ne signifie donc pas « après » au sens d'une simple succession chronologique mais désigne plutôt un rapport critique complexe à l'héritage colonial, une situation transitoire où coexistent l'émancipation formelle et la persistance de relations d'inégalité héritées de la période coloniale. La théorie postcoloniale s'intéresse particulièrement aux productions culturelles et artistiques, montrant comment la littérature, les arts visuels, le cinéma, la musique participent aux processus de domination symbolique mais peuvent aussi devenir des espaces de résistance et de subversion. Edward Said publie en 1978 ''Orientalism'', ouvrage fondateur qui révolutionne les études postcoloniales en établissant que la représentation occidentale de l''''Orient''' ne constitue pas une description objective mais une construction discursive au service de la domination impériale. Said, intellectuel palestinien né à Jérusalem en 1935 et exilé aux États-Unis où il enseigna la littérature comparée à l'université Columbia jusqu'à sa mort en 2003, s'inspire explicitement de Michel Foucault pour analyser l'orientalisme comme '''système de savoir-pouvoir'''. L'orientalisme désigne selon Said « un style de pensée fondé sur une distinction ontologique et épistémologique entre l'Orient et, la plupart du temps, l'Occident ». Cette distinction ne reflète aucune réalité objective mais produit l''''Orient''' comme objet de connaissance et de domination pour l''''Occident'''. L'orientalisme fonctionne ainsi à trois niveaux interdépendants : académique (discipline universitaire étudiant les langues, les cultures, les histoires orientales), imaginaire (ensemble de représentations romanesques, pittoresques, exotiques de l'Orient dans la littérature et les arts), et institutionnel (dispositifs de contrôle et d'administration des territoires colonisés). Said démontre que l'orientalisme ne décrit pas l'Orient réel mais le constitue discursivement comme altérité radicale de l'Occident, comme son '''Autre''' essentiel. L'Orient apparaît dans le discours orientaliste comme mystérieux, irrationnel, despotique, stagnant, féminin, passif, dangereux, arriéré, et requérant l'intervention civilisatrice occidentale. Ces stéréotypes négatifs justifient moralement la domination coloniale : puisque les Orientaux sont incapables de se gouverner eux-mêmes rationnellement, l'Occident a le devoir de les administrer, de les éduquer, de les moderniser. L'orientalisme produit ainsi un double mouvement : il construit l'Orient comme inférieur tout en se constituant lui-même comme supérieur par contraste. L'identité occidentale se définit négativement par ce qu'elle n'est pas : irrationnelle, despotique, stagnante, féminine. Said analyse minutieusement des textes d'orientalistes savants comme William Jones, Edward Lane, Louis Massignon, Hamilton Gibb, mais aussi d'écrivains comme Gustave Flaubert, Gérard de Nerval, Richard Burton, démontrant comment leurs écrits participent à la constitution de l'Orient comme objet de fantasme et de domination. L'influence de ''Orientalism'' sur les études postcoloniales, les études culturelles, l'histoire de l'art, les études littéraires s'avère considérable et durable. L'ouvrage ouvre la voie à l'analyse systématique des '''politiques de représentation''' : comment les images, les récits, les discours sur l'Autre participent-ils aux rapports de pouvoir ? Comment contester ces représentations hégémoniques et produire des contre-récits émancipateurs ? Said lui-même prolonge sa réflexion dans ''Culture and Imperialism'' (1993), analysant comment la grande littérature européenne du dix-neuvième siècle (Jane Austen, Charles Dickens, Joseph Conrad) présuppose et légitime l'empire colonial même lorsqu'elle ne le thématise pas explicitement. Il propose une '''lecture contrapuntique''' qui met en relation dialectique le texte métropolitain et ses présupposés impériaux occultés, rendant audibles les voix subalternes que le texte colonial marginalise ou exclut. Les critiques adressées à Said portent notamment sur ses généralisations excessives qui homogénéiseraient « l'Orient » et « l'Occident » comme blocs monolithiques, négligeant les différences internes à chacun. Aijaz Ahmad, critique marxiste indien, reproche dans ''In Theory: Classes, Nations, Literatures'' (1992) à Said de substituer une essentialisation orientale à une autre, d'ignorer les déterminations de classe au profit d'une opposition culturaliste Est/Ouest, et de réserver implicitement le privilège de la critique aux intellectuels occidentalisés comme lui-même plutôt qu'aux masses populaires du Tiers-Monde. D'autres critiques soulignent que Said analyse principalement l'orientalisme anglo-français au Moyen-Orient, négligeant d'autres formes de colonialisme (espagnol et portugais en Amérique latine, japonais en Asie, russe en Asie centrale) et d'autres régions (Afrique subsaharienne, Asie du Sud-Est). Gayatri Chakravorty Spivak, intellectuelle féministe postcoloniale née en 1942 à Calcutta et professeure à Columbia University, apporte une contribution majeure à la théorie postcoloniale avec son essai « Can the Subaltern Speak? » publié en 1988. Le terme '''subalterne''', emprunté au marxiste italien Antonio Gramsci qui l'utilisait pour désigner les classes subordonnées, désigne chez Spivak les groupes sociaux marginalisés, exclus de toute représentation politique effective, dont la voix ne peut être entendue dans l'espace public hégémonique. Spivak pose une question radicale : les subalternes peuvent-ils parler, ou plutôt peuvent-ils être entendus lorsqu'ils parlent ? Sa réponse nuancée affirme que la structure même de la représentation politique et discursive empêche les subalternes de se faire entendre de manière autonome : lorsqu'ils accèdent à la parole publique, c'est toujours à travers des médiations (intellectuels organiques, porte-paroles, représentants) qui transforment, traduisent, souvent trahissent leur parole originelle. Spivak illustre son argument par l'analyse de l''''interdiction du sati''' (immolation rituelle des veuves) en Inde coloniale britannique au dix-neuvième siècle. Les colonisateurs britanniques justifient l'interdiction par la nécessité de sauver les femmes indiennes de la barbarie patriarcale hindoue, se posant en libérateurs des femmes contre l'obscurantisme oriental. Les nationalistes hindous au contraire défendent le sati comme tradition authentique, affirmation de l'identité culturelle indienne contre l'impérialisme occidental. Dans ce débat entre hommes colonisateurs et hommes colonisés, la voix des femmes elles-mêmes, celles qui étaient effectivement concernées par le rituel, demeure inaudible. Les femmes subalternes se trouvent prises entre deux patriarcats, colonial et indigène, aucun ne leur accordant véritablement la parole. Spivak écrit : « Entre le patriarcat et l'impérialisme, la constitution du sujet et la formation de l'objet, la figure de la femme disparaît, non pas dans un vide immaculé mais dans un déplacement violent qui est la figurine mue d'une transition entre deux modes de production. » Spivak développe également le concept d''''essentialisme stratégique''' dans une interview de 1984 avec Elizabeth Grosz. L'essentialisme stratégique désigne une tactique politique par laquelle des groupes minoritaires ou marginalisés acceptent temporairement de s'essentialiser eux-mêmes, de revendiquer une identité collective homogène malgré leurs différences internes réelles, afin de poursuivre des objectifs politiques communs. Par exemple, les femmes du Tiers-Monde peuvent s'organiser collectivement en tant que « femmes du Tiers-Monde » pour obtenir certains droits, même si cette catégorie occulte les différences massives de classe, de caste, de religion, de nationalité qui les séparent. Cette essentialisation reste stratégique : elle ne prétend pas refléter une essence réelle mais constitue un outil politique temporaire, utilisé consciemment et réflexivement. Spivak insiste sur le caractère provisoire et révisable de cet essentialisme, distinguant ainsi l'essentialisme stratégique de l'essentialisme naïf ou fondamentaliste qui réifie les identités collectives. Cependant, Spivak s'est ultérieurement distanciée du concept d'essentialisme stratégique, déplorant qu'il ait été récupéré et instrumentalisé par des mouvements nationalistes qui l'utilisent de manière non-stratégique pour justifier des essentialisations permanentes et oppressives. Dans ''Other Asias'' (2008), elle désavoue explicitement le terme, regrettant que son usage soit devenu contraire à son intention initiale. Cette autocritique témoigne de la réflexivité caractéristique de la pensée de Spivak, toujours attentive aux risques de récupération et de réification des concepts critiques. Homi K. Bhabha, théoricien postcolonial né à Bombay en 1949 et professeur à Harvard University, propose une approche différente de Said et Spivak, davantage influencée par la psychanalyse lacanienne et la déconstruction derridienne. Dans ''The Location of Culture'' (1994), il développe les concepts d''''hybridité''', de '''mimétisme''' et de '''tiers-espace''' qui renouvellent profondément la compréhension des dynamiques culturelles coloniales et postcoloniales. Le '''mimétisme colonial''' désigne selon Bhabha le désir du colonisateur de produire un colonisé « réformé, reconnaissable », « presque le même mais pas tout à fait » (''almost the same but not quite''). Le célèbre Minute de Lord Macaulay au Parlement britannique de 1835 exemplifie cette stratégie : il s'agit de former « une classe d'interprètes entre nous et les millions que nous gouvernons, une classe de personnes indiennes par le sang et la couleur mais anglaises par le goût, les opinions, la morale et l'intellect ». Cependant, Bhabha montre que ce mimétisme ne produit jamais une simple reproduction fidèle du modèle colonial mais génère toujours un '''surplus''', un '''excès''' qui déstabilise l'autorité coloniale. Le colonisé qui mime le colonisateur ne devient jamais véritablement identique à lui : il reste « presque le même mais pas tout à fait », et cette différence résiduelle, loin d'être une simple imperfection, révèle la fragilité de l'identité coloniale elle-même. Le mimétisme contient toujours virtuellement la '''moquerie''' : en répétant les gestes, les discours, les manières du colonisateur, le colonisé les dénaturalise, les révèle comme performances plutôt que comme essences, les expose à la parodie et à la subversion. Bhabha écrit : « Le mimétisme est donc le signe d'une double articulation, une stratégie complexe de réforme, de régulation et de discipline qui s'approprie l'Autre en visualisant le pouvoir. Le mimétisme est aussi le signe de l'inapproprié, une différence ou récalcitrance qui cohère les fonctions stratégiques dominantes du pouvoir colonial. » L''''hybridité''' désigne chez Bhabha le mélange, le métissage culturel qui résulte de la rencontre coloniale. Contrairement aux conceptions négatives de l'hybridité dans le discours colonial du dix-neuvième siècle qui la considérait comme dégénérescence, Bhabha valorise l'hybridité comme force subversive qui déstabilise les identités pures, les oppositions binaires, les hiérarchies fixes. Les cultures ne sont jamais homogènes et stables mais toujours déjà hybrides, traversées de différences internes, constituées par des échanges, des emprunts, des traductions. L'hybridité ne constitue donc pas un état second, une contamination de cultures originellement pures, mais la condition normale de toute culture. Cette affirmation conteste radicalement les essentialismes identitaires, aussi bien ceux des nationalistes indigènes qui cherchent à restaurer une authenticité culturelle précoloniale fantasmée que ceux des colonisateurs qui défendent la pureté de la culture occidentale contre les mélanges. Le '''tiers-espace''' (''Third Space'') désigne chez Bhabha l'espace interstitiel, liminaire, ambigu où se négocient les différences culturelles et où émergent de nouvelles significations, de nouvelles identités hybrides. Le tiers-espace n'est ni la culture du colonisateur ni celle du colonisé mais un espace radicalement nouveau, irréductible à ses origines, où les frontières culturelles deviennent poreuses et mouvantes. Dans cet espace, les certitudes identitaires vacillent, l'autorité coloniale perd sa fixité, les hiérarchies se brouillent. Bhabha cite l'exemple de missionnaires britanniques en Inde rurale qui découvrent que les Indiens convertis au christianisme lisent la Bible de manière inattendue, la mélangent avec des traditions hindoues, produisant ainsi un christianisme hybride que les missionnaires ne contrôlent plus totalement. Cette Bible déplacée, traduite, réinterprétée manifeste le tiers-espace où les significations se transforment imprévisiblement. La question de l''''appropriation culturelle''' est devenue centrale dans les débats contemporains sur l'art, particulièrement depuis les années 1980-1990. L'appropriation culturelle désigne l'usage d'éléments culturels (symboles, motifs, pratiques, styles) appartenant à une culture minoritaire ou dominée par des membres de la culture majoritaire ou dominante, souvent sans compréhension ni respect du contexte original, et généralement à des fins commerciales ou esthétiques. Les critiques de l'appropriation culturelle soulignent qu'elle perpétue des rapports de domination : les artistes occidentaux peuvent emprunter librement aux cultures non-occidentales, bénéficiant de la légitimité institutionnelle et commerciale, alors que les artistes non-occidentaux restent marginalisés. Pablo Picasso s'inspire des masques africains pour créer ''Les Demoiselles d'Avignon'' (1907), œuvre canonique du modernisme occidental, sans jamais reconnaître véritablement cette dette et sans que les sculpteurs africains dont il s'inspire accèdent à une reconnaissance équivalente. Les exemples contemporains d'appropriation culturelle suscitent régulièrement des controverses. L'exposition ''Primitivism in 20th Century Art'' organisée par le Museum of Modern Art de New York en 1984 juxtapose des œuvres modernistes occidentales et des objets d'art non-occidental, affirmant l'influence de ces derniers sur les premiers. Cependant, comme le dénonce le critique Thomas McEvilley, l'exposition traite les objets non-occidentaux comme de purs objets formels, négligeant leurs fonctions rituelles, religieuses, sociales originelles, les réduisant à des sources d'inspiration pour le génie créateur occidental. Cette muséologie perpétue ainsi la logique coloniale qui extrait des objets de leur contexte culturel pour les intégrer dans les collections métropolitaines, où ils deviennent signes de l'universalité de l'art occidental capable d'absorber toutes les traditions. Les débats sur l'appropriation culturelle soulèvent des questions complexes concernant la propriété culturelle, l'authenticité, les droits de représentation. Qui possède le droit de représenter telle culture, d'utiliser tels symboles, de raconter telles histoires ? Les réponses varient considérablement selon les perspectives. Certains défendent une position stricte : seuls les membres d'une communauté culturelle possèdent la légitimité pour représenter cette culture, toute appropriation externe constituant une forme de violence symbolique. D'autres adoptent une position plus nuancée : l'échange culturel, l'emprunt, la traduction sont inhérents à toute culture et ne posent problème que lorsqu'ils s'inscrivent dans des rapports de pouvoir asymétriques non reconnus. La question devient alors non pas d'interdire tout emprunt mais d'exiger qu'il s'effectue dans le respect, avec reconnaissance des sources, partage équitable des bénéfices symboliques et économiques, et sans réification des cultures minoritaires comme réservoirs exotiques à la disposition des artistes dominants. Les pratiques artistiques postcoloniales contemporaines explorent diverses stratégies pour contester les représentations hégémoniques héritées du colonialisme et affirmer d'autres perspectives. Le '''réalisme magique''' latino-américain développé par Gabriel García Márquez, Alejo Carpentier, Carlos Fuentes intègre des éléments merveilleux, mythiques, non-rationnels dans des récits apparemment réalistes, contestant ainsi l'hégémonie du réalisme européen et affirmant la légitimité d'autres modes de narration enracinés dans les cosmologies indigènes et africaines. Les '''littératures francophones''' d'Afrique, des Caraïbes, du Maghreb (Aimé Césaire, Léopold Sédar Senghor, Kateb Yacine, Assia Djebar, Patrick Chamoiseau) utilisent la langue du colonisateur tout en la subvertissant, la créolisant, y inscrivant des rythmes, des syntaxes, des imaginaires qui la transforment profondément. Le mouvement de la '''[[Dictionnaire de philosophie/Philosophie africaine|Négritude]]''' affirmé par Césaire et Senghor dans les années 1930-1940 revendique fièrement l'identité noire contre les stéréotypes raciaux coloniaux, retournant le stigmate en emblème, bien qu'il ait ultérieurement été critiqué pour son essentialisme par Frantz Fanon qui lui reprochait de fixer une essence noire aussi artificielle que l'essence blanche du racisme colonial. == Art et Technologies Numériques == === NFT, blockchain et marchandisation du numérique === Les '''Non-Fungible Tokens''' (NFT), ou jetons non fongibles en français, constituent le phénomène culturel et économique le plus spectaculaire et le plus controversé à avoir émergé dans le domaine de l'art numérique depuis 2020-2021. Ces actifs numériques cryptographiques, enregistrés sur une '''blockchain''' (chaîne de blocs), prétendent résoudre un problème fondamental qui a longtemps limité le marché de l'art numérique : l'impossibilité de garantir l'unicité et l'authenticité d'un fichier digital qui peut être copié à l'infini sans dégradation. En créant un certificat numérique inviolable qui atteste de la propriété d'un actif digital spécifique, les NFT semblent permettre la création d'une « rareté numérique » là où ne régnait auparavant que l'abondance reproductive infinie. Cette technologie a suscité un engouement sans précédent en 2021, générant des transactions atteignant près de 18 milliards de dollars selon NonFungible.com, avant de connaître un effondrement spectaculaire en 2022 soulevant des questions fondamentales sur la nature de l'art, de la propriété, de la valeur et des rapports entre technologie et culture. Le fonctionnement technique des NFT repose sur la technologie de la '''blockchain''', registre distribué décentralisé initialement développé pour la cryptomonnaie Bitcoin en 2008 par le mystérieux Satoshi Nakamoto. Une blockchain constitue essentiellement une base de données partagée entre de multiples ordinateurs (nœuds) qui enregistrent chronologiquement et de manière transparente toutes les transactions effectuées, chaque nouveau bloc de transactions étant cryptographiquement lié au précédent, formant ainsi une chaîne infalsifiable. Cette architecture décentralisée élimine théoriquement la nécessité d'une autorité centrale de confiance (banque, notaire, institution) pour garantir l'authenticité et la traçabilité des échanges. Les NFT s'appuient principalement sur la blockchain '''Ethereum''', deuxième cryptomonnaie mondiale après Bitcoin, qui intègre des '''smart contracts''' (contrats intelligents), programmes informatiques auto-exécutables qui automatisent certaines clauses contractuelles sans intervention humaine. Un NFT consiste techniquement en un jeton unique enregistré sur la blockchain, contenant des métadonnées qui le relient à un actif spécifique, généralement une image, une vidéo, un fichier audio ou une combinaison de ces éléments. La distinction fondamentale entre tokens '''fongibles''' et '''non fongibles''' structure toute l'économie des cryptoactifs. Un bien fongible (monnaie, action, Bitcoin) peut être échangé contre un autre bien identique sans perte de valeur : un Bitcoin vaut un autre Bitcoin, un euro vaut un autre euro, ce sont des unités interchangeables. Un bien non fongible au contraire possède des caractéristiques uniques qui le distinguent de tous les autres : une œuvre d'art, une maison, un objet de collection ne peuvent être remplacés par un équivalent strictement identique. Les NFT appliquent ce principe de non-fongibilité au domaine numérique, créant des actifs digitaux uniques et traçables. Cependant, une ambiguïté cruciale demeure : le NFT ne correspond généralement pas au fichier numérique lui-même mais à un '''certificat de propriété''' de ce fichier. Le fichier image peut continuer à circuler librement sur internet, être copié, partagé, modifié, mais seul le détenteur du NFT peut prétendre posséder l'« original » authentifié par la blockchain, distinction qui rappelle paradoxalement la logique de l'aura benjaminienne appliquée au domaine digital. L'explosion médiatique des NFT artistiques survient en mars 2021 avec la vente record de ''Everydays: The First 5000 Days'' de l'artiste numérique américain Mike Winkelmann, connu sous le pseudonyme '''Beeple''', pour 69,3 millions de dollars chez Christie's. Cette œuvre consiste en une gigantesque mosaïque numérique assemblant 5000 images créées quotidiennement par Beeple pendant plus de treize ans, du 1er mai 2007 au début 2021, témoignant d'une discipline créative obsessionnelle. Les images individuelles révèlent un univers dystopique, grotesque, souvent scatologique, peuplé de célébrités contemporaines (Donald Trump, Kim Kardashian, Jeff Bezos) et de références à la culture internet, à la science-fiction, aux technologies émergentes. Ce collage digital, vendu comme NFT à l'investisseur singapourien en cryptomonnaies Vignesh Sundaresan (pseudonyme MetaKovan), propulse Beeple au rang de troisième artiste vivant le plus cher au monde après Jeff Koons et David Hockney. Cette vente historique marque plusieurs ruptures symboliques : première fois qu'une maison d'enchères prestigieuse vend une œuvre purement digitale, première fois qu'une transaction artistique majeure s'effectue en cryptomonnaie, première fois qu'un artiste digital accède à une telle reconnaissance institutionnelle et financière. Cependant, des investigations ultérieures révèlent la dimension spéculative et potentiellement manipulatrice de cette transaction. Sundaresan et Winkelmann possédaient tous deux des participations significatives dans des tokens B20, actifs financiers liés à vingt œuvres de Beeple. La publicité générée par la vente record de ''Everydays'' a fait exploser la valeur de ces tokens B20, avant qu'ils ne s'effondrent peu après, soulevant des accusations de '''pump and dump''' (manipulation consistant à faire artificiellement monter puis vendre). Certains observateurs qualifient donc cette vente non d'événement artistique authentique mais de '''coup publicitaire''' sophistiqué visant à promouvoir des actifs spéculatifs. Cette controverse révèle d'emblée l'ambiguïté fondamentale du marché NFT, oscillant constamment entre innovation artistique légitime et spéculation financière cynique, entre démocratisation culturelle et bulle économique. Le marché des NFT connaît une croissance explosive en 2021, générant environ 10 millions de dollars de transactions quotidiennes au pic de l'engouement. Des plateformes spécialisées émergent rapidement : '''OpenSea''', '''Nifty Gateway''', '''SuperRare''', '''Foundation''', '''Rarible''' offrent aux artistes numériques des infrastructures pour « minter » (créer) et vendre leurs NFT. Des projets collectifs comme '''CryptoPunks''' (10 000 portraits pixelisés générés algorithmiquement en 2017 par Larva Labs), '''Bored Ape Yacht Club''' (10 000 images de singes anthropomorphes lancées en avril 2021 par Yuga Labs), '''Meebits''', '''Art Blocks''' deviennent des phénomènes culturels générant des centaines de millions de dollars. Des célébrités s'emparent du phénomène : le musicien électronique Grimes vend pour 6 millions de dollars de NFT, le chanteur The Weeknd intègre des NFT dans son album, l'actrice Lindsay Lohan, le rappeur Snoop Dogg, le footballeur Neymar investissent massivement dans les NFT. Des institutions culturelles traditionnelles expérimentent prudemment : le musée de l'Ermitage à Saint-Pétersbourg, le musée Uffizi à Florence, le British Museum créent des NFT d'œuvres célèbres de leurs collections. Les arguments avancés par les promoteurs des NFT pour justifier leur valeur révolutionnaire s'articulent autour de plusieurs axes. Premièrement, les NFT permettraient une '''démocratisation du marché de l'art''' en éliminant les intermédiaires traditionnels (galeries, marchands, maisons d'enchères) qui sélectionnent et légitiment les artistes selon des critères souvent opaques et élitistes. N'importe quel créateur pourrait désormais minter et vendre directement ses œuvres à un public mondial via les plateformes NFT, contournant les gatekeepers du monde de l'art traditionnel. Deuxièmement, les NFT introduisent un système de '''redevances automatiques''' programmées dans les smart contracts : lorsqu'un NFT se revend sur le marché secondaire, l'artiste original reçoit automatiquement un pourcentage (généralement 5 à 10%) du prix de vente. Cette innovation majeure garantit aux créateurs une rémunération continue reflétant l'appréciation de leur travail, contrairement au marché de l'art physique où seules les premières ventes bénéficient à l'artiste. Troisièmement, les NFT offriraient une '''traçabilité parfaite de la provenance''', chaque transaction étant inscrite publiquement et définitivement sur la blockchain, éliminant ainsi les risques de faux et facilitant l'authentification. Cependant, ces promesses rencontrent rapidement des limites substantielles révélées par les critiques. La '''démocratisation''' s'avère largement illusoire : les artistes déjà célèbres et les projets bénéficiant d'importantes campagnes marketing accaparent l'essentiel de l'attention et des ventes, tandis que les créateurs inconnus peinent à émerger dans un marché rapidement saturé. Une étude de Nature Scientific Reports analysant 6,1 millions de transactions NFT entre 2017 et 2021 montre que le marché reproduit les inégalités du monde de l'art traditionnel, avec une concentration extrême de la valeur sur quelques projets stars. Les '''redevances automatiques''' ne fonctionnent que si les plateformes les implémentent et les respectent, ce qui n'est pas garanti : certaines plateformes permettent désormais aux acheteurs de contourner ces mécanismes. La '''traçabilité blockchain''' ne garantit aucunement l'authenticité de l'œuvre originale : n'importe qui peut minter un NFT d'une image qu'il n'a pas créée, les cas de '''plagiat''' et d'appropriation illégitime se multiplient, des artistes découvrant leurs œuvres vendues comme NFT sans leur autorisation. Les '''critiques environnementales''' constituent l'objection la plus sérieuse et la plus documentée contre les NFT. La blockchain Ethereum fonctionnait jusqu'en septembre 2022 selon un mécanisme de '''Proof of Work''' (preuve de travail) extrêmement énergivore : des milliers d'ordinateurs (mineurs) résolvent en compétition des problèmes cryptographiques complexes pour valider les transactions et créer de nouveaux blocs, processus nécessitant une consommation électrique colossale. Une seule transaction NFT sur Ethereum consommait avant septembre 2022 environ 260 kilowattheures d'électricité, équivalent à la consommation d'un foyer américain moyen pendant neuf jours, générant approximativement 140 kilogrammes d'émissions de CO₂. L'empreinte carbone d'un artiste vendant plusieurs NFT pouvait ainsi dépasser celle d'une année entière de vol en avion. Ces chiffres alarmants ont suscité une levée de boucliers d'artistes, d'activistes écologistes et du public sensibilisé aux urgences climatiques. Le passage d'Ethereum au '''Proof of Stake''' (preuve d'enjeu) en septembre 2022, appelé « The Merge », réduit théoriquement la consommation énergétique de 99,95%, mais arrive après que le pic de frénésie NFT ait déjà généré des émissions massives, et ne résout pas les problèmes inhérents d'autres blockchains toujours basées sur le Proof of Work. La '''spéculation effrénée''' transforme rapidement le marché NFT en casino numérique dominé par la logique du '''greater fool theory''' : acheter un actif surévalué en espérant le revendre plus cher à un acheteur encore plus crédule. Les prix atteignent des sommets absurdes déconnectés de toute valeur artistique intrinsèque : un CryptoPunk se vend 23,7 millions de dollars, un Bored Ape 3,4 millions de dollars, le premier tweet de Jack Dorsey 2,9 millions de dollars (avant que l'acheteur échoue à le revendre pour plus de quelques milliers de dollars). Cette bulle spéculative éclate brutalement en 2022 : le volume de transactions sur OpenSea chute de 75% entre mai et septembre 2022, de nombreux NFT achetés des dizaines ou centaines de milliers de dollars ne valent plus que quelques centaines. Une étude dNFT de 2023 estime que 95% des NFT n'ont plus aucune valeur marchande. Les '''rug pulls''' (escroqueries où les créateurs d'un projet disparaissent après avoir levé des fonds) se multiplient, comme le projet Evolved Apes dont le développeur anonyme s'évapore avec 2,7 millions de dollars, laissant les investisseurs avec des tokens sans valeur. D'un point de vue philosophique et esthétique, les NFT soulèvent des questions fondamentales sur la '''nature de l'art digital''' et de la '''propriété immatérielle'''. Que signifie « posséder » une image numérique quand des millions de copies parfaites circulent librement ? Le NFT confère-t-il véritablement une propriété de l'œuvre ou seulement un certificat pointant vers l'œuvre ? La distinction s'avère cruciale : techniquement, le NFT contient généralement non pas le fichier image lui-même mais une URL pointant vers ce fichier stocké ailleurs (serveur centralisé, système de stockage décentralisé IPFS). Si le serveur disparaît, le NFT devient un lien mort ne menant nulle part. Cette fragilité révèle le paradoxe des NFT : censés garantir la pérennité et l'authenticité digitales, ils dépendent en réalité d'infrastructures techniques vulnérables à l'obsolescence, aux pannes, aux faillites d'entreprises. Les théoriciens de l'art numérique identifient une tension entre la '''reproductibilité technique''' intrinsèque au médium digital et l'artificielle '''rareté marchande''' imposée par les NFT. Walter Benjamin dans ''L'Œuvre d'art à l'époque de sa reproductibilité technique'' (1935) analysait comment la reproduction mécanique (photographie, cinéma) détruit l'« aura » de l'œuvre d'art traditionnelle, cette présence unique inscrite dans l'ici et maintenant de l'objet authentique. L'art digital pousse cette logique à l'extrême : la copie numérique est absolument identique à l'original, aucune dégradation ne les distingue. Les NFT tentent paradoxalement de réintroduire l'aura dans le domaine numérique, de recréer artificiellement la rareté et l'authenticité là où la technologie les avait abolies. Cette opération révèle-t-elle la persistance de valeurs capitalistes archaïques incompatibles avec le potentiel émancipateur du numérique, ou représente-t-elle une nécessaire adaptation économique permettant aux artistes digitaux de vivre de leur travail ? Les '''implications juridiques''' des NFT demeurent largement floues et contestées. Que signifie exactement la « propriété » d'un NFT en termes de droits d'auteur ? Généralement, acheter un NFT ne confère pas les droits de propriété intellectuelle sur l'œuvre (droits de reproduction, d'adaptation, d'exploitation commerciale), qui restent à l'artiste sauf stipulation contractuelle explicite contraire. L'acheteur acquiert essentiellement le droit de dire « je possède le NFT original de cette œuvre », mais ne peut légalement empêcher autrui de copier, partager, utiliser l'image. Cette situation crée une confusion généralisée, de nombreux acheteurs croyant à tort acquérir des droits qu'ils ne possèdent pas. Les conditions d'utilisation varient considérablement selon les projets : certains (Bored Ape Yacht Club) accordent aux propriétaires des droits commerciaux complets sur leur NFT, d'autres (CryptoPunks) les refusent, créant une hétérogénéité juridique déconcertante. Les '''plateformes NFT''' elles-mêmes soulèvent des interrogations sur leur décentralisation réelle. Malgré les discours célébrant la '''désintermédiation''' et l'autonomie permises par la blockchain, ces plateformes constituent de nouveaux intermédiaires centralisés contrôlant l'accès au marché, fixant les règles, prélevant des commissions substantielles (généralement 2,5 à 15% par transaction). OpenSea, plateforme dominante avec plus de 80% des parts de marché NFT en 2021, fonctionne comme une entreprise privée traditionnelle capable de censurer certains NFT, de suspendre des comptes, d'imposer unilatéralement des modifications. Cette centralisation contredit les idéaux libertariens et décentralisateurs souvent associés à la blockchain, révélant comment les structures capitalistes traditionnelles récupèrent et reconfigurent les technologies potentiellement subversives. Certains artistes et théoriciens explorent néanmoins les dimensions conceptuellement intéressantes des NFT au-delà de la spéculation financière. Le collectif '''Rhea Myers''' utilise les NFT pour créer des œuvres d'art conceptuel interrogeant les notions de propriété, d'authenticité, de valeur dans l'économie digitale. L'artiste '''Sarah Friend''' développe des projets NFT qui programmatiquement se détruisent si leur propriétaire ne les transfère pas régulièrement, critiquant ainsi l'accumulation spéculative et proposant une économie du don. '''Kevin Abosch''' explore l'absurdité de la valorisation arbitraire en vendant des photographies de pommes de terre comme NFT pour des millions de dollars. Ces pratiques artistiques critiques instrumentalisent la technologie NFT pour révéler et subvertir ses présupposés idéologiques, transformant le médium spéculatif en outil de réflexion conceptuelle sur les mécanismes de valeur et de fétichisation à l'ère numérique. Le phénomène NFT, malgré son effondrement spectaculaire post-2021, continue d'influencer significativement les discussions sur l'avenir de l'art numérique, de la propriété intellectuelle, des modèles économiques pour les créateurs digitaux. Les questions soulevées demeurent pertinentes : comment rémunérer équitablement les artistes numériques ? Comment garantir l'authenticité et la traçabilité dans un monde digital ? Comment concilier les potentialités émancipatrices des technologies décentralisées avec les impératifs de durabilité environnementale et d'équité sociale ? Les NFT, dans leur forme initiale énergivore et spéculative, ne constituent probablement pas la réponse, mais ils révèlent l'urgence de ces interrogations et stimulent la recherche d'alternatives plus soutenables et éthiques pour l'économie culturelle digitale. === Intelligence artificielle et création artistique === L'intelligence artificielle (IA) générative appliquée à la création visuelle constitue probablement la révolution technologique la plus disruptive et la plus controversée qu'ait connue le monde de l'art depuis l'invention de la photographie au dix-neuvième siècle. Les systèmes de génération d'images par IA, particulièrement ceux fonctionnant selon le paradigme '''texte-vers-image''' (text-to-image), permettent désormais à n'importe quel utilisateur de produire en quelques secondes des images d'une qualité technique et d'une sophistication formelle stupéfiantes, simplement en formulant une description textuelle appelée '''prompt'''. Cette démocratisation radicale de la production d'images pose des questions philosophiques, juridiques, éthiques et esthétiques d'une ampleur considérable : que signifie créer quand la création ne requiert plus ni compétence technique ni apprentissage prolongé ? Qui est l'auteur d'une œuvre générée par IA ? Les machines peuvent-elles être créatives ? L'art produit par IA possède-t-il une valeur esthétique intrinsèque ou demeure-t-il fondamentalement dérivé, parasitaire des créations humaines dont il se nourrit ? Les trois systèmes dominants qui ont popularisé la génération d'images par IA en 2022 sont '''DALL-E 2''' développé par OpenAI et lancé en avril 2022, '''Midjourney''' créé par une équipe indépendante dirigée par David Holz et lancé en juillet 2022, et '''Stable Diffusion''' développé par Stability AI en collaboration avec EleutherAI et LAION et rendu public en août 2022. Ces trois plateformes, bien que reposant sur des architectures techniques différentes, partagent le principe fondamental de transformer des descriptions langagières en représentations visuelles cohérentes. DALL-E 2, successeur de DALL-E original lancé par OpenAI en janvier 2021, s'appuie sur une architecture dérivée de GPT-3 combinée à un modèle de diffusion, produisant des images généralement photoréalistes d'une résolution élevée à partir de prompts complexes. Le système excelle particulièrement dans la '''fusion conceptuelle''', c'est-à-dire sa capacité à combiner des éléments disparates de manière logique et visuellement cohérente, comme générer « un chat portant un smoking lisant un journal ». DALL-E 2 intègre également des fonctionnalités d''''inpainting''' (modification de parties spécifiques d'une image existante) et d''''outpainting''' (extension d'une image au-delà de ses bordures originales), permettant des opérations d'édition sophistiquées. Midjourney se distingue par son orientation esthétique résolument '''artistique et stylisée''', produisant des images souvent fantastiques, surréalistes, cinématographiques, aux couleurs saturées et aux compositions dramatiques. Fonctionnant principalement via Discord plutôt que par interface web propriétaire, Midjourney a développé une communauté d'utilisateurs extrêmement active qui partage prompts, techniques, astuces, créant ainsi une culture collective autour de la plateforme. Les images Midjourney se reconnaissent souvent à leur '''esthétique signature''', caractérisée par une certaine préciosité formelle, un usage appuyé de l'éclairage dramatique, une tendance au fantastique et au merveilleux. Cette cohérence stylistique, si elle constitue une force distinctive, révèle également une certaine homogénéisation esthétique que plusieurs critiques ont identifiée comme '''le regard algorithmique''' (algorithmic gaze), une perspective visuelle spécifique aux systèmes IA qui reflète leurs biais d'entraînement et leurs contraintes architecturales. Stable Diffusion représente une approche radicalement différente en tant que modèle '''open source''' dont le code et les poids du réseau neuronal sont librement accessibles et modifiables. Cette philosophie de transparence et de partage contraste fortement avec l'approche propriétaire fermée d'OpenAI et la semi-fermeture de Midjourney. L'architecture technique de Stable Diffusion repose sur les '''modèles de diffusion latente''' (latent diffusion models), processus qui génère progressivement une image en partant d'un bruit aléatoire qu'il '''débruite''' itérativement selon les instructions du prompt, à la manière d'un sculpteur dégageant progressivement une forme d'un bloc de marbre. Cette approche s'avère particulièrement efficace et économe en ressources computationnelles comparée aux architectures concurrentes. Le caractère open source de Stable Diffusion a permis l'émergence d'un écosystème foisonnant d'extensions, de modifications, de versions spécialisées développées par la communauté, notamment les '''LoRA''' (Low-Rank Adaptation) qui permettent d'affiner le modèle pour reproduire des styles artistiques spécifiques sans réentraîner entièrement le réseau. Le fonctionnement technique de ces systèmes repose sur l'entraînement de '''réseaux de neurones profonds''' sur des corpus massifs d'images associées à leurs descriptions textuelles. DALL-E et Stable Diffusion ont notamment été entraînés sur le dataset '''LAION-5B''' (Large-scale Artificial Intelligence Open Network), gigantesque base de données constituée de cinq milliards de paires image-texte collectées en parcourant automatiquement internet. Le processus d'entraînement consiste à apprendre les corrélations statistiques entre les patterns visuels présents dans les images et les patterns linguistiques présents dans leurs descriptions. Après des millions d'itérations, le réseau développe une '''représentation latente''' compressée qui encode simultanément les concepts visuels et linguistiques, permettant de naviguer dans cet espace abstrait pour générer de nouvelles images correspondant à des descriptions inédites. Cette approche probabiliste génère des images qui maximisent la vraisemblance statistique compte tenu du prompt, sans aucune « compréhension » sémantique véritable du contenu ou du contexte. L'émergence de ces outils a immédiatement suscité des '''controverses majeures''' dans la communauté artistique mondiale. En août 2022, une image générée par Midjourney intitulée ''Théâtre D'opéra Spatial'', créée par Jason Allen avec près de 900 itérations et raffinements successifs, remporte le premier prix dans la catégorie « artistes numériques émergents » à la foire d'État du Colorado. Cette victoire déclenche une tempête de protestations d'artistes dénonçant une « tricherie », affirmant qu'accepter des œuvres générées par IA dans des compétitions artistiques traditionnelles constitue une imposture qui dévalorise le travail, l'apprentissage, la maîtrise technique accumulés pendant des années par les artistes humains. Allen lui-même se défend en soulignant le travail considérable de sélection, de raffinement, d'ajustement des prompts qu'a nécessité la production de l'image finale, revendiquant ainsi une forme d''''autorité curatoriale''' plutôt que technique. Cette controverse révèle une tension fondamentale concernant la '''définition de l'art et de la créativité'''. La conception romantique héritée du dix-neuvième siècle valorise l'expression d'une subjectivité singulière, l'originalité formelle issue du génie individuel, la maîtrise technique laborieusement acquise. L'IA générative semble court-circuiter ces valeurs : elle ne possède pas de subjectivité, ne fait qu'assembler probabilistiquement des patterns statistiques extraits d'œuvres existantes, ne requiert aucune maîtrise technique de la part de l'utilisateur. Cependant, des défenseurs de l'IA artistique répliquent que l'histoire de l'art montre une succession d'innovations techniques (perspective, photographie, cinéma, infographie) qui ont toutes été initialement décriées comme menaçant l'authenticité artistique avant d'être finalement intégrées et légitimées. Ils soulignent que l'IA constitue un '''outil''' amplifiant les capacités créatives humaines plutôt qu'un substitut à la créativité, que formuler des prompts efficaces requiert compétences linguistiques et sensibilité esthétique, que la sélection parmi les multiples outputs générés implique jugement artistique. La question de l''''autorship''' (autorité) des œuvres générées par IA soulève des problèmes juridiques et philosophiques complexes. Le droit d'auteur dans la plupart des juridictions requiert qu'une œuvre soit le produit de la '''créativité humaine''' pour être protégeable. Le United States Copyright Office a affirmé dans sa règle de 2023 sur les œuvres contenant du matériel généré par IA que le copyright ne protège « que le matériel qui est le produit de la créativité humaine ». Dans son rapport de janvier 2025, l'Office maintient cette position en précisant que la plupart des activités de '''prompt engineering''' (formulation de prompts) ne suffisent pas à conférer l'autorité, car les systèmes IA demeurent « imprévisibles » : le même prompt peut produire des résultats variés, et l'utilisateur ne détermine pas directement les éléments expressifs spécifiques de l'image générée. Cette imprévisibilité systémique distingue l'IA des outils artistiques traditionnels où l'artiste contrôle précisément chaque élément de l'œuvre. Cependant, des juridictions adoptent des approches différentes. En novembre 2023, le tribunal internet de Pékin dans l'affaire '''Li v. Liu''' a accordé la protection du copyright à une image générée par Stable Diffusion, considérant que les nombreux choix effectués par le plaignant (formulation précise du prompt incluant des négations comme « pas de mauvaises mains, pas de texte, pas d'erreur », ajustements paramétriques multiples, sélection parmi de nombreux outputs) constituaient des '''contributions créatives originales''' suffisantes. Le tribunal a reconnu un processus créatif itératif d'essais-erreurs familier à tout artiste, accordant ainsi une protection juridique malgré l'intervention algorithmique. Cette décision chinoise contraste fortement avec la position américaine plus restrictive, révélant l'absence de consensus international sur ces questions émergentes. Le Japon a adopté en 2018 un amendement du Copyright Act autorisant largement l'utilisation de matériel protégé pour l'analyse informationnelle, incluant l'entraînement commercial de modèles IA, tant que cet usage ne préjudicie pas déraisonnablement les intérêts du titulaire du copyright. Les '''controverses éthiques''' les plus virulentes concernent l'utilisation sans consentement ni compensation d'œuvres d'artistes dans les datasets d'entraînement des modèles IA. Des milliers d'artistes ont signé une déclaration publique initiée en 2024 par Ed Newton-Rex, ancien responsable de l'audio chez Stability AI qui démissionna en 2023 pour protester contre l'utilisation non autorisée d'œuvres protégées. La déclaration affirme : « L'utilisation non autorisée d'œuvres créatives pour l'entraînement d'IA générative constitue une menace majeure et injuste pour les moyens de subsistance des personnes derrière ces œuvres, et ne doit pas être permise. » Parmi les signataires figurent des artistes visuels renommés comme Amoako Boafo, Kennedy Yanko, Shantell Martin, Hans Haacke, ainsi que des écrivains, musiciens, acteurs. Les artistes dénoncent unanimement cette pratique comme du '''plagiat''' ou du '''vol''', particulièrement lorsque les systèmes IA peuvent générer des images « dans le style de » artistes spécifiques dont les œuvres ont été massivement incluses dans les datasets d'entraînement. Des études empiriques analysant les capacités d'imitation des modèles IA confirment ces préoccupations. Une recherche publiée en 2023 a audité la capacité de Stable Diffusion à imiter soixante-dix artistes numériques professionnels dont les œuvres circulent en ligne et sont protégées par copyright. Les résultats montrent que le modèle peut reproduire avec une fidélité troublante les styles distinctifs de nombreux artistes lorsque explicitement invité à le faire via des prompts incluant leurs noms. Cette capacité mimétique soulève la question de savoir si l'entraînement des modèles sur des œuvres protégées sans autorisation constitue une '''violation de copyright''' ou relève de l'usage équitable (fair use) au sens du droit américain. Plusieurs procès en cours tentent de clarifier cette zone juridique grise. En 2023, les illustratrices Sarah Andersen, Kelly McKernan et Karla Ortiz ont intenté une action collective contre Stability AI, Midjourney et DeviantArt, alléguant que ces entreprises ont violé leurs droits d'auteur en utilisant leurs œuvres dans les datasets d'entraînement. De nombreux autres artistes ont rejoint cette action qui demeure pendante. Les défenseurs de l'IA invoquent généralement la doctrine du '''fair use''' (usage équitable), arguant que l'entraînement des modèles constitue une transformation substantielle des œuvres originales à des fins d'analyse informationnelle, usage protégé par la loi. Cependant, les artistes répliquent que cette argumentation est sophistique : les entreprises IA dépensent des sommes colossales pour les talents d'ingénierie (parfois un million de dollars par ingénieur) et les ressources computationnelles (jusqu'à un milliard de dollars par modèle), mais s'attendent à obtenir gratuitement la troisième ressource cruciale, les données d'entraînement constituées par le travail créatif accumulé de millions d'artistes. Comme le formule Newton-Rex : « Quand les entreprises IA appellent cela 'données d'entraînement', elles le déshumanisent. Ce dont nous parlons, c'est du travail des gens, leur écriture, leur art, leur musique. » Certains artistes et plateformes ont développé des stratégies de '''résistance technique''' pour protéger leurs œuvres. L'outil '''Glaze''' développé par l'université de Chicago permet d'appliquer des perturbations imperceptibles à l'œil humain mais qui corrompent la capacité des modèles IA à extraire correctement le style. L'outil '''Nightshade''' va plus loin en empoisonnant activement les datasets : les images traitées par Nightshade, si incorporées dans un dataset d'entraînement, corrompent progressivement le modèle, générant des outputs incohérents ou erronés. Ces techniques de '''data poisoning''' (empoisonnement de données) constituent une forme de sabotage défensif visant à rendre techniquement inviable l'extraction non consensuelle de styles artistiques. Cependant, leur efficacité demeure limitée : elles nécessitent une adoption massive pour impacter significativement les énormes datasets utilisés, et les développeurs IA élaborent constamment des contre-mesures techniques. La question de la '''valeur esthétique''' des œuvres générées par IA divise profondément théoriciens et praticiens. Les critiques sévères dénoncent une production intrinsèquement '''dérivative, superficielle, dénuée d'intentionnalité'''. Les images IA combinent des éléments visuels selon des probabilités statistiques dérivées d'œuvres existantes, sans compréhension sémantique, sans projet expressif authentique, sans conscience de ce qu'elles représentent. Elles excellent dans la génération de '''pastiches''' techniquement accomplis mais conceptuellement creux, multipliant à l'infini des variations sur des thèmes préexistants sans jamais introduire de véritable rupture ou innovation formelle. L'analyse sémiotique révèle ce que plusieurs chercheurs nomment le '''regard algorithmique''' : une perspective visuelle spécifique caractérisée par l'hyper-composition (accumulation baroque d'éléments détaillés), une logique corporelle surréelle (anatomies légèrement incorrectes, mains malformées), et une convergence stylistique (homogénéisation esthétique résultant de l'entraînement sur des datasets similaires). Les partisans d'une approche plus nuancée soulignent que l'IA générative peut fonctionner comme outil d''''exploration conceptuelle''' et d''''expérimentation formelle''' pour des artistes qui l'intègrent consciemment dans des pratiques hybrides. Des créateurs utilisent l'IA pour générer rapidement de multiples variations d'une idée, identifier des directions esthétiques inattendues, produire des matériaux bruts ultérieurement transformés par des techniques traditionnelles. Le court-métrage expérimental de l'artiste Winkowski intitulé ''Leaving Home'' combine dessins manuels et interpolation par Stable Diffusion : l'artiste dessine certaines images-clés et laisse l'IA générer les images intermédiaires, créant ainsi un workflow hybride où la vision humaine dirige et l'IA accélère l'exécution. Cette approche collaborative reconnaît les forces et limites respectives de l'intelligence humaine et artificielle. Des '''pratiques artistiques critiques''' exploitent l'IA pour interroger précisément les questions de valeur, d'autorité, de fétichisation qu'elle soulève. Des artistes conceptuels créent des œuvres IA qui programmatiquement se détruisent ou se dégradent, contestant ainsi l'accumulation spéculative et l'économie de la rareté. D'autres utilisent intentionnellement les '''échecs''' et '''aberrations''' des systèmes IA (anatomies impossibles, perspectives incohérentes, hybridations monstrueuses) comme matériau esthétique explorant les limites de la représentation algorithmique et générant des effets relevant du '''body horror surréaliste'''. Ces appropriations critiques transforment l'outil commercial en médium de réflexion conceptuelle sur les transformations contemporaines de la visualité, de la créativité, de la production culturelle. Les '''implications socio-économiques''' de l'IA générative pour les travailleurs créatifs constituent une préoccupation majeure immédiate. Des entreprises remplacent déjà illustrateurs, graphistes, concepteurs visuels par des générateurs d'images IA, réduisant drastiquement les coûts tout en maintenant une qualité visuelle acceptable pour de nombreux usages commerciaux. Cette substitution menace particulièrement les créatifs en début de carrière et ceux occupant des positions intermédiaires, tandis que les artistes établis bénéficiant d'une reconnaissance de marque forte demeurent relativement protégés. Certains secteurs comme l'illustration éditoriale, la conception de jeux vidéo, la publicité connaissent déjà des réductions d'effectifs attribuées partiellement à l'adoption d'outils IA. Cette dynamique préfigure potentiellement une '''prolétarisation''' des travailleurs culturels, réduits à des opérateurs d'outils IA contrôlés par les grandes plateformes technologiques qui détiennent les infrastructures computationnelles et les datasets. Paradoxalement, l'IA générative pourrait simultanément démocratiser certaines formes de création visuelle en permettant à des personnes dépourvues de formation artistique technique de concrétiser leurs visions. Des auteurs, concepteurs, entrepreneurs, éducateurs peuvent désormais produire rapidement des visuels illustrant leurs idées sans dépendre d'intermédiaires spécialisés. Cette '''démocratisation''' apparente soulève néanmoins la question de savoir si multiplier la production quantitative d'images améliore véritablement l'écologie culturelle ou au contraire l'appauvrit en inondant l'environnement visuel d'une profusion de contenus médiocres générés à bas coût. L'avenir de l'IA créative s'oriente vers des modalités toujours plus sophistiquées : génération '''texte-vers-vidéo''' produisant des séquences animées à partir de descriptions, génération '''texte-vers-3D''' créant des modèles tridimensionnels, systèmes '''multimodaux''' intégrant texte, image, son, mouvement. Meta a présenté Make-A-Video, Google a dévoilé DreamFusion, des laboratoires développent des systèmes capables de générer des animations complexes, voire des films entiers à partir de scripts. Ces évolutions amplifient exponentiellement les enjeux éthiques, juridiques, esthétiques identifiés pour la génération d'images statiques, nécessitant urgemment l'élaboration de cadres réglementaires, de standards éthiques, de modèles économiques équitables protégeant les droits des créateurs humains tout en permettant l'innovation technologique. == Art et Crises Contemporaines == === Art et urgence climatique === La crise climatique constitue désormais l'horizon d'inquiétude majeur de notre époque, transformant radicalement non seulement nos modes de vie, nos systèmes économiques et nos structures politiques, mais également nos pratiques artistiques et nos conceptions esthétiques. Face à l'urgence écologique que manifestent l'accumulation de données scientifiques alarmantes, la multiplication d'événements météorologiques extrêmes, l'effondrement accéléré de la biodiversité et la fonte dramatique des glaciers, les artistes contemporains développent des pratiques qui ne se contentent plus d'illustrer passivement la catastrophe environnementale mais cherchent activement à sensibiliser le public, à provoquer une prise de conscience affective et cognitive, et parfois même à intervenir directement dans les processus écologiques. Cette rencontre entre [[Dictionnaire de philosophie/Art contemporain|art contemporain]] et urgence climatique soulève des questions théoriques et pratiques considérables concernant la fonction sociale de l'art, son efficacité politique, sa capacité à transformer les comportements individuels et collectifs, sa complicité potentielle avec les structures de pouvoir qu'il prétend contester, et les contradictions inhérentes à des pratiques artistiques écologiquement engagées mais souvent elles-mêmes consommatrices de ressources et génératrices d'empreintes carbone significatives. L'artiste islandais-danois '''Olafur Eliasson''' développe depuis les années 1990 une œuvre monumentale qui explore systématiquement les relations entre perception sensorielle, phénomènes naturels et conscience écologique. Son installation ''The Weather Project'' présentée au Turbine Hall de la Tate Modern à Londres en 2003 exemplifie son approche : un gigantesque soleil artificiel créé par des lampes monochromatiques et des miroirs au plafond immergeait les visiteurs dans une atmosphère brumeuse dorée, transformant l'espace muséal industriel en expérience quasi météorologique. Les deux millions de visiteurs qui découvrirent l'installation se couchèrent sur le sol pour contempler leur reflet dans le miroir, créant spontanément une communauté contemplative collective face à un phénomène naturel artificiellement reproduit. Cette œuvre interrogeait déjà la médiation technologique de notre rapport à la nature et notre dépendance aux systèmes énergétiques pour maintenir nos environnements contrôlés. Le projet '''Ice Watch''' développé par Eliasson en collaboration avec le géologue groenlandais Minik Rosing constitue son intervention la plus directement militante concernant le changement climatique. La première itération fut installée en décembre 2014 devant l'Hôtel de Ville de Copenhague pour coïncider avec la publication du cinquième rapport d'évaluation du Groupe d'experts intergouvernemental sur l'évolution du climat (GIEC). Douze énormes blocs de glace glaciaire, pesant chacun entre 1,5 et 5 tonnes, furent disposés en cercle comme les chiffres d'une horloge géante. Ces icebergs, récupérés dans le fjord Nuup Kangerlua au Groenland après s'être détachés de la calotte glaciaire sous l'effet du réchauffement, furent transportés par bateau puis installés en plein espace urbain où ils fondirent lentement, goutte à goutte, sous les yeux et les mains du public. Le projet fut réitéré à Paris en novembre 2015 lors de la COP21 (Conférence des Nations Unies sur les changements climatiques), avec douze blocs disposés Place du Panthéon, puis à Londres en décembre 2018 avec trente blocs répartis entre le parvis de la Tate Modern (24 blocs) et le siège de Bloomberg (6 blocs). La stratégie esthétique d'''Ice Watch'' repose sur une '''expérience sensible directe''' plutôt que sur la transmission d'informations abstraites. Eliasson affirme explicitement : « Les faits seuls ne suffisent pas à motiver les gens ; parfois, ils créent même l'effet opposé. Nous devons communiquer les faits du changement climatique aux cœurs autant qu'aux esprits, aux émotions autant qu'aux intelligences. » Cette approche reconnaît que l'accumulation de données scientifiques, de graphiques démontrant l'augmentation des températures, de projections alarmantes sur les scénarios futurs, ne parvient pas nécessairement à susciter l'engagement et la mobilisation. Au contraire, cette avalanche informationnelle peut engendrer saturation, impuissance apprise, déni défensif. L'œuvre invite les visiteurs à toucher la glace, à écouter son craquement, à sentir sa froideur pénétrante, à observer les gouttes qui s'écoulent continuellement, à voir leur propre reflet déformé dans la surface translucide. Cette interaction corporelle directe crée une '''connexion affective''' avec le Groenland lointain, transformant une abstraction statistique (« la fonte des glaces polaires ») en réalité tangible, viscérale, immédiatement présente. Cependant, ''Ice Watch'' soulève également des questions critiques et des contradictions que plusieurs commentateurs ont identifiées. D'une part, l'œuvre participe-t-elle d'une '''sensibilisation authentique''' ou d'une '''spectacularisation''' esthétisante du désastre climatique qui finalement l'édulcore en le transformant en expérience muséale consommable ? Le géographe Matthew Gandy note l'ambiguïté de ces blocs de glace devenant simultanément memento mori écologique et objet esthétique précieux, « monuments » et « mémoriaux » d'une nature en voie de disparition qui suscitent une nostalgie romantique potentiellement paralysante plutôt qu'une mobilisation politique efficace. D'autre part, l'empreinte carbone considérable du transport de dizaines de tonnes de glace depuis le Groenland jusqu'aux capitales européennes ne contredit-elle pas le message écologique de l'œuvre ? Eliasson et Rosing ont anticipé cette objection en arguant que ces icebergs étaient « déjà perdus », détachés naturellement de la calotte glaciaire et voués à fondre dans l'océan ; leur récupération et transport n'aggrave donc pas la fonte mais lui donne une visibilité politique. Néanmoins, cette justification ne dissipe pas entièrement le malaise devant le paradoxe d'utiliser des moyens énergivores pour dénoncer les conséquences de la consommation énergétique excessive. La philosophe Louise Hornby identifie une limite plus fondamentale : l'installation « canalise le temps et la fonte glaciaire à travers l'expérience propre du spectateur [...] L'impératif de regarder affirme l'agentivité centrale du sujet expérimentateur », ce qui est inapproprié car « les glaciers fondront, que nous les regardions ou non ». Cette critique pointe vers une dimension anthropocentrique persistante : l'œuvre centre l'expérience humaine, notre regard, notre émotion, notre prise de conscience, alors que la catastrophe écologique se déroule indépendamment de notre attention et requiert peut-être précisément que nous décentri ons notre perspective pour reconnaître l'agentivité propre des entités non-humaines (glaciers, océans, atmosphère, espèces vivantes) plutôt que de tout ramener à notre propre expérience subjective. Le philosophe Timothy Morton, théoricien de l'écologie des objets (Object-Oriented Ontology), défend néanmoins ''Ice Watch'' comme exemple d'œuvre permettant aux humains de comprendre leur relation aux non-humains dans la crise écologique, « étirant sérieusement ou dépassant les concepts préfabriqués, d'une manière amicale et simple, mais profonde ». L'artiste conceptuelle américaine d'origine hongroise '''Agnes Denes''' réalise en 1982 ''Wheatfield — A Confrontation'', œuvre pionnière du '''land art écologique''' qui anticipe de plusieurs décennies les préoccupations contemporaines. Durant quatre mois entre mai et août 1982, Denes plante, cultive et récolte 2,2 acres (environ 0,9 hectare) de blé doré sur un terrain vague en friche de Battery Park dans le sud de Manhattan, à deux blocs de Wall Street et du World Trade Center, face à la Statue de la Liberté. Le terrain, constitué de déchets et de gravats provenant de la construction des tours jumelles, représente un potentiel immobilier estimé à 4,5 milliards de dollars. Denes et ses assistants apportent 200 camions de terre, creusent à la main 285 sillons, débarrassent le sol des rochers et détritus, sèment manuellement les graines traditionnelles de blé du Dakota du Nord, installent un système d'irrigation, désherbent, fertilisent, traitent contre le mildiou et les maladies fongiques. La récolte en août produit près de 1000 livres (450 kilos) de blé sain et doré. Denes conçoit explicitement l'œuvre comme '''symbole multilaminé''' : « Cela représente la nourriture, l'énergie, le commerce, le commerce mondial, l'économie. Cela fait référence à la mauvaise gestion et à la faim dans le monde. C'est une intrusion dans la Citadelle, une confrontation de la Haute Civilisation. Mais encore, c'est aussi Shangri-La, un petit paradis, l'enfance, un après-midi chaud d'été à la campagne, la paix. Des valeurs oubliées, des plaisirs simples. » Cette polysémie intentionnelle distingue ''Wheatfield'' des œuvres à message univoque. L'installation fonctionne simultanément comme '''critique acerbe''' de la spéculation immobilière, du capitalisme financier, des priorités économiques absurdes qui valorisent des mètres carrés urbains à des milliards de dollars tandis que des millions d'humains souffrent de malnutrition ; comme '''rappel nostalgique''' d'une relation agraire à la terre, des cycles saisonniers, de la subsistance directe par opposition à l'abstraction financière ; comme '''provocation conceptuelle''' introduisant la temporalité organique longue de la croissance végétale dans l'espace urbain dominé par l'accélération technologique et la rotation rapide des capitaux. Le critique d'art et curateur Jeffrey Weiss qualifie ''Wheatfield'' de « perpétuellement stupéfiant [...] l'un des grands chefs-d'œuvre transgressifs du Land Art ». La transgression réside précisément dans l'incongruité radicale : cultiver une céréale vivrière archaïque au cœur du quartier financier mondial, consacrer des mois de travail manuel patient sur le terrain le plus cher au monde, produire une denrée alimentaire basique là où se négocient quotidiennement des billions de dollars d'actifs immatériels. Cette '''inversion symbolique''' révèle l'absurdité des hiérarchies de valeur contemporaines qui déconnectent complètement l'économie réelle de l'économie financiarisée, qui oublient les bases matérielles de toute existence humaine (nourriture, eau, air, écosystèmes fonctionnels) au profit de l'accumulation abstraite. Le blé récolté voyage ensuite dans vingt-huit villes mondiales dans le cadre d'une exposition organisée par le Minnesota Museum of Art intitulée « The International Art Show for the End of World Hunger » (1987-1990), les graines étant distribuées et plantées par des personnes dans de multiples régions du globe, transformant ainsi l'œuvre locale temporaire en réseau planétaire pérenne. Denes est aujourd'hui reconnue comme pionnière de l'art écologique et du land art, ayant développé dès les années 1960-1970 ce qu'elle nomme '''Eco-Logic''', concept articulant écologie et logique comme piliers de sa pratique conceptuelle. Son œuvre antérieure ''Rice/Tree/Burial'' (1968) consistait déjà à planter du riz, enchaîner des arbres, et enterrer un haïku qu'elle avait composé, actions représentant respectivement les débuts et la croissance, l'interférence humaine avec les processus naturels, et l'intellect humain. Une seule copie du poème existait, solidifiant notre relation à la terre lors de son enterrement. Elle réitéra cette performance à plus grande échelle près des chutes du Niagara en 1977, incluant un questionnaire posant des questions existentielles sur l'avenir, la qualité de vie et nos valeurs. Son projet monumental ''Tree Mountain — A Living Time Capsule'' en Finlande (achevé en 1996) consiste en 11000 arbres plantés selon un motif mathématique complexe sur une colline artificielle, créant ainsi « la première forêt vierge faite par l'homme », légalement protégée pour quatre cents ans par décret présidentiel finlandais. Le mouvement '''Extinction Rebellion''' (XR), fondé au Royaume-Uni en mai 2018 par Gail Bradbrook, Roger Hallam et d'autres activistes, représente une approche radicalement différente articulant art et militantisme climatique par la '''désobéissance civile non-violente''' de masse. XR vise explicitement à forcer les gouvernements à reconnaître l'urgence climatique et à prendre des mesures drastiques immédiates pour réduire les émissions de carbone. Leur stratégie repose sur l'occupation massive d'espaces publics symboliques, le blocage de routes et de ponts stratégiques, créant des perturbations suffisamment importantes pour attirer l'attention médiatique internationale tout en maintenant rigoureusement la non-violence. La dimension artistique occupe une place centrale dans leur tactique : performances théâtrales, costumes spectaculaires, installations visuelles frappantes, projections lumineuses monumentales transforment les actions militantes en événements esthétiques mémorables qui circulent efficacement dans les réseaux sociaux et les médias traditionnels. La '''Red Rebel Brigade''', collectif artistique affilié à Extinction Rebellion basé à Bristol, développe une esthétique performative particulièrement puissante. Vêtus de longues robes cramoisies et le visage peint en blanc, ces performeurs se déplacent en silence selon une chorégraphie au ralenti extrême dans des espaces publics lors des actions XR. Selon leur description, ils « miment au ralenti pour symboliser le sang commun que nous partageons avec toutes les espèces ». Cette présence fantomatique rouge vif crée un contraste saisissant avec l'environnement urbain gris, évoquant simultanément les figures de la mort, le sang versé des victimes de la catastrophe climatique (humaines et non-humaines), les processions rituelles solennelles. L'immobilité quasi-statuaire dans le flux rapide de la circulation urbaine fonctionne comme '''perturbation temporelle''', imposant une durée méditative incompatible avec le tempo accéléré du capitalisme contemporain. L'action d'Extinction Rebellion la plus spectaculaire et controversée se déroule en avril 2019 à Londres, où des milliers d'activistes occupent simultanément cinq sites stratégiques majeurs pendant dix jours complets : Piccadilly Circus, Oxford Circus, Marble Arch, Waterloo Bridge et Parliament Square. Ces occupations paralysent partiellement le centre de Londres, générant des réactions extrêmement polarisées : soutien enthousiaste de certains citoyens et célébrités, colère virulente d'autres face aux inconvénients causés, couverture médiatique massive internationale. Les activistes transforment ces espaces en '''zones temporaires autonomes''' écologiques et artistiques : jardins communautaires éphémères plantés sur les routes bloquées, performances musicales et théâtrales continues, ateliers de désobéissance civile, conférences scientifiques sur le climat, cantines collectives végétaliennes, nurseries pour enfants. Le bateau rose fuchsia ''Berta Caceres'' (nommé en hommage à l'activiste environnementale hondurienne assassinée) ancré symboliquement à Oxford Circus devient icône visuelle circulant mondialement. XR utilise également des '''projections lumineuses monumentales''' sur des bâtiments emblématiques pour maximiser la visibilité. En collaboration avec l'artiste britannique Jamie Hewlett (cofondateur du groupe virtuel Gorillaz), ils projettent les slogans « Time's Up, Act Now » et « Tell the Truth » sur la cheminée emblématique de la Tate Modern. Ces interventions lumineuses spectaculaires dans le paysage urbain nocturne s'inscrivent dans une longue tradition d'art activiste utilisant la technologie de projection (Jenny Holzer, Krzysztof Wodiczko) mais avec une urgence et une échelle accrues. La collaboration avec des artistes établis comme Hewlett confère une légitimité culturelle aux actions militantes tout en élargissant leur audience au-delà des cercles activistes habituels. Cependant, Extinction Rebellion suscite également des '''critiques substantielles''' provenant de directions multiples. Certains reprochent aux actions de bloquer des transports en commun écologiquement préférables aux voitures individuelles, de pénaliser économiquement des travailleurs précaires ne pouvant rejoindre leur emploi, de créer un ressentiment contre-productif au lieu de mobiliser. D'autres identifient une composition sociologique problématique des activistes XR, majoritairement blancs, éduqués, de classe moyenne, disposant du temps et des ressources pour participer à des occupations prolongées, reflétant ainsi des privilèges socio-économiques plutôt qu'une coalition véritablement inclusive. La rhétorique apocalyptique d'XR évoquant l' « extinction » imminente et appelant explicitement à se faire arrêter en masse témoignerait selon certains critiques d'un romantisme sacrificiel privilégié, les activistes blancs de classe moyenne pouvant se permettre une arrestation sans conséquences dramatiques contrairement aux minorités raciales et aux migrants pour qui toute interaction avec la police comporte des risques réels. Le philosophe Andreas Malm dans ''How to Blow Up a Pipeline'' (2021) critique le fétichisme de la non-violence absolue d'XR, arguant que le sabotage ciblé d'infrastructures fossiles pourrait être stratégiquement justifié. Des controverses spécifiques concernant les méthodes artistiques d'XR éclatent en 2022 lorsque des activistes climatiques (certains affiliés à XR, d'autres à d'autres groupements) attaquent symboliquement des œuvres d'art patrimoniales dans des musées européens. En octobre 2022, deux activistes de Just Stop Oil jettent de la soupe de tomate sur ''Les Tournesols'' de Vincent van Gogh à la National Gallery de Londres (l'œuvre est protégée par une vitre), puis se collent au mur en demandant « Qu'est-ce qui vaut le plus, l'art ou la vie ? ». D'autres actions similaires visent la ''Jeune Fille à la perle'' de Vermeer à La Haye, le ''Printemps'' de Botticelli à Florence, des Monet, des Goya. Ces actions suscitent une condamnation quasi-unanime, y compris de la part de nombreux écologistes et activistes, comme constituant un vandalisme culturel inacceptable mettant en danger un patrimoine artistique irremplaçable. Les activistes répliquent que les œuvres n'ont jamais été réellement menacées (protégées par des vitres), que la controverse générée fait circuler mondialement le message climatique, et que l'indignation démesurée pour des toiles sous verre contraste obscènement avec l'indifférence face à la destruction irréversible d'écosystèmes entiers. Le débat révèle des tensions profondes concernant les hiérarchies de valeur, la légitimité des moyens militants, l'efficacité stratégique de ces provocations. La question de l''''efficacité''' de l'art climatique demeure fondamentalement controversée. Une étude publiée dans ''PLOS ONE'' en 2021 analysant les réactions de visiteurs à trente-sept œuvres d'art sur le changement climatique présentées lors de la COP21 à Paris montre que la confrontation avec ces œuvres corrèle effectivement, au moins à court terme, avec un soutien accru aux politiques climatiques, principalement via une activation émotionnelle. Les œuvres provoquant des réponses émotionnelles fortes (angoisse, tristesse, colère mais aussi espoir) augmentent significativement le soutien aux mesures politiques. Cependant, l'étude ne mesure que des effets immédiats auto-rapportés, ne permettant pas de conclure sur la persistance de ces changements d'attitude ni sur leur traduction en comportements effectifs. Le scepticisme quant à la capacité de l'art à provoquer de véritables transformations politiques et comportementales demeure répandu : l'art ne servirait-il pas principalement à faire se sentir bien les classes cultivées déjà convaincues de l'urgence climatique, fonctionnant ainsi comme '''consolation symbolique''' plutôt que comme catalyseur effectif ? Les '''contradictions inhérentes''' au système de l'art contemporain complexifient encore la situation. Les grandes expositions et biennales internationales consacrées à l'écologie requièrent le transport aérien d'œuvres, de commissaires et de visiteurs internationaux, générant des empreintes carbone massives pour célébrer... la nécessité de réduire les émissions de carbone. Les galeries et musées climatisés consomment d'énormes quantités d'énergie pour maintenir les conditions de conservation optimales. La production d'œuvres monumentales nécessite ressources matérielles, transport, installation. L'artiste conceptuel français Philippe Parreno a tenté d'adresser cette contradiction en créant pour son exposition personnelle au Palais de Tokyo en 2013 une œuvre utilisant des bio-réacteurs d'algues photosynthétiques censés compenser les émissions de l'exposition, mais l'efficacité réelle de ce dispositif symbolique demeure limitée. Certaines institutions commencent à développer des '''stratégies de décarbonation''' : limiter les prêts internationaux, privilégier les artistes locaux, réduire la production d'œuvres neuves, mais ces efforts se heurtent au modèle économique globalisé du monde de l'art contemporain. === Dimensions éthiques et responsabilité sociale de l'art === La responsabilité sociale de l'art désigne l'obligation, tant morale que pratique, pour les artistes, les institutions culturelles et l'ensemble de l'écosystème artistique de prendre en compte les dimensions éthiques, sociales, politiques et environnementales de leurs activités. Cette responsabilité dépasse largement la simple production et diffusion d'œuvres pour englober un engagement conscient envers le bien commun, la justice sociale, la durabilité écologique et la transparence démocratique. Loin de constituer une simple tendance passagère ou un effet de mode, cette préoccupation éthique reflète une transformation profonde de la conception même de l'art et de sa fonction dans la société contemporaine, remettant en question l'idéologie moderniste de l'autonomie absolue de l'art et restaurant sa dimension fondamentalement politique et communautaire. Le contexte historique de cette évolution remonte aux mouvements sociaux des années 1960-1970 qui contestaient déjà les institutions culturelles comme lieux d'exclusion sociale et de reproduction des hiérarchies de classe, de race et de genre. L'''Art Workers' Coalition''' formée à New York en 1969, le '''Guerrilla Girls''' créé en 1985 dénonçant la sous-représentation des femmes et des minorités dans les musées, les interventions institutionnelles critiques de Hans Haacke révélant les liens entre mécénat privé et intérêts économiques, tous ces précédents ont établi une tradition de critique institutionnelle qui irrigue encore la réflexion contemporaine. Cependant, l'urgence s'est considérablement intensifiée depuis les années 2010 sous l'effet conjugué de la crise climatique, des mouvements sociaux pour la justice raciale (Black Lives Matter), pour l'égalité de genre (MeToo), et de la prise de conscience croissante des inégalités structurelles exacerbées par la mondialisation néolibérale. Les '''institutions muséales et culturelles''' se trouvent au cœur de ces débats sur la responsabilité sociale. Le musée traditionnel, conçu comme temple de l'art universel, sanctuaire des chefs-d'œuvre éternels, autorité détentrice du savoir légitime sur l'art, se voit radicalement contesté. Le '''modèle du post-musée''' ou du '''musée de mutualité''' propose une transformation profonde des relations entre institution et publics, passant de la hiérarchie verticale à l'horizontalité participative, de l'autorité unilatérale au dialogue pluriel. Le collectif ICOM (International Council of Museums) a redéfini en 2019, après d'intenses débats et controverses, la définition même du musée comme « institution permanente au service de la société et de son développement, ouverte au public [...] qui mène des recherches, conserve, communique et expose le patrimoine tangible et intangible de l'humanité et de son environnement à des fins d'éducation, d'étude et de délectation ». Cette nouvelle définition insiste explicitement sur les notions de '''démocratisation''', de '''polyphonie''' et de '''droits humains''', marquant un tournant idéologique majeur. La '''justice sociale et l'inclusion''' constituent la première dimension critique de cette responsabilité. Les musées et institutions culturelles doivent activement œuvrer pour corriger les exclusions historiques qui ont systématiquement marginalisé certains groupes. Cela implique concrètement de réviser les '''politiques de programmation''' pour garantir la visibilité des artistes femmes, des créateurs racisés, des personnes LGBTQIA+, des artistes en situation de handicap, des populations autochtones, dont les œuvres ont été historiquement sous-représentées ou totalement absentes des collections permanentes et des expositions temporaires. Le '''Museum of Modern Art''' (MoMA) de New York a entrepris en 2019 un réaccrochage complet de sa collection permanente pour intégrer davantage d'artistes femmes, non-occidentaux et issus de minorités, reconnaissant implicitement que son canon historique reflétait principalement la production d'hommes blancs occidentaux. Cependant, ces réformes soulèvent également des critiques : s'agit-il d'une transformation structurelle authentique ou d'une simple '''tokenisation''' superficielle ajoutant quelques noms diversifiés sans remettre en question les critères d'évaluation esthétique eux-mêmes potentiellement biaisés ? L'inclusion ne concerne pas seulement la représentation des artistes mais également celle des '''publics'''. Les musées doivent éliminer les barrières physiques, économiques, culturelles et symboliques qui empêchent l'accès de nombreux citoyens. Cela passe par des '''politiques tarifaires inclusives''' : gratuité pour certains publics (jeunes, chômeurs, bénéficiaires d'aides sociales), prix libres ou à prix réduits certains jours, abolition complète de l'entrée payante comme au '''Musée d'Art Moderne de la Ville de Paris''' ou dans de nombreux musées britanniques. L'accessibilité physique pour les personnes à mobilité réduite, la disponibilité de supports adaptés pour les personnes malvoyantes ou malentendantes (audio-descriptions, boucles magnétiques, visites en langue des signes), la '''médiation culturelle''' dans les quartiers populaires et ruraux éloignés des grandes métropoles culturelles, tous ces dispositifs concrétisent l'engagement pour une démocratisation effective plutôt que proclamée. La '''transparence des financements et l'éthique des mécènes''' constituent une deuxième dimension cruciale, particulièrement conflictuelle. Les institutions culturelles dépendent financièrement de sources multiples : subventions publiques, billetterie, mécénat d'entreprises, fondations privées, dons individuels. Cette dépendance économique soulève des questions éthiques aiguës lorsque les mécènes sont impliqués dans des secteurs controversés. Le scandale du '''Sackler Family''' exemplifie ces enjeux : cette famille de philanthropes avait donné des dizaines de millions de dollars à des musées prestigieux (Metropolitan Museum of Art, Louvre, Victoria & Albert Museum, Guggenheim) dont plusieurs ailes et galeries portaient leur nom. Cependant, l'enquête révélant leur responsabilité dans la crise des opioïdes aux États-Unis (leur entreprise Purdue Pharma ayant commercialisé agressivement l'OxyContin causant des centaines de milliers de morts) a déclenché une campagne militante menée notamment par le photographe Nan Goldin et son collectif '''P.A.I.N.''' (Prescription Addiction Intervention Now). Sous cette pression, de nombreux musées ont annoncé qu'ils ne recevraient plus de dons Sackler et ont retiré leur nom des espaces qu'il désignait, reconnaissant ainsi qu'accepter de l'argent provenant de sources moralement problématiques compromet l'intégrité de l'institution. Des controverses similaires ont visé les liens entre musées et '''industries fossiles'''. En 2019, des activistes ciblèrent le British Museum, la National Gallery et d'autres institutions britanniques pour leurs partenariats avec BP (British Petroleum), les accusant de '''artwashing''' : l'utilisation du prestige culturel pour blanchir la réputation d'entreprises contribuant massivement au changement climatique. Sous la pression continue, BP a finalement mis fin en 2022 à son partenariat de trente ans avec ces institutions. Des problématiques analogues concernent le mécénat d'entreprises de surveillance technologique (Palantir, NSO Group), d'industries d'armement, de régimes autoritaires utilisant la culture comme façade de respectabilité internationale. Ces débats révèlent une tension structurelle : comment concilier l'indépendance artistique et intellectuelle nécessaire à la mission culturelle avec la dépendance financière envers des sources de financement potentiellement compromettantes ? La solution passe probablement par une '''diversification maximale des sources de financement''', une '''transparence totale''' sur l'origine des fonds et les contreparties accordées, et la mise en place de '''comités d'éthique indépendants''' évaluant la compatibilité des partenariats avec les valeurs de l'institution. La '''durabilité environnementale''' constitue la troisième dimension majeure, particulièrement urgente face à la crise climatique. Le secteur culturel génère une '''empreinte carbone considérable''' estimée à environ 70 millions de tonnes d'équivalent CO2 annuellement selon le rapport ''Art of Zero'' de l'organisation Julie's Bicycle. Cette empreinte provient de multiples sources : '''consommation énergétique des bâtiments''' (climatisation, éclairage, systèmes de conservation climatiques rigoureux pour préserver les œuvres), '''transport des œuvres''' pour les expositions itinérantes et les prêts internationaux (emballages spécialisés, transport par avion cargo, convois routiers réfrigérés), '''déplacements des artistes, du personnel et des visiteurs''' (les voyages internationaux représentant environ 52 millions de tonnes soit 74% de l'empreinte totale), '''production d'œuvres et de scénographies''' éphémères générant d'importants déchets. Plusieurs stratégies de '''décarbonation''' émergent progressivement. La '''Gallery Climate Coalition''' (GCC), fondée en 2020, rassemble plus de deux mille membres du monde de l'art s'engageant à réduire de moitié leurs émissions d'ici 2030. Leurs recommandations incluent : privilégier les '''matériaux durables, recyclables et recyclés''' pour les installations et scénographies, concevoir des '''expositions modulaires réutilisables''' plutôt que des décors construits puis détruits après chaque événement, '''réduire drastiquement les transports''' en privilégiant les prêts régionaux plutôt qu'intercontinentaux, allonger la durée des expositions pour amortiser leur coût carbone, développer des '''alternatives numériques''' (visites virtuelles, catalogues en ligne) réduisant les déplacements physiques, '''investir dans l'efficacité énergétique des bâtiments''' (isolation, éclairages LED, panneaux solaires, systèmes de gestion intelligente du climat). Le '''Jeongok Prehistory Museum''' en Corée du Sud exemplifie l'architecture muséale durable : construit dans une colline qui fournit isolation naturelle, utilisant régulation thermique passive, éclairage basse consommation et énergies renouvelables, il démontre qu'excellence architecturale et soutenabilité sont compatibles. Cependant, des '''contradictions structurelles''' persistent. Comment un musée peut-il sincèrement promouvoir la conscience écologique tout en organisant des expositions blockbuster nécessitant le transport aérien d'œuvres fragiles depuis plusieurs continents ? Comment une biennale internationale peut-elle prétendre à la neutralité carbone quand elle invite des centaines d'artistes, commissaires et critiques à voyager mondialement ? Certaines voix radicales comme l'artiste-activiste Gustav Metzger appellent à un '''moratoire total''' sur les nouvelles productions artistiques et les expositions internationales, proposition généralement jugée irréaliste mais qui pointe vers l'ampleur du problème. Une voie médiane consisterait à '''compenser obligatoirement''' les émissions incompressibles tout en réduisant drastiquement les émissions évitables, à '''internaliser le coût carbone''' dans les budgets plutôt que de l'externaliser sur la collectivité et les générations futures, et à '''privilégier systématiquement''' les alternatives moins carbonées lorsqu'elles existent. La '''déontologie numérique et les droits culturels''' constituent une quatrième dimension émergente liée à la numérisation croissante des pratiques artistiques. L'usage d'intelligence artificielle dans la création soulève des questions de '''respect des droits d'auteur''' lorsque les modèles sont entraînés sur des corpus d'œuvres protégées sans autorisation ni rémunération des créateurs originaux. La '''protection des données personnelles''' des visiteurs et participants à des œuvres interactives numériques, souvent collectées sans consentement éclairé véritable, pose problème. La '''lutte contre la désinformation''' concerne les musées lorsque des manipulations numériques (deepfakes, reconstitutions algorithmiques) brouillent la frontière entre document historique authentique et fabrication. Les institutions doivent adopter des '''chartes de déontologie numérique''' garantissant transparence sur les usages de l'IA, respect des licences libres (Creative Commons), protection des données, combat contre la désinformation patrimoniale. L''''engagement civique et la mobilisation citoyenne''' forment une cinquième dimension qui transforme les institutions culturelles en '''agents de changement social'''. Le modèle traditionnel du musée neutre, apolitique, sanctuaire retiré des controverses contemporaines, cède progressivement la place à une conception activiste assumant explicitement des positions politiques sur les enjeux sociaux majeurs. Le Queens Museum à New York, récipiendaire de l'''Outstanding Museum Practice Award''' d'ICOM en 2021, a radicalement redéfini sa mission autour de l'hospitalité, de la co-création avec les communautés locales et du '''care''' (sollicitude), reconnaissant sa responsabilité non seulement de préserver la culture mais de servir comme espace de soutien communautaire, particulièrement crucial pendant la pandémie de COVID-19. Le '''MAIIAM Museum of Contemporary Art''' à Chiang Mai, Thaïlande (récompensé en 2022), connecte activement écosystèmes culturels locaux et globaux en soutenant des artistes thaïlandais sous-représentés tout en développant des partenariats internationaux, illustrant comment un musée peut être simultanément profondément enraciné localement et ouvert mondialement. Ces transformations impliquent des '''projets participatifs''' où les institutions collaborent étroitement avec les communautés pour co-créer expositions, programmes éducatifs, événements. Le '''théâtre forum''' d'Augusto Boal, les '''budgets participatifs culturels''' où les citoyens décident de l'allocation de ressources publiques, les '''résidences d'artistes en milieu social''' (prisons, hôpitaux, quartiers défavorisés) concrétisent cet engagement. Cependant, des critiques soulignent les risques d'instrumentalisation : les artistes devenant travailleurs sociaux prestataires de services à moindre coût pour compenser les défaillances des politiques publiques, le '''care work''' étant systématiquement dévalorisé et sous-rémunéré, les injonctions à l'impact social mesurable imposant une logique néolibérale de quantification incompatible avec la valeur intrinsèque de l'art. Comme l'analyse la chercheuse Claire Bishop dans ''Artificial Hells: Participatory Art and the Politics of Spectatorship'', la '''participation''' peut être soit authentiquement émancipatrice soit manipulatoirement coercitive selon ses modalités concrètes. L''''évaluation et la redevabilité''' constituent la sixième dimension assurant que l'engagement éthique ne reste pas simple déclaration rhétorique mais se traduit en actions mesurables. Les institutions culturelles développent progressivement des '''indicateurs d'impact social et environnemental''' adaptés à leur secteur : pourcentage d'artistes issus de minorités dans la programmation, représentativité sociodémographique des publics comparée à la population locale, tonnes d'émissions CO2 par visiteur, pourcentage du budget consacré à la médiation communautaire, taux de rétention du personnel reflétant la qualité des conditions de travail. Ces '''rapports de responsabilité sociale et sociétale''' (RSS) publiés annuellement permettent aux parties prenantes (tutelles publiques, donateurs, publics, société civile) d'évaluer la sincérité de l'engagement institutionnel. Des '''certifications tierces parties''' comme B Corp (appliquée à certaines galeries commerciales), Green Art Lab Alliance, Culture Declares (mouvement de déclaration d'urgence climatique), fournissent validation externe et crédibilité. Le '''Code d'éthique de l'ICOM''', révisé régulièrement, établit standards professionnels que les institutions membres s'engagent à respecter, couvrant acquisition et déaccession d'œuvres, conflits d'intérêts, relations avec les communautés sources, transparence financière. Le '''Museums Association''' britannique publie également un code détaillé soulignant que la réflexion éthique doit être partie intégrante quotidienne de la pratique muséale plutôt qu'exercice exceptionnel. La '''gouvernance participative''' représente l'horizon de ces transformations : conseils d'administration incluant représentants des communautés locales et des publics usagers plutôt que seulement élites économiques et politiques, '''comités consultatifs''' d'artistes, de travailleurs culturels, de minorités advisant les directions, '''assemblées générales ouvertes''' où les décisions stratégiques majeures sont débattues publiquement. Ces innovations institutionnelles rencontrent résistances et obstacles : concentration du pouvoir dans les structures traditionnelles, craintes de paralysie décisionnelle, difficultés logistiques d'organiser participation effective. Néanmoins, elles incarnent l'aspiration à des institutions culturelles véritablement démocratiques, redevables envers la société qui les finance et les légitime plutôt qu'envers les seules élites traditionnelles. Ces six dimensions interconnectées dessinent une transformation systémique du monde de l'art contemporain, passant d'une conception élitiste, autonomiste et déresponsabilisée à une conception démocratique, engagée et comptable de ses impacts sociaux et écologiques. Cette évolution ne va pas sans tensions, contradictions et résistances. Elle redéfinit néanmoins profondément ce que signifie être artiste, institution culturelle ou public dans le vingt-et-unième siècle. == Tendances et Prospectives == === Mutations du marché et de l'institution === Le marché de l'art contemporain et les institutions culturelles qui l'encadrent ont subi depuis les années 1990 des transformations structurelles d'une ampleur sans précédent, bouleversant profondément les modes de production, de circulation, d'évaluation et de légitimation des œuvres. Ces mutations résultent de la convergence de plusieurs dynamiques interdépendantes : la '''globalisation économique''' qui intègre progressivement toutes les régions du monde dans des circuits transnationaux d'échanges artistiques, la '''financiarisation''' qui transforme l'art en classe d'actifs spéculatifs pour investisseurs fortunés, la '''révolution numérique''' qui dématérialise partiellement les transactions et bouleverse les modes d'accès aux œuvres, et les '''pressions sociales''' exigeant que les institutions deviennent plus inclusives, transparentes et socialement responsables. Ces transformations ne constituent pas simplement des ajustements techniques mais redéfinissent fondamentalement ce que signifie créer, exposer, collectionner et expérimenter l'art au vingt-et-unième siècle. La '''globalisation du marché de l'art''' s'est considérablement accélérée depuis la fin des années 1990, transformant un système autrefois concentré sur quelques capitales occidentales (New York, Londres, Paris) en réseau mondial interconnecté incluant désormais Hong Kong, Singapour, Shanghai, São Paulo, Dubaï, Mumbai comme pôles majeurs. Le marché mondial de l'art, qui représentait environ 14 milliards de dollars en 1996, a quadruplé pour atteindre 56,6 milliards en 2016 selon les estimations d'Arts Economics, avant de connaître des fluctuations liées aux crises économiques et à la pandémie de COVID-19, puis de se reprendre avec un volume estimé à 67 milliards de dollars en 2022. Cette expansion quantitative masque des transformations qualitatives profondes dans la géographie et la sociologie du marché. L'émergence spectaculaire du '''marché chinois''', devenu deuxième marché mondial après les États-Unis et dépassant même brièvement celui-ci en 2011, illustre ce basculement géopolitique. L'essor de collectionneurs fortunés en Inde, au Brésil, en Russie, au Moyen-Orient reflète l'enrichissement accéléré de nouvelles élites capitalistes dans les économies émergentes, qui investissent massivement dans l'art contemporain simultanément comme marqueur de distinction sociale, placement financier et affirmation de puissance culturelle nationale. Cette globalisation se matérialise institutionnellement par la prolifération des '''méga-galeries''' opérant simultanément dans de multiples villes mondiales. La '''Gagosian Gallery''', archétype de ce modèle, exploite actuellement dix-neuf espaces répartis entre New York, Los Angeles, San Francisco, Londres, Paris, Rome, Athènes, Genève, Bâle et Hong Kong, reproduisant ainsi la logique des chaînes de commerce de luxe mondiales. Les galeries '''Hauser & Wirth''', '''David Zwirner''', '''Pace Gallery''', '''White Cube''' déploient des stratégies similaires d'expansion multi-sites. Ces galeries hyper-capitalisées dominent le segment supérieur du marché, représentant les artistes les plus cotés, participant aux foires les plus prestigieuses, influençant considérablement les musées par leurs prêts et donations stratégiques. Leur puissance économique leur permet d'investir massivement dans des espaces spectaculaires, des catalogues somptueux, des programmes muséaux parallèles, créant ainsi des écosystèmes quasi-autonomes concurrençant les institutions publiques. Cependant, cette concentration suscite des inquiétudes légitimes : ces galeries ne fonctionnent-elles pas comme '''oligopoles''' restreignant la diversité artistique au profit d'un nombre limité d'artistes-stars ? Ne créent-elles pas des '''barrières à l'entrée''' insurmontables pour les jeunes galeries et les artistes émergents ne disposant pas de réseaux et de capitaux équivalents ? Les '''foires d'art internationales''' constituent le deuxième vecteur majeur de cette globalisation. '''Art Basel''', fondée en 1970 à Bâle, a développé des éditions à Miami Beach (2002) et Hong Kong (2013), créant ainsi un circuit annuel où collectionneurs, galeristes, artistes, commissaires et critiques circulent mondialement selon un calendrier ritualisé. '''Frieze''' (Londres, New York, Los Angeles, Séoul), '''FIAC''' Paris (remplacée par Paris+ par Art Basel en 2022), '''ARCOMadrid''', '''Art Dubai''', '''India Art Fair''', '''SP-Arte''' São Paulo structurent désormais un réseau planétaire. Ces foires attirent des dizaines de milliers de visiteurs, génèrent des centaines de millions de dollars de transactions en quelques jours, servent simultanément de marketplace commercial et d'événements médiatiques spectaculaires. Leur format standardisé (stands de galeries dans des halls d'exposition géants, sections thématiques, programmes VIP, vernissages exclusifs) reproduit mondialement une expérience homogénéisée de l'art contemporain. Les analystes critiques dénoncent cette '''foire-isation''' du marché qui transforme l'art en marchandise luxueuse consommée rapidement dans des environnements commerciaux saturés, où l'évaluation esthétique cède la place au calcul spéculatif, où la contemplation attentive s'efface devant le parcours accéléré des stands. Parallèlement aux foires commerciales, les '''biennales d'art contemporain''' se sont multipliées exponentiellement depuis les années 1990, structurant un circuit alternatif théoriquement moins marchand et plus orienté vers l'expérimentation artistique et la réflexion critique. Si la '''Biennale de Venise''' (fondée en 1895) et la '''documenta de Kassel''' (créée en 1955) demeurent les institutions les plus prestigieuses, des dizaines de nouvelles biennales ont émergé : Istanbul (1987), Lyon (1991), Sydney (1973 mais relancée dans les années 1990), Shanghai (1996), Berlin (1998), Liverpool (1999), Gwangju (Corée du Sud, 1995), São Paulo (relance à partir des années 1990), Sharjah (1993), Manifesta (itinérante depuis 1996). Ces biennales remplissent plusieurs fonctions simultanées : elles affirment symboliquement la présence de leur ville ou région sur la carte culturelle mondiale, attirent tourisme et investissements, offrent plateformes d'expérimentation pour artistes et commissaires, génèrent débats critiques sur les enjeux sociopolitiques contemporains. Cependant, elles soulèvent également des contradictions : leur prolifération participe-t-elle véritablement à la décentration du monde de l'art ou reproduit-elle simplement le modèle occidental dans de nouvelles localisations ? Leur prétendue indépendance vis-à-vis du marché résiste-t-elle à l'examen lorsqu'on observe leurs financements (partenariats corporate, mécénats de grandes fortunes, sponsors de marques de luxe) et leurs effets de consécration sur les carrières artistiques et les valorisations marchandes ? La '''financiarisation de l'art''' constitue la troisième transformation majeure, particulièrement marquée depuis les années 2000. L'art contemporain est désormais explicitement présenté comme '''classe d'actifs''' alternative dans les stratégies de diversification patrimoniale des ultra-riches (UHNWI, ultra-high-net-worth individuals). Les banques privées (UBS, Credit Suisse, Deutsche Bank) développent des départements spécialisés conseillant leurs clients fortunés sur les investissements artistiques, publiant rapports et indices de performance. Des fonds d'investissement spécialisés dans l'art émergent, permettant à des investisseurs de détenir indirectement des parts d'œuvres sans engagement passionnel personnel. Les '''ports francs''' (freeports) prolifèrent, gigantesques entrepôts sécurisés en zones franches où des milliards de dollars d'œuvres sont stockés indéfiniment, échappant aux taxes d'importation/exportation, à la TVA, parfois même à toute traçabilité fiscale. Le '''Geneva Freeport''', le '''Luxembourg Freeport''', le '''Singapore Freeport''', le '''Shanghai Freeport''' hébergent des collections entières jamais exposées publiquement, achetées uniquement comme réserves de valeur, véritables "mythiques îles de valeur" selon l'expression du chercheur Noah Horowitz. Ces zones d'ombre révèlent comment l'art fonctionne désormais dans les circuits du '''capitalisme offshore''', permettant blanchiment d'argent, évasion fiscale, dissimulation de patrimoine. Cette financiarisation génère des distorsions considérables dans les évaluations. Les prix atteints par certaines œuvres contemporaines lors de ventes aux enchères dépassent toute rationalité esthétique ou historique : 450 millions de dollars pour le ''Salvator Mundi'' attribué à Léonard de Vinci (2017), 195 millions pour ''Shot Sage Blue Marilyn'' de Warhol (2022), 110 millions pour le ''Untitled'' de Basquiat (2017). Ces sommes astronomiques, largement médiatisées, créent une perception publique de l'art contemporain comme jeu spéculatif réservé aux milliardaires plutôt que comme pratique culturelle accessible. Elles provoquent également des '''bulles spéculatives''' : certains artistes voient leurs côtes exploser puis s'effondrer brutalement selon les modes du marché, indépendamment de la qualité intrinsèque de leur travail. Le sociologue Olav Velthuis qualifie ce phénomène d'"économie de casino" où la valeur artistique devient otage de la spéculation financière. La '''transformation numérique''' bouleverse simultanément les pratiques institutionnelles et commerciales. Les musées développent massivement leurs '''collections en ligne''', numérisant œuvres et archives pour les rendre accessibles mondialement via internet. L'initiative '''Google Arts & Culture''' en partenariat avec plus de deux mille institutions permet désormais de visiter virtuellement musées et expositions, d'examiner en ultra-haute résolution des chefs-d'œuvre, d'accéder à des ressources pédagogiques. Cette démocratisation digitale de l'accès comporte des dimensions émancipatrices indéniables : populations éloignées géographiquement, personnes à mobilité réduite, publics scolaires disposent désormais de ressources autrefois strictement limitées aux visiteurs physiques des grandes métropoles culturelles. Cependant, l'expérience virtuelle peut-elle véritablement remplacer la confrontation corporelle directe avec l'œuvre matérielle, sa présence physique, sa texture, son échelle réelle ? Les théoriciens de l'aura benjaminienne doutent que la reproduction numérique, si sophistiquée soit-elle, capture cette dimension essentielle de l'expérience artistique. Les technologies immersives ('''réalité virtuelle''' et '''réalité augmentée''') ouvrent de nouvelles possibilités muséographiques : reconstitutions 3D de sites archéologiques détruits, animations d'œuvres historiques révélant leurs processus de création, expériences interactives permettant aux visiteurs de manipuler virtuellement des objets fragiles. Le '''musée du futur''' intègre ces technologies pour créer des expériences hybrides combinant artefacts physiques et enrichissements numériques. Cependant, ces investissements technologiques coûteux sont-ils prioritaires lorsque de nombreuses institutions peinent à financer leurs missions fondamentales (conservation, recherche, médiation) ? Ne risquent-ils pas de transformer les musées en parcs d'attractions technologiques où le '''spectacle''' prime sur la '''contemplation''' et la '''réflexion''' ? Les '''plateformes numériques commerciales''' (Artsy, Artnet, Paddle8) transforment également le marché primaire et secondaire en permettant transactions en ligne, visualisations 3D d'œuvres, algorithmes de recommandation personnalisée. La pandémie de COVID-19 a brutalement accéléré cette numérisation lorsque galeries, foires et maisons d'enchères durent fermer physiquement, migrant massivement vers des '''viewing rooms''' virtuels et des ventes online. Cette dématérialisation partielle réduit certaines barrières géographiques et financières (déplacements internationaux, location de stands de foires onéreux) mais introduit également de nouvelles inégalités numériques entre acteurs maîtrisant ces outils et autres restant marginalisés. Les '''transformations institutionnelles''' des musées répondent simultanément aux pressions financières, aux exigences sociales d'inclusion et aux opportunités technologiques. Le modèle traditionnel du musée, financé principalement par subventions publiques et billetterie, s'érode progressivement sous l'effet des politiques d'austérité réduisant budgets culturels. Les institutions développent donc des '''stratégies de diversification des revenus''' : exploitation commerciale des espaces (locations pour événements privés, boutiques, restaurants), développement de programmes de mécénat sophistiqués, création de '''franchises''' et d'extensions internationales générant royalties (Louvre Abu Dhabi, Guggenheim Bilbao, Pompidou Shanghai, Hermitage Amsterdam), billetterie dynamique avec tarification variable selon demande. Ces stratégies, si elles assurent viabilité financière, ne transforment-elles pas les musées en '''entreprises culturelles''' soumises à logiques de rentabilité incompatibles avec leurs missions de service public ? Les '''réformes de gouvernance''' visent simultanément à démocratiser des institutions historiquement contrôlées par élites conservatrices. L'inclusion de '''représentants communautaires''', d'''artistes''', de '''travailleurs culturels''', de '''représentants de minorités''' dans les conseils d'administration et comités consultatifs cherche à diversifier les perspectives décisionnelles. La '''transparence''' sur financements, acquisitions, déaccessions devient exigence croissante. Les '''audits de diversité''' mesurent représentativité des collections, programmations, personnels selon genre, race, origine géographique, révélant généralement sous-représentations massives des femmes, des artistes non-occidentaux, des minorités. Ces constats nourrissent des politiques volontaristes de correction (quotas de programmation, acquisitions ciblées, bourses spécifiques), suscitant débats passionnés entre partisans d'une '''discrimination positive''' temporaire et opposants dénonçant abandon du '''mérite''' comme critère unique. Ces mutations multiples dessinent un paysage artistique profondément reconfiguré, simultanément plus globalisé et plus fragmenté, plus accessible et plus inégalitaire, plus transparent et plus opaque, offrant opportunités inédites tout en générant contradictions insurmontées. === Perspectives théoriques émergentes === Le paysage théorique de la philosophie de l'art connaît actuellement une phase de renouvellement profond, caractérisée par l'émergence de nouveaux cadres conceptuels qui remettent en question les paradigmes hérités de la tradition esthétique occidentale moderne. Ces perspectives émergentes ne constituent pas simplement des ajustements marginaux aux théories existantes mais représentent des ruptures épistémologiques fondamentales qui redéfinissent les questions centrales de l'esthétique : qu'est-ce que l'art ? Qui peut légitimement créer et interpréter ? Quelles relations l'art entretient-il avec la nature, la société, la technologie, la politique ? Ces interrogations sont alimentées par les transformations historiques contemporaines, notamment la décolonisation des savoirs, la crise écologique, la révolution numérique et les luttes pour la justice sociale, qui toutes exigent que la pensée esthétique dépasse ses cadres traditionnels pour intégrer des dimensions jusqu'alors marginalisées ou occultées. Les '''esthétiques décoloniales''' constituent une première perspective majeure qui conteste radicalement l'universalisme abstrait de la tradition esthétique européenne. S'inscrivant dans la lignée des théoriciens postcoloniaux tels qu'Edward Said, Gayatri Spivak et Homi Bhabha, mais les radicalisant pour développer une critique spécifiquement dirigée contre l'hégémonie épistémologique occidentale dans le domaine artistique, ces approches dénoncent la '''colonialité du pouvoir esthétique'''. Le concept de colonialité, développé notamment par Aníbal Quijano et repris par Walter Mignolo, désigne les structures de domination qui persistent longtemps après la fin formelle du colonialisme politique, s'inscrivant dans les catégories conceptuelles, les critères d'évaluation, les canons artistiques qui continuent à marginaliser ou à invisibiliser les productions culturelles non-occidentales. L'esthétique moderne, loin d'être une discipline neutre et universelle, s'est historiquement constituée en légitimant implicitement les productions européennes comme seules véritablement artistiques, reléguant les créations des peuples colonisés aux catégories inférieures d'artisanat, de folklore, d'art primitif ou d'ethnographie. Le philosophe argentin Walter Mignolo propose une '''décolonisation épistémique''' qui ne consiste pas simplement à inclure davantage d'artistes non-occidentaux dans les institutions existantes mais à transformer radicalement les cadres conceptuels eux-mêmes. Il développe le concept d''''aesthesis décoloniale''' qui réhabilite des modes de perception, de création et d'évaluation esthétiques enracinés dans des traditions épistémologiques non-occidentales, refusant de soumettre ces pratiques aux critères de jugement dérivés de la philosophie kantienne et hégélienne. Cette position soulève néanmoins des questions complexes : comment éviter le relativisme culturel total qui rendrait impossible tout dialogue interculturel et toute évaluation comparative ? Comment distinguer la reconnaissance légitime de la diversité esthétique d'un essentialisme culturaliste qui enfermerait chaque tradition dans une authenticité fantasmée, niant les hybridations, les emprunts, les transformations qui caractérisent historiquement toutes les cultures ? Les '''esthétiques féministes''' ont profondément renouvelé la réflexion sur les relations entre genre, pouvoir et création artistique depuis les années 1970, mais connaissent actuellement des développements particulièrement féconds qui dépassent le simple constat de la sous-représentation des femmes artistes. Les théoriciennes contemporaines, s'inspirant notamment de Judith Butler, Donna Haraway, Karen Barad, développent des analyses de la manière dont les catégories de genre structurent non seulement la reconnaissance institutionnelle des artistes mais également les critères d'évaluation esthétique eux-mêmes. Ainsi, les qualités traditionnellement valorisées dans l'art moderniste, comme la maîtrise technique virtuose, l'originalité radicale, le génie créateur solitaire, reflètent et reproduisent des valeurs culturellement codées comme masculines. Inversement, les pratiques associées au féminin comme l'artisanat, les arts appliqués, les formes collaboratives, l'art textile, ont été systématiquement dévalorisées et exclues des canons artistiques légitimes. Des artistes et théoriciennes comme Judy Chicago, Lucy Lippard, Linda Nochlin, Griselda Pollock ont ouvert la voie à cette critique, mais les développements contemporains intègrent désormais les perspectives '''queer''' et '''trans''' qui déconstruisent encore plus radicalement les binarités de genre. L'esthétique queer, théorisée notamment par José Esteban Muñoz dans ''Cruising Utopia: The Then and There of Queer Futurity'', valorise l'échec, le camp, la performativité exagérée, l'ambiguïté comme stratégies esthétiques subversives contestant les normes hétéronormatives qui régissent implicitement les canons du bon goût et de la beauté légitime. Cette perspective ouvre des lectures radicalement nouvelles d'œuvres et de pratiques autrefois marginalisées, révélant leurs dimensions critiques et transformatrices. Les '''esthétiques écologiques''' ou '''écoesthétiques''' constituent une troisième perspective émergente répondant à l'urgence de la crise climatique et de l'effondrement de la biodiversité. Ces approches remettent fondamentalement en question l'anthropocentrisme qui a caractérisé la tradition esthétique occidentale, centrée sur la perception et le jugement humains comme seules instances légitimes d'évaluation esthétique. Des philosophes comme Timothy Morton développent une '''écologie sombre''' (dark ecology) qui abandonne les visions romantiques d'une nature harmonieuse et belle pour reconnaître sa dimension étrange, monstrueuse, radicalement autre. L'esthétique doit selon Morton intégrer la conscience de ce qu'il nomme les '''hyperobjets''' : entités massives distribuées dans l'espace et le temps à des échelles qui dépassent radicalement la perception humaine ordinaire, comme le réchauffement climatique, la radioactivité, l'évolution biologique, dont nous ne pouvons faire l'expérience que partiellement et indirectement mais qui néanmoins déterminent profondément nos conditions d'existence. Ces perspectives exigent que l'art ne se contente plus de représenter la nature comme extériorité contemplée mais qu'il reconnaisse notre intrication profonde dans des processus écologiques qui nous dépassent infiniment. Des pratiques artistiques comme le '''land art écologique''', l'art des données environnementales, les collaborations art-science tentent de rendre sensibles ces échelles et processus inhabituellement grands ou lents pour la perception humaine, créant des dispositifs qui permettent d'expérimenter viscéralement ce qui demeure ordinairement abstraction scientifique. Cependant, ces démarches soulèvent des questions théoriques fondamentales : l'expérience esthétique demeure-t-elle nécessairement anthropocentrée ou peut-on véritablement imaginer une esthétique non-humaine, tenant compte des perspectives et des affects d'autres espèces, voire d'entités non-vivantes comme les écosystèmes, les fleuves, les montagnes ? Les '''esthétiques du care''' développent une approche relationnelle et éthique de l'art, s'inspirant des théories féministes du care (sollicitude) élaborées par Carol Gilligan, Joan Tronto, Nel Noddings. Appliquées au domaine artistique par des théoriciennes comme Maria Puig de la Bellacasa, ces perspectives valorisent les dimensions de vulnérabilité, d'interdépendance, d'attention, de maintenance qui ont été historiquement exclues des théories esthétiques dominantes privilégiant la création ex nihilo, l'autonomie, la rupture, l'innovation radicale. L'esthétique du care réhabilite des pratiques longtemps dévalorisées : la conservation et la restauration des œuvres, la médiation culturelle, l'art participatif communautaire, l'art thérapeutique, toutes activités impliquant des relations durables de soin plutôt que des gestes héroïques de création spectaculaire. Cette perspective résonne profondément avec les transformations institutionnelles contemporaines qui repensent les musées non plus comme temples sacrés de l'art mais comme espaces de soin communautaire, particulièrement crucial durant la pandémie de COVID-19 qui a révélé l'importance vitale des liens sociaux et du soutien mutuel. Les '''nouvelles ontologies esthétiques''' remettent en question la conception substantialiste traditionnelle qui définit l'œuvre d'art comme objet stable possédant des propriétés intrinsèques déterminées. Inspirées par la philosophie processuelle de Whitehead, le matérialisme vital de Jane Bennett, la théorie des assemblages de Deleuze et Guattari, et le réalisme agentiel de Karen Barad, ces approches conçoivent l'œuvre non comme entité fixe mais comme '''événement''', '''processus''', '''assemblage''' d'éléments hétérogènes (matériaux, gestes artistiques, contextes institutionnels, réceptions spectatorielles) qui ne préexistent pas à leur relation mais émergent de celle-ci. Cette ontologie relationnelle bouleverse de nombreux débats esthétiques classiques sur la nature de l'œuvre, son identité à travers le temps, sa signification, en montrant que ces propriétés ne sont pas intrinsèques mais constamment co-constituées par les réseaux de relations dans lesquels l'œuvre s'inscrit. L''''esthétique computationnelle et algorithmique''' s'intéresse aux modes spécifiques de perception, de création et d'évaluation esthétiques générés par les systèmes informatiques, particulièrement l'intelligence artificielle. Des philosophes comme Luciana Parisi développent une '''esthétique algorithmique''' qui ne se contente pas d'analyser l'art produit par les machines mais interroge la manière dont les algorithmes façonnent notre sensibilité contemporaine, créant de nouvelles formes de subjectivité esthétique. Les systèmes de recommandation culturelle (Spotify, Netflix, algorithmes de curation des réseaux sociaux) construisent activement nos goûts, nos préférences, nos habitudes perceptives selon des logiques computationnelles qui échappent largement à notre conscience. Cette esthétisation algorithmique de l'expérience quotidienne transforme profondément notre rapport au beau, à l'art, à la culture, soulevant des questions urgentes sur l'autonomie du jugement esthétique à l'ère des plateformes numériques. Les '''esthétiques matérialistes''' redécouvrent l'importance de la matérialité des œuvres contre les tendances idéalistes et conceptualistes qui avaient dominé certains courants de l'art et de la théorie contemporains. S'inspirant des théories du nouveau matérialisme, ces approches insistent sur l'agentivité propre des matériaux artistiques (pigments, argile, pierre, données numériques) qui ne sont pas de simples supports passifs de l'intention créatrice mais possèdent des propriétés, des affordances, des résistances qui co-déterminent activement la forme finale de l'œuvre. L'artiste ne domine pas totalement la matière mais négocie constamment avec elle, ajuste ses gestes à ses réponses, découvre des possibilités émergentes imprévisibles. Cette perspective valorise les dimensions tacites, corporelles, improvisationnelles de la création artistique contre l'intellectualisme qui avait parfois réduit l'art à l'illustration de concepts préexistants. Ces perspectives théoriques émergentes, bien que diverses et parfois divergentes dans leurs orientations, convergent néanmoins sur plusieurs refus communs : refus de l'anthropocentrisme, refus de l'eurocentrisme, refus du dualisme esprit/matière, refus de l'autonomie absolue de l'art, refus de la neutralité axiologique. Elles partagent l'ambition de développer des cadres conceptuels plus inclusifs, plus écologiquement responsables, plus attentifs aux dimensions matérielles, corporelles et technologiques de l'expérience esthétique, plus ouverts aux traditions et pratiques non-occidentales. Ensemble, elles dessinent les contours d'une philosophie de l'art pour le vingt-et-unième siècle qui reconnaît pleinement les défis historiques inédits auxquels l'humanité fait face. == Conclusion == Le panorama théorique et pratique de la philosophie de l'art contemporain que nous avons parcouru révèle un champ disciplinaire en pleine transformation, traversé de tensions productives, de controverses irrésolues et d'interrogations fondamentales qui redéfinissent profondément les paramètres mêmes de la réflexion esthétique. Loin de constituer une simple période de transition entre un paradigme classique épuisé et un nouveau paradigme stabilisé, la situation présente se caractérise par la coexistence conflictuelle de multiples perspectives théoriques incompatibles, par la multiplication d'objets artistiques qui défient les catégories traditionnelles, par l'émergence de pratiques institutionnelles qui remettent en question les modèles hérités, et par l'intrusion de technologies radicalement nouvelles qui bouleversent les conditions mêmes de la création et de la réception des œuvres. Cette situation d'incertitude théorique, si elle peut engendrer inconfort et désorientation, possède également une dimension profondément stimulante et créative. Elle nous contraint à abandonner les certitudes rassurantes des systèmes clos, à interroger les présupposés implicites qui structuraient notre compréhension de l'art, à explorer des territoires conceptuels inédits, à inventer de nouveaux outils théoriques adaptés aux réalités émergentes. La philosophie de l'art ne peut plus se contenter d'appliquer mécaniquement des cadres hérités du dix-huitième ou du dix-neuvième siècle à des phénomènes contemporains radicalement différents de ceux qui ont motivé l'élaboration de ces théories. Elle doit accepter la nécessité d'une refondation partielle, voire totale dans certains cas, de ses concepts, de ses méthodes, de ses objets, de ses objectifs. Les '''défis épistémologiques''' auxquels fait face la discipline sont considérables. Comment penser l'art à une époque où la distinction entre artiste et machine se brouille, où des algorithmes génèrent en quelques secondes des images d'une complexité formelle qui aurait nécessité des mois de travail manuel ? La conception romantique du génie créateur, sujet souverain maîtrisant pleinement son processus de création, devient manifestement inadéquate lorsque des systèmes d'intelligence artificielle produisent des œuvres dont les créateurs humains ne comprennent pas entièrement les mécanismes génératifs. Devons-nous pour autant abandonner complètement la notion de créativité ou plutôt la repenser radicalement pour intégrer les dimensions computationnelles, algorithmiques, statistiques qui caractérisent désormais une part croissante de la production artistique ? Comment articuler une conception élargie de la créativité qui reconnaisse simultanément l'agentivité humaine, l'agentivité machinique et leurs multiples enchevêtrements hybrides ? De même, l'ontologie de l'œuvre d'art se trouve radicalement questionnée par les pratiques contemporaines. Qu'est-ce qu'une œuvre à l'ère de la reproductibilité numérique infinie, lorsque le fichier original ne se distingue en rien matériellement de ses innombrables copies ? Les NFT tentent de réintroduire artificiellement la rareté dans le domaine digital, mais cette opération demeure profondément ambiguë : le certificat cryptographique confère-t-il véritablement une propriété de l'œuvre ou simplement un titre de propriété symbolique déconnecté de toute possession effective ? Les performances éphémères qui existent uniquement dans leur actualisation temporaire, les œuvres participatives co-créées par des collectifs anonymes, les projets processuels qui se déploient sur des années voire des décennies, toutes ces formes contemporaines résistent aux catégories ontologiques traditionnelles qui définissaient l'œuvre comme objet stable possédant des propriétés intrinsèques déterminées. Une ontologie relationnelle, processuelle, événementielle semble nécessaire, mais comment la développer rigoureusement sans tomber dans une dissolution totale qui rendrait impossible toute identification, distinction, évaluation des œuvres ? Les '''enjeux éthiques et politiques''' traversent désormais l'ensemble du champ artistique avec une acuité inédite. La responsabilité sociale des artistes et des institutions culturelles ne constitue plus une dimension optionnelle ou périphérique mais s'impose comme exigence centrale face aux urgences contemporaines. La crise climatique requiert que le monde de l'art interroge et transforme radicalement ses pratiques, de la production matérielle des œuvres à l'organisation d'expositions internationales carbonivores. La persistance d'inégalités structurelles de genre, de race, de classe dans les institutions culturelles, longtemps naturalisées ou invisibilisées, fait désormais l'objet de contestations organisées exigeant transformations effectives plutôt que déclarations d'intention symboliques. La financiarisation extrême du marché de l'art, la spéculation effrénée sur certaines œuvres, l'utilisation de l'art dans des stratégies d'évasion fiscale et de blanchiment d'argent via les ports francs opaques, tous ces phénomènes soulèvent des questions éthiques fondamentales sur la compatibilité entre valeur artistique et valeur marchande, entre fonction culturelle et fonction spéculative. Ces enjeux ne concernent pas seulement les praticiens et les professionnels du monde de l'art mais engagent la société dans son ensemble. Les musées, financés largement par des fonds publics, doivent-ils accepter sans condition des mécénats privés provenant d'entreprises impliquées dans la destruction écologique ou l'exploitation sociale ? Les technologies d'intelligence artificielle, développées par des entreprises privées utilisant sans autorisation le travail créatif de millions d'artistes pour entraîner leurs modèles, constituent-elles un outil émancipateur démocratisant la création ou un dispositif d'expropriation massive et de prolétarisation des travailleurs culturels ? L'art contemporain, devenu inaccessible financièrement à l'immense majorité de la population et parfois hermétique conceptuellement même pour les publics cultivés, peut-il légitimement prétendre servir des fonctions démocratiques d'éducation, d'émancipation, de création de liens sociaux ? Les '''perspectives théoriques émergentes''' que nous avons examinées, des esthétiques décoloniales aux esthétiques écologiques en passant par les ontologies relationnelles et les approches féministes, convergent vers plusieurs refus communs qui définissent négativement mais puissamment les contours d'une nouvelle pensée esthétique. Refus de l'universalisme abstrait qui dissimulait en réalité la particularité historique de l'expérience européenne masculine bourgeoise érigée en norme. Refus de l'anthropocentrisme qui excluait systématiquement de la considération esthétique les dimensions non-humaines de l'existence. Refus de l'autonomie absolue de l'art qui servait paradoxalement à le couper de toute fonction sociale critique. Refus du dualisme esprit/matière qui dévalorisait les dimensions corporelles, sensibles, matérielles de la création et de l'expérience artistiques. Refus de l'individualisme méthodologique qui occultait les déterminations collectives, institutionnelles, technologiques de toute pratique artistique. Ces refus multiples ouvrent des espaces théoriques nouveaux, encore largement inexplorés. Une esthétique véritablement planétaire, reconnaissant la multiplicité irréductible des traditions et des pratiques sans les hiérarchiser selon une échelle unique de valeur. Une esthétique écologique, repensant radicalement nos relations au monde naturel non plus sur le mode de la domination extractiviste ou de la contemplation romantique mais sur celui de l'interdépendance et du soin. Une esthétique technologique, intégrant pleinement les dimensions computationnelles, algorithmiques, numériques de la création contemporaine sans tomber dans le techno-déterminisme ou le techno-optimisme naïf. Une esthétique de la justice, articulant inséparablement questions esthétiques et questions éthico-politiques sans réduire l'une aux autres. Une esthétique matérialiste, attentive aux conditions matérielles, économiques, institutionnelles de possibilité de toute création et réception artistiques. L'élaboration de ces nouvelles perspectives théoriques ne peut se faire dans l'isolement disciplinaire mais requiert un dialogue intense et constant avec de multiples champs de savoir. Les sciences cognitives et les neurosciences nous éclairent sur les mécanismes perceptifs et affectifs mobilisés dans l'expérience esthétique. La sociologie de l'art et l'économie de la culture analysent empiriquement les structures institutionnelles et marchandes qui déterminent la production et la circulation des œuvres. Les études postcoloniales et les études de genre révèlent les dimensions politiques et idéologiques dissimulées dans les catégories esthétiques apparemment neutres. L'histoire de l'art fournit la connaissance indispensable des œuvres, des artistes, des mouvements dans leur spécificité historique concrète. Les sciences et technologies de l'information éclairent les transformations induites par le numérique et l'intelligence artificielle. Les sciences environnementales documentent l'impact écologique des pratiques culturelles et les contraintes planétaires dans lesquelles elles doivent désormais s'inscrire. La philosophie de l'art du vingt-et-unième siècle doit donc être fondamentalement interdisciplinaire, ouverte, dialogique, refusant l'autosuffisance spéculative pour s'ancrer dans l'examen attentif des pratiques concrètes, des institutions réelles, des œuvres effectives. Elle doit simultanément maintenir son ambition de rigueur conceptuelle, de cohérence théorique, de généralisation prudente qui la distingue des approches purement descriptives ou des commentaires impressionnistes. Cette double exigence d'ancrage empirique et de rigueur philosophique constitue sans doute la tension la plus productive et la plus difficile à maintenir. Au terme de ce parcours, une conviction s'impose : la philosophie de l'art demeure plus nécessaire que jamais, précisément parce que les transformations contemporaines rendent les évidences traditionnelles caduques et exigent l'élaboration de nouveaux cadres conceptuels. L'art n'est pas un domaine séparé et optionnel de l'existence humaine mais une dimension constitutive de notre rapport au monde, aux autres, à nous-mêmes. Les questions que soulève la philosophie de l'art, qu'est-ce que la beauté, qu'est-ce que la créativité, qu'est-ce que l'expérience esthétique, quelle valeur attribuer à l'art, quelle place lui accorder dans nos vies individuelles et collectives, sont en réalité des questions anthropologiques fondamentales qui engagent notre compréhension même de l'humanité. Y répondre avec la rigueur, la profondeur et l'ouverture que requiert notre époque constitue l'ambition et la responsabilité de la philosophie de l'art contemporaine. == Bibliographie == === Ouvrages fondamentaux === '''Théorie critique et esthétique''' * Adorno, Theodor W. ''Aesthetic Theory'', trad. Robert Hullot-Kentor, Minneapolis, University of Minnesota Press, 1997 (1970). * Adorno, Theodor W. et Horkheimer, Max. ''La Dialectique de la raison'', Paris, Gallimard, 1974 (1947). * Althusser, Louis. « Idéologie et appareils idéologiques d'État », dans ''Positions'', Paris, Éditions sociales, 1976 (1970). * Althusser, Louis. « Lettre sur la connaissance de l'art », dans ''Écrits sur l'art'', Paris, Le Livre de poche, 2015 (1966). * Eagleton, Terry. ''The Ideology of the Aesthetic'', Oxford, Blackwell, 1990. * Eagleton, Terry. ''Marxism and Literary Criticism'', Berkeley, University of California Press, 1976. '''Postmodernisme''' * Baudrillard, Jean. ''Simulacres et simulation'', Paris, Galilée, 1981. * Baudrillard, Jean. ''La Société de consommation'', Paris, Denoël, 1970. * Foster, Hal (dir.). ''The Anti-Aesthetic: Essays on Postmodern Culture'', Port Townsend, Bay Press, 1983. * Jameson, Fredric. ''Postmodernism, or, The Cultural Logic of Late Capitalism'', Durham, Duke University Press, 1991. * Lyotard, Jean-François. ''La Condition postmoderne : Rapport sur le savoir'', Paris, Minuit, 1979. '''Études postcoloniales''' * Said, Edward W. ''Orientalism'', New York, Pantheon Books, 1978. * Said, Edward W. ''Culture and Imperialism'', New York, Knopf, 1993. * Spivak, Gayatri Chakravorty. « Can the Subaltern Speak? », dans Cary Nelson et Lawrence Grossberg (dir.), ''Marxism and the Interpretation of Culture'', Urbana, University of Illinois Press, 1988. * Bhabha, Homi K. ''The Location of Culture'', Londres, Routledge, 1994. * Fanon, Frantz. ''Peau noire, masques blancs'', Paris, Seuil, 1952. '''Philosophie de l'art classique''' * Benjamin, Walter. ''L'Œuvre d'art à l'époque de sa reproductibilité technique'', Paris, Allia, 2011 (1935). * Habermas, Jürgen. « La modernité : un projet inachevé », ''Critique'', n° 413, 1981 (1980). === Art contemporain et marchés === * Anderson, Perry. ''The Origins of Postmodernity'', Londres, Verso, 1998. * Bishop, Claire. ''Artificial Hells: Participatory Art and the Politics of Spectatorship'', Londres, Verso, 2012. * Horowitz, Noah. ''Art of the Deal: Contemporary Art in a Global Financial Market'', Princeton, Princeton University Press, 2011. * Velthuis, Olav. ''Talking Prices: Symbolic Meanings of Prices on the Market for Contemporary Art'', Princeton, Princeton University Press, 2005. * Thompson, Don. ''The $12 Million Stuffed Shark: The Curious Economics of Contemporary Art'', New York, Palgrave Macmillan, 2008. === Art numérique et intelligence artificielle === * Kuspit, Donald. ''The End of Art'', Cambridge, Cambridge University Press, 2004. * Paul, Christiane. ''Digital Art'', Londres, Thames & Hudson, 2003. * Zylinska, Joanna. ''AI Art: Machine Visions and Warped Dreams'', Londres, Open Humanities Press, 2020. === Écologie et art === * Morton, Timothy. ''Hyperobjects: Philosophy and Ecology after the End of the World'', Minneapolis, University of Minnesota Press, 2013. * Morton, Timothy. ''Dark Ecology: For a Logic of Future Coexistence'', New York, Columbia University Press, 2016. * Demos, T. J. ''Decolonizing Nature: Contemporary Art and the Politics of Ecology'', Berlin, Sternberg Press, 2016. === Esthétiques féministes et queer === * Butler, Judith. ''Gender Trouble: Feminism and the Subversion of Identity'', New York, Routledge, 1990. * Haraway, Donna. ''Staying with the Trouble: Making Kin in the Chthulucene'', Durham, Duke University Press, 2016. * Muñoz, José Esteban. ''Cruising Utopia: The Then and There of Queer Futurity'', New York, NYU Press, 2009. * Nochlin, Linda. « Why Have There Been No Great Women Artists? », ''ARTnews'', janvier 1971. * Pollock, Griselda. ''Differencing the Canon: Feminist Desire and the Writing of Art's Histories'', Londres, Routledge, 1999. === Philosophie et nouvelles ontologies === * Bennett, Jane. ''Vibrant Matter: A Political Ecology of Things'', Durham, Duke University Press, 2010. * Barad, Karen. ''Meeting the Universe Halfway: Quantum Physics and the Entanglement of Matter and Meaning'', Durham, Duke University Press, 2007. * Latour, Bruno. ''Nous n'avons jamais été modernes : Essai d'anthropologie symétrique'', Paris, La Découverte, 1991. === Décolonisation et esthétiques décoloniales === * Mignolo, Walter. ''The Darker Side of Western Modernity: Global Futures, Decolonial Options'', Durham, Duke University Press, 2011. * Quijano, Aníbal. « Coloniality of Power, Eurocentrism, and Latin America », ''Nepantla: Views from South'', vol. 1, n° 3, 2000. * Ahmad, Aijaz. ''In Theory: Classes, Nations, Literatures'', Londres, Verso, 1992. === Rapports et études === * Art Basel et UBS. ''The Art Basel and UBS Global Art Market Report'', années diverses. * Julie's Bicycle. ''Art of Zero: Culture and Climate Emergency'', Londres, 2021. * U.S. Copyright Office. ''Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence'', 2023. === Articles et chapitres essentiels === * Danto, Arthur C. « The Artworld », ''The Journal of Philosophy'', vol. 61, n° 19, 1964. * Dickie, George. « Defining Art », ''American Philosophical Quarterly'', vol. 6, n° 3, 1969. * Weitz, Morris. « The Role of Theory in Aesthetics », ''The Journal of Aesthetics and Art Criticism'', vol. 15, n° 1, 1956. {{Autocat}} gzqtwro4asfosghb8hztlbxsxwj4u2m Nietzsche : Introduction à sa philosophie/Éternel Retour 0 83019 764987 751966 2026-04-25T07:48:50Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Éternel Retour]] vers [[Nietzsche : Introduction à sa philosophie/Éternel Retour]] 751966 wikitext text/x-wiki L''''éternel retour''' (en allemand : ''ewige Wiederkunft des Gleichen'' ou ''ewige Wiederkehr'') constitue l'un des concepts les plus énigmatiques et décisifs de la pensée de Friedrich Nietzsche. Cette doctrine, qui affirme que tous les événements de l'univers se répètent identiquement à l'infini, représente selon Nietzsche lui-même « la formule suprême de l'affirmation qui puisse jamais être atteinte »<ref>Friedrich Nietzsche, ''Ecce Homo'', « Ainsi parlait Zarathoustra », § 1, in ''Sämtliche Werke. Kritische Studienausgabe'' (KSA), éd. Giorgio Colli et Mazzino Montinari, Berlin/Munich, De Gruyter/DTV, 1980, vol. 6, p. 335.</ref>. == Genèse et formulation du concept == === La révélation à Sils-Maria === Le concept de l'éternel retour apparaît à Nietzsche en août 1881, lors d'une promenade près du lac de Silvaplana, dans l'Engadine suisse. Dans ''Ecce Homo'', il décrit ainsi ce moment d'inspiration : « La conception fondamentale de l'œuvre [''Ainsi parlait Zarathoustra''], la pensée de l'éternel retour, cette formule suprême de l'affirmation qui puisse jamais être atteinte, date d'août 1881 : elle est jetée sur une feuille de papier avec cette souscription : "6000 pieds au-delà de l'homme et du temps" »<ref>Friedrich Nietzsche, ''Ecce Homo'', « Ainsi parlait Zarathoustra », § 1, KSA 6, p. 335-336.</ref>. Cette expérience est confirmée par un fragment posthume du même mois, où Nietzsche écrit : « Commencement août 1881 à Sils-Maria, 6000 pieds au-dessus de la mer et bien plus haut au-dessus de toutes les choses humaines ! »<ref>Friedrich Nietzsche, fragment posthume 11, été-automne 1881, KSA 9, p. 494.</ref>. === Première présentation publique === La première formulation publique du concept apparaît dans ''Le Gai Savoir'' (1882), à l'aphorisme 341 intitulé « Le poids le plus lourd » (''Das grösste Schwergewicht''). Nietzsche y présente l'éternel retour sous forme d'expérience de pensée : {{Citation bloc|Et si un jour ou une nuit, un démon te suivait dans ta plus solitaire solitude et te disait : "Cette vie, telle que tu la vis actuellement et telle que tu l'as vécue, il te faudra la revivre encore une fois et encore d'innombrables fois ; et il n'y aura rien de nouveau en elle, mais chaque douleur et chaque plaisir, chaque pensée et chaque soupir, et tout l'indiciblement petit et grand de ta vie devront revenir pour toi, et tout dans le même ordre et la même succession — et de même cette araignée et ce clair de lune entre les arbres, et de même cet instant et moi-même. L'éternelle sablier de l'existence sera retourné encore et toujours — et toi avec lui, poussière des poussières !"|Friedrich Nietzsche|''Le Gai Savoir'', § 341<ref>Friedrich Nietzsche, ''Le Gai Savoir'', § 341, KSA 3, p. 570.</ref>}} == Développement dans ''Ainsi parlait Zarathoustra'' == === La scène du portique === C'est dans ''Ainsi parlait Zarathoustra'' (1883-1885) que Nietzsche développe le plus amplement la doctrine de l'éternel retour. Au livre III, dans le chapitre « De la vision et de l'énigme » (''Vom Gesicht und Räthsel''), Zarathoustra présente à l'esprit de la pesanteur une énigme sous forme d'allégorie : {{Citation bloc|Vois ce portique ! Nain ! continuai-je : il a deux faces. Deux chemins se rencontrent ici : personne ne les a jamais suivis jusqu'au bout. Cette longue rue qui descend : elle dure une éternité. Et cette longue rue qui monte — c'est une autre éternité. Ces chemins se contredisent, ils se heurtent de front ; — et c'est ici, à ce portique, qu'ils se rencontrent. Le nom du portique est inscrit en haut : "Instant"|Friedrich Nietzsche|''Ainsi parlait Zarathoustra'', III, « De la vision et de l'énigme », 2<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', III, « De la vision et de l'énigme », 2, KSA 4, p. 199-200.</ref>}} L'argumentation de Zarathoustra s'appuie sur l'idée que si le temps est infini vers le passé et vers le futur, et que toute chose qui peut courir a déjà dû parcourir cette longue rue descendante (le passé), alors l'instant présent lui-même, ainsi que toutes choses, doivent nécessairement avoir déjà existé et devoir éternellement revenir. === La révélation aux animaux === Au chapitre « Le Convalescent » (''Der Genesende''), les animaux de Zarathoustra — l'aigle et le serpent — proclament la doctrine : {{Citation bloc|Tout s'en va, tout revient ; éternellement roule la roue de l'être. Tout meurt, tout refleurit, éternellement se déroule l'année de l'être. Tout se brise, tout se rejoint ; éternellement se reconstruit le même édifice de l'être. Tout se sépare, tout se retrouve ; éternellement fidèle à lui-même demeure l'anneau de l'être|Les animaux de Zarathoustra|''Ainsi parlait Zarathoustra'', III, « Le Convalescent », 2<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', III, « Le Convalescent », 2, KSA 4, p. 272-273.</ref>}} Cette proclamation soulève cependant l'ambiguïté du statut de l'enseignement : Zarathoustra est désigné par ses animaux comme « le maître de l'éternel retour » (''der Lehrer der ewigen Wiederkunft''), mais lui-même n'enseigne jamais explicitement cette doctrine dans l'œuvre publiée. == Les fondements conceptuels == === Les présupposés cosmologiques === Dans ses fragments posthumes, Nietzsche tente d'établir des fondements scientifiques à la doctrine de l'éternel retour. Son argumentation repose sur quatre présupposés principaux : # '''La quantité finie de force dans l'univers''' : « Si le monde peut être pensé comme une grandeur déterminée de force et comme un nombre déterminé de centres de force — et toute autre représentation reste indéterminée et par conséquent inutilisable — il s'ensuit qu'il doit parcourir un nombre calculable de combinaisons dans le grand jeu de dés de son existence »<ref>Friedrich Nietzsche, fragment posthume 14, printemps 1888, KSA 13, p. 373-374.</ref>. # '''L'infinité du temps''' : Le temps étant infini tandis que la matière et l'énergie sont finies, toutes les combinaisons possibles ont déjà dû se produire. # '''La configuration spatiale de l'univers''' : Nietzsche s'appuie notamment sur les travaux de l'astrophysicien Johann Carl Friedrich Zöllner concernant un espace non-infini mais illimité, basé sur la géométrie de Riemann<ref>Cf. Paolo D'Iorio, « Cosmology and Philosophy in Nietzsche's Thought: The Mittag-Ewigkeit Complex », in ''Nietzsche-Studien'', vol. 24, 1995, p. 45-70.</ref>. # '''La nécessité absolue de tous les événements''' : Chaque instant est lié de façon nécessaire à tous les autres dans une chaîne causale infinie. === L'influence des sciences naturelles === La doctrine de l'éternel retour s'inscrit dans le contexte des débats scientifiques du XIX{{e}} siècle sur la thermodynamique. Nietzsche connaissait les travaux de : * '''Julius Robert von Mayer''' sur la conservation de l'énergie (qu'il lit en 1881) * '''Otto Caspari''' sur la connexion des choses (''Der Zusammenhang der Dinge'', 1881) * '''Rudolf Clausius''' et la théorie de la mort thermique de l'univers * '''Johann Gustav Vogt''' (''Die Kraft'', 1878) Nietzsche note : « Le principe de la conservation de la force exige l'éternel retour »<ref>Friedrich Nietzsche, fragment posthume 5, été 1886-automne 1887, KSA 12, p. 209.</ref>. Il cherche ainsi à démontrer que si l'énergie totale de l'univers est constante mais finie, et que le temps est infini, alors toutes les configurations possibles doivent nécessairement se répéter.[1] == Signification philosophique et éthique == === Au-delà du nihilisme === L'éternel retour constitue pour Nietzsche une réponse au [[nihilisme]] européen. Face à la « [[Mort de Dieu|mort de Dieu]] » et à l'effondrement des valeurs transcendantes, cette doctrine propose une sanctification de la vie terrestre sans recours à un au-delà : {{Citation bloc|Ma doctrine enseigne : vis de telle sorte que tu doives souhaiter revivre, — c'est le devoir — car tu revivras de toute façon !|Friedrich Nietzsche|Fragment posthume 11, printemps-automne 1881<ref>Friedrich Nietzsche, fragment posthume 11, printemps-automne 1881, KSA 9, p. 403.</ref>}} L'éternel retour transforme ainsi chaque instant en porteur d'une éternité immanente, sans besoin d'une transcendance divine pour conférer un sens à l'existence. === L'''amor fati'' et l'affirmation totale === La doctrine culmine dans l''''amor fati''', l'amour du destin, qui exige une acceptation et une affirmation totales de la vie : {{Citation bloc|Ma formule pour la grandeur dans l'homme est ''amor fati'' : ne rien vouloir d'autre que ce qui est, ni devant soi, ni derrière soi, ni dans les siècles des siècles. Ne pas se contenter de supporter l'inévitable, encore moins se le dissimuler — tout idéalisme est une manière de se mentir devant l'inévitable —, mais l'''aimer''|Friedrich Nietzsche|''Ecce Homo'', « Pourquoi je suis si avisé », § 10<ref>Friedrich Nietzsche, ''Ecce Homo'', « Pourquoi je suis si avisé », § 10, KSA 6, p. 297.</ref>}} L'éternel retour fonctionne comme un test existentiel : seul celui qui peut affirmer « C'était cela la vie ? Eh bien ! Encore une fois ! »<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', III, « De la vision et de l'énigme », 2, KSA 4, p. 272.</ref> atteint la plénitude de l'affirmation dionysiaque de l'existence. === La pensée sélective === Nietzsche envisage l'éternel retour comme un principe de sélection qui distingue les types d'hommes : {{Citation bloc|Si cette pensée prenait pouvoir sur toi, elle te transformerait tel que tu es, et peut-être t'écraserait-elle ; la question à propos de toute chose : "veux-tu ceci encore une fois et d'innombrables fois ?" pèserait sur ton action comme le poids le plus lourd !|Friedrich Nietzsche|''Le Gai Savoir'', § 341<ref>Friedrich Nietzsche, ''Le Gai Savoir'', § 341, KSA 3, p. 570.</ref>}} La doctrine opère ainsi un tri entre : * Ceux qui s'effondrent sous « le poids le plus lourd » (les faibles, les « derniers hommes ») * Ceux qui se transforment pour pouvoir affirmer leur existence éternellement (les « hommes supérieurs », le « [[Surhomme|Übermensch]] ») == Interprétations et controverses == === La question du statut de la doctrine === Les interprètes divergent profondément sur la nature de l'éternel retour : '''Interprétation cosmologique''' : [[Karl Löwith]], [[Martin Heidegger]] et d'autres considèrent que Nietzsche entendait l'éternel retour comme une thèse sur la structure réelle du cosmos<ref>Karl Löwith, ''Nietzsches Philosophie der ewigen Wiederkunft des Gleichen'', Stuttgart, Kohlhammer, 1956 .</ref><ref>Martin Heidegger, ''Nietzsche'', vol. I et II, Pfullingen, Neske, 1961.</ref>. '''Interprétation existentielle''' : Bernd Magnus et d'autres soutiennent qu'il s'agit d'un impératif existentiel, une maxime éthique plutôt qu'une affirmation ontologique<ref>Bernd Magnus, ''Nietzsche's Existential Imperative'', Bloomington, Indiana University Press, 1978.</ref>. '''Interprétation sélective''' : [[Gilles Deleuze]] propose une lecture selon laquelle l'éternel retour serait un principe sélectif qui ne fait revenir que ce qui affirme<ref>Gilles Deleuze, ''Nietzsche et la philosophie'', Paris, PUF, 1962, p. 68-72.</ref>. Cette interprétation est contestée par Paolo D'Iorio qui démontre qu'elle repose sur une lecture erronée d'un fragment posthume mal transcrit<ref>Paolo D'Iorio, « La superstition des philosophes critiques. Nietzsche et Afrikan Spir », in ''Nietzsche-Studien'', vol. 22, 1993, p. 257-294.</ref>. === Problèmes logiques et paradoxes === Plusieurs objections ont été formulées contre la cohérence logique de la doctrine : '''Le paradoxe de l'identité''' : [[Georg Simmel]] a objecté qu'il est impossible de distinguer un événement de sa répétition si tout est absolument identique, rendant la notion de « retour » elle-même problématique<ref>Georg Simmel, ''Schopenhauer und Nietzsche'', Leipzig, Duncker & Humblot, 1907, p. 244-257.</ref>. '''L'argument de l'entropie''' : Les lois de la thermodynamique, notamment le second principe, semblent contredire la possibilité d'un retour cyclique parfait<ref>Discussion dans Wolfgang Müller-Lauter, ''Nietzsche. Seine Philosophie der Gegensätze und die Gegensätze seiner Philosophie'', Berlin, De Gruyter, 1971, p. 284-320.</ref>. '''Le problème de la liberté''' : Si tout revient à l'identique, incluant nos choix et nos pensées, quelle place reste-t-il pour la liberté humaine et la créativité ? == Contexte historique et sources == === Précédents antiques === Nietzsche s'inscrit dans une longue tradition de pensée cyclique : * '''Les présocratiques''' : [[Héraclite]] et la doctrine de l'embrasement cosmique (''ekpyrosis'') * '''Les pythagoriciens''' : La croyance en des cycles cosmiques identiques * '''Les stoïciens''' : La doctrine de la grande année cosmique et du retour éternel * '''L'Inde ancienne''' : Les cycles du ''kalpa'' et du ''samsara'' Nietzsche écrit : « J'ai découvert la Grèce — ils croyaient à l'éternel retour. C'est la croyance des mystères »<ref>Friedrich Nietzsche, fragment posthume 15, été 1883, KSA 10, p. 350.</ref>. Dans ''Ecce Homo'', il note également : « La doctrine de l'éternel retour, c'est-à-dire du cycle absolu et infiniment répété de toutes choses — cette doctrine de Zarathoustra pourrait en dernier ressort avoir été enseignée aussi par Héraclite. Du moins la Stoa, qui a hérité presque toutes ses idées fondamentales d'Héraclite, en porte-t-elle des traces »<ref>Friedrich Nietzsche, ''Ecce Homo'', « La Naissance de la tragédie », § 3, KSA 6, p. 313.</ref>.[2] === Sources modernes === Plusieurs textes modernes ont pu influencer Nietzsche : * '''[[Heinrich Heine]]''' : Dans les ''Reisebilder'', Heine évoque l'idée d'une répétition cosmique basée sur la combinatoire finie d'atomes<ref>Heinrich Heine, ''Reisebilder'', in ''Sämtliche Werke'', éd. Ernst Elster, vol. 3, Leipzig, Bibliographisches Institut, 1887-1890, p. 314-315.</ref> * '''[[Arthur Schopenhauer|Schopenhauer]]''' : Les passages sur la mort et l'éternité dans ''Le Monde comme volonté et représentation'' * '''Eduard von Hartmann''' : Les spéculations sur la répétition de la vie dans ''Philosophie de l'Inconscient'' (1869) === Dimension mythologique et symbolique === Au-delà des arguments rationnels, l'éternel retour possède une dimension mythologique. Mazzino Montinari souligne que « la doctrine de l'éternel retour place cette pensée dans une sphère pour ainsi dire transcendantale (non transcendante) »<ref>Mazzino Montinari, « Nietzsche in Cosmopolis », in ''Nietzsche lesen'', Berlin, De Gruyter, 1982, p. 86.</ref>. Le symbole central en est l'anneau (''Ring''), qui unit circularité temporelle et perfection ontologique. Zarathoustra porte des « anneaux de serpent » et est qualifié d'« avocat du cercle » (''der Fürsprecher des Kreises'')<ref>Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'', III, « Le Convalescent », KSA 4, p. 271.</ref>. == Postérité et influence == === Dans la philosophie du XX{{e}} siècle === L'éternel retour a profondément marqué la philosophie existentialiste et continentale : * '''[[Martin Heidegger]]''' : Interprète l'éternel retour comme l'achèvement de la métaphysique occidentale et de la pensée de l'être comme [[volonté de puissance]] * '''[[Karl Jaspers]]''' : Voit dans l'éternel retour une tentative désespérée de créer une transcendance de substitution après la mort de Dieu * '''[[Gilles Deleuze]]''' : Propose une lecture de l'éternel retour comme « synthèse du temps » et principe sélectif * '''Eugen Fink''' : Développe une interprétation ontologique de l'éternel retour comme « jeu du monde » === En littérature et dans les arts === Le concept a inspiré de nombreux écrivains et artistes : * '''[[Milan Kundera]]''' : ''L'insoutenable légèreté de l'être'' (1984) explore les implications existentielles de l'éternel retour * '''[[Jorge Luis Borges]]''' : Plusieurs nouvelles traitent du temps cyclique et de la répétition * '''[[Gustav Mahler]]''' : La Troisième Symphonie s'inspire du chant de minuit de Zarathoustra * '''[[Richard Strauss]]''' : Le poème symphonique ''Ainsi parlait Zarathoustra'' (1896) évoque musicalement la doctrine == Évaluation critique contemporaine == === Pertinence scientifique === Les développements de la cosmologie moderne ont renouvelé l'intérêt pour les modèles cycliques de l'univers. Le théorème de récurrence de [[Henri Poincaré|Poincaré]] (1890) démontre mathématiquement que, dans certaines conditions, un système dynamique doit nécessairement revenir arbitrairement proche de son état initial<ref>Henri Poincaré, « Sur le problème des trois corps et les équations de la dynamique », in ''Acta Mathematica'', vol. 13, 1890, p. 1-270.</ref>. Certains modèles cosmologiques contemporains, comme les théories d'univers oscillants ou le modèle ekpyrotique, présentent des analogies avec la pensée nietzschéenne, bien qu'ils diffèrent dans leurs détails techniques. === Valeur philosophique et éthique === Indépendamment de sa validité scientifique, l'éternel retour demeure pertinent comme : # '''Expérience de pensée éthique''' : Un critère pour évaluer nos actions et notre rapport à l'existence # '''Critique du nihilisme''' : Une tentative de réenchanter le monde sans recours à la transcendance # '''Philosophie de l'affirmation''' : Une invitation à l'acceptation totale de la vie # '''Test existentiel''' : Un révélateur de notre capacité à assumer pleinement notre existence == Conclusion == L'éternel retour demeure l'une des doctrines les plus énigmatiques et controversées de Nietzsche. Oscillant entre spéculation cosmologique et impératif existentiel, entre mythe et démonstration scientifique, cette pensée « abyssale » (''abgründlich'') interroge radicalement notre rapport au temps, à l'existence et au sens. Que Nietzsche ait cru littéralement à la réalité physique de l'éternel retour ou qu'il l'ait conçu comme une fiction régulatrice, cette doctrine accomplit ce qu'elle se propose : elle transforme celui qui la pense en profondeur. Elle représente, selon les mots de Nietzsche lui-même, « la formule suprême de l'affirmation qui puisse jamais être atteinte », l'invitation la plus radicale à aimer la vie — non pas malgré sa finitude et son absence de sens transcendant, mais précisément à cause de son caractère immanent, terrestre et éternellement récurrent. == Références == <references /> == Bibliographie == === Œuvres de Nietzsche === * Friedrich Nietzsche, ''Sämtliche Werke. Kritische Studienausgabe'' (KSA), éd. Giorgio Colli et Mazzino Montinari, 15 vol., Berlin/Munich, De Gruyter/DTV, 1980 * Friedrich Nietzsche, ''Le Gai Savoir'' (1882), trad. Patrick Wotling, Paris, Flammarion, 2007 * Friedrich Nietzsche, ''Ainsi parlait Zarathoustra'' (1883-1885), trad. Georges-Arthur Goldschmidt, Paris, Le Livre de Poche, 1972 * Friedrich Nietzsche, ''Ecce Homo'' (1888), trad. Éric Blondel, Paris, Flammarion, 1992 === Études critiques === * Günter Abel, ''Die Dynamik der Willen zur Macht und die ewige Wiederkehr'', Berlin, De Gruyter, 1984 * Marco Brusotti, ''Die Leidenschaft der Erkenntnis. Philosophie und ästhetische Lebensgestaltung bei Nietzsche von Morgenröthe bis Also sprach Zarathustra'', Berlin, De Gruyter, 1997 * Paolo D'Iorio, « Cosmology and Philosophy in Nietzsche's Thought: The Mittag-Ewigkeit Complex », in ''Nietzsche-Studien'', vol. 24, 1995, p. 45-70 * Gilles Deleuze, ''Nietzsche et la philosophie'', Paris, PUF, 1962 * Martin Heidegger, ''Nietzsche'', 2 vol., Pfullingen, Neske, 1961 * Karl Löwith, ''Nietzsches Philosophie der ewigen Wiederkehr des Gleichen'', Stuttgart, Kohlhammer, 1956 * Bernd Magnus, ''Nietzsche's Existential Imperative'', Bloomington, Indiana University Press, 1978 * Wolfgang Müller-Lauter, ''Nietzsche. Seine Philosophie der Gegensätze und die Gegensätze seiner Philosophie'', Berlin, De Gruyter, 1971 * Georg Simmel, ''Schopenhauer und Nietzsche'', Leipzig, Duncker & Humblot, 1907 == Voir aussi == * [[Friedrich Nietzsche]] * [[Ainsi parlait Zarathoustra]] * [[Surhomme]] * [[Volonté de puissance]] * [[Amor fati]] * [[Nihilisme]] * [[Temps cyclique]] == Liens externes == * [http://www.nietzschesource.org Nietzsche Source] — Édition critique numérique complète des œuvres et de la correspondance * [https://plato.stanford.edu/entries/nietzsche/ Stanford Encyclopedia of Philosophy: Friedrich Nietzsche] [[Catégorie:Friedrich Nietzsche]] [[Catégorie:Concept philosophique]] [[Catégorie:Philosophie allemande]] [[Catégorie:Métaphysique]] [[Catégorie:Éthique]] [[Catégorie:Cosmologie]] [[Catégorie:Temps]] rdzlq21r26blhqbdteq2v8amlozuwf8 Nietzsche : Introduction à sa philosophie/L'Apollinien et le Dionysien 0 83022 764967 752464 2026-04-25T07:46:01Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/L'Apollinien et le Dionysien]] vers [[Nietzsche : Introduction à sa philosophie/L'Apollinien et le Dionysien]] 752464 wikitext text/x-wiki == 1.1 La dualité originaire des forces artistiques == === L'origine de la distinction apollinien-dionysien === Dans ''Die Geburt der Tragödie aus dem Geiste der Musik'' (1872), Nietzsche pose les fondements d'une compréhension radicalement nouvelle de l'art grec en établissant une distinction fondamentale entre deux principes esthétiques incarnés par les divinités apolliniennes et dionysiaques<ref>Nietzsche, F. (1872). ''Die Geburt der Tragödie aus dem Geiste der Musik'', § 1. In Nietzsche Source : édition critique numérique des œuvres complètes.</ref><ref>''L'origine de la tragédie'', traduction J. Marnold et J. Morland (1906), § 1 : « L'évolution progressive de l'art est le résultat du double caractère de l'esprit apollinien et de l'esprit dionysien, de la même manière que la dualité des sexes engendre la vie au milieu de luttes perpétuelles et par des rapprochements seulement périodiques. »</ref>. Cette dualité ne constitue pas simplement une classification esthétique, mais révèle selon Nietzsche la structure métaphysique profonde de l'existence elle-même. L'apollinien (''das Apollinische'') représente le principe d'individuation (''principium individuationis''), de la belle apparence (''der schöne Schein''), de la mesure et de la forme harmonieuse<ref>Nietzsche and Greek Thought, V. Tejera (1987), p. 58 : « The Apollonian is the negation of Silenuss assertion, before King Midas, of the pain of life. This art is completive (Ergänzung und Vollendung) of existence. »</ref>. Apollon, en tant que dieu de toutes les facultés créatrices de formes (''Gott der bildenden Kräfte''), règne sur l'apparence rayonnante et sur le monde intérieur de l'imagination<ref>''L'origine de la tragédie'', § 1 : « Apollon, en tant que dieu de toutes les facultés créatrices de formes, est en même temps le dieu divinateur. Lui qui, d'après son origine, est 'l'apparence' rayonnante, la divinité de la lumière, il règne aussi sur l'apparence pleine de beauté du monde intérieur de l'imagination. »</ref>. Le phénomène physiologique correspondant à l'apollinien est le rêve (''der Traum''), dans lequel l'homme accède à une vision ordonnée et structurée du monde<ref>Nietzsche, F. (1872). ''Die Geburt der Tragödie'', § 1 : « Figurons-nous tout d'abord, pour les mieux comprendre, ces deux instincts comme les mondes esthétiques différents du rêve et de l'ivresse. »</ref>. Le dionysien (''das Dionysische'') incarne au contraire l'ivresse (''der Rausch''), la dissolution des limites individuelles, et l'accès à l'unité primordiale avec la nature (''die Ureinheit'')<ref>''The Birth of Tragedy'', § 1-2, cité dans Nietzsche and Greek Thought : « The Dionysian is identical with the musical his subjectivity is transcended or validated in the process. Result: the image that now shows the artist his identity with the heart of the world is a dream scene that embodies the primordial contradiction and primordial pain, together with the primordial pleasure. »</ref>. Ce principe ne se manifeste pas à travers des formes visuelles délimitées, mais à travers la musique, art dionysien par excellence, qui exprime directement la volonté cosmique sans la médiation de l'image<ref>''Nietzsche and the Aesthetic'', Eitan Machter (2025), pp. xii-xiii : « The Dionysian principle, which is instinctual and ecstatic, represents our direct apprehension of the essence of reality, unmediated by conceptualization. At its peak, Dionysian art finds its expression in dance, where the human body itself becomes the work of art. »</ref>. === Les caractéristiques ontologiques de la dualité === Cette distinction entre l'apollinien et le dionysien ne concerne pas uniquement l'esthétique, mais possède une dimension ontologique fondamentale. Ces deux forces structurent l'expérience humaine du monde à tous les niveaux<ref>Nietzsche and Greek Thought, p. 58 : « These two kinds of artistic energy are not only aesthetic or cosmetic but ontological: they structure the human experience of the world. »</ref>. L'apollinien correspond à la manifestation visible, à la ''Erscheinung'' (apparence phénoménale), tandis que le dionysien renvoie au ''Wesen'' (essence), à la réalité primordiale qui se cache derrière les apparences individuées<ref>''The Birth of Tragedy'', § 4 : « C'est dans le délire dionysiaque que se révèle à nous la quintessence de la nature. »</ref>. L'art grec, et particulièrement la tragédie attique dans sa forme classique, représente la synthèse parfaite de ces deux principes opposés<ref>''Die Geburt der Tragödie'', § 1 : « Ces deux instincts impulsifs s'en vont côte à côte, en guerre ouverte le plus souvent, et s'excitant mutuellement à des créations nouvelles, toujours plus robustes, pour perpétuer par elles le conflit de cet antagonisme... jusqu'à ce qu'enfin... ils engendrent alors l'œuvre à la fois dionysienne et apollinienne de la tragédie attique. »</ref>. Dans la tragédie, la musique (principe dionysien) trouve sa rédemption apollinienne à travers la forme structurée du mythe et de la représentation scénique<ref>Nietzsche and Greek Thought, p. 59 : « The music, Dionysian art par excellence, finds in tragedy its Apollonian redemption through form and myth. »</ref>. La tension entre ces deux principes peut être comprise à travers l'analogie avec le voile de Māyā (''der Schleier der Maja'') emprunté à Schopenhauer. L'apollinien tisse ce voile d'apparences qui rend la vie supportable, tandis que le dionysien le déchire pour révéler la terrible vérité de l'existence<ref>''L'origine de la tragédie'', § 1 : « Le voile de Maïa... comme s'il n'en flottait plus que des lambeaux devant le mystérieux Un-primordial (Ur-Eine). »</ref>. === La dimension physiologique et psychologique === Nietzsche ancre fermement sa distinction dans l'expérience physiologique et psychologique humaine. Le rêve apollinien se caractérise par la clarté des formes, la précision des contours, et le sentiment de contemplation esthétique distanciée<ref>''L'origine de la tragédie'', § 1 : « L'apparence pleine de beauté des mondes du rêve, dans la production desquels tout homme est un artiste complet, est la condition préalable de tout art plastique. »</ref>. Dans l'état de rêve, l'individu conserve son identité et sa capacité de jugement esthétique, tout en accédant à un monde de formes idéales et harmonieuses. L'ivresse dionysiaque, en revanche, correspond à un état d'extase (''Ekstase'') dans lequel les frontières de l'individualité s'effacent<ref>Nietzsche and Eternal Recurrence, B. E. McNeil, p. 20 : « The Dionysian impulse of chaos and revelry, and also the Dionysian acknowledgement of life and destruction, which opens us to profound suffering and supreme joy. »</ref>. Cet état peut être provoqué par diverses voies : le breuvage narcotique (comme dans les cultes bachiques antiques), la force du renouveau printanier, ou l'expérience musicale intense<ref>''Die Geburt der Tragödie'', § 1 : « C'est par la puissance du breuvage narcotique que tous les hommes et tous les peuples primitifs ont chanté dans leurs hymnes, ou bien par la force despotique du renouveau printanier pénétrant joyeusement la nature entière, que s'éveille cette exaltation dionysienne. »</ref>. Dans cet état, l'individu ne se sent plus séparé de la nature et de ses semblables, mais fait l'expérience d'une fusion mystique avec le tout cosmique. === Le conflit et la complémentarité des deux principes === La relation entre l'apollinien et le dionysien ne se caractérise pas par une simple opposition statique, mais par un conflit dynamique et créateur (''Wettkampf'', agon). Ces deux forces « s'excitent mutuellement à des créations nouvelles » (''einander zu immer neuen kräftigeren Geburten reizen''), dans un processus dialectique qui ne trouve jamais de résolution définitive<ref>''Die Geburt der Tragödie'', § 1 : « Ces deux instincts... s'excitant mutuellement à des créations nouvelles, toujours plus robustes, pour perpétuer par elles le conflit de cet antagonisme. »</ref>. L'apollinien seul conduirait à un art superficiel, purement décoratif, qui masquerait la réalité tragique de l'existence sans véritablement la transfigurer. Le dionysien seul serait insupportable, nous plongeant dans l'abîme de l'horreur primordiale sans possibilité de consolation esthétique<ref>Nietzsche and Greek Thought, p. 63 : « The Apollonian effect of the epos is not provided by Euripides the rational thinker, while Dionysian involvement is replaced by emotional realism. »</ref>. C'est uniquement dans leur synthèse que peut naître un art véritablement tragique, capable à la fois de révéler la vérité terrible de l'existence et de la rendre esthétiquement supportable. Cette complémentarité s'exprime particulièrement dans la tragédie attique, où le chœur dionysien (représentant l'unité primitive de la communauté) se confronte aux héros apolliniens individualisés, créant ainsi une tension productive entre l'universel et le particulier, entre le chaos primordial et la forme structurée<ref>Nietzsche and Greek Thought, p. 63 : « The tragic chorus is so effective, in fact, that it makes poets out of its audiences... This effectiveness is what distinguishes the Tragic chorus from the individualist lyrics and recitative choruses of the sixth and early fifth century. »</ref>. === Les manifestations artistiques de la dualité === Dans le domaine des arts plastiques, l'apollinien trouve son expression privilégiée dans la sculpture grecque, qui fixe dans le marbre des formes idéales et harmonieuses. La statuaire apollinienne incarne le ''principium individuationis'' dans sa perfection : chaque statue représente un individu clairement délimité, aux proportions mesurées, exprimant la « sereine sagesse du dieu de la forme » (''die ruhige Weisheit des Formengottes'')<ref>''L'origine de la tragédie'', § 1 : « Cette pondération, cette libre aisance dans les émotions les plus violentes, cette sereine sagesse du dieu de la forme. »</ref>. La musique constitue par excellence l'art dionysien. Elle ne représente pas des formes individuées, mais exprime directement la volonté cosmique, le flux incessant du devenir. Comme Nietzsche l'écrira plus tard dans ''Die fröhliche Wissenschaft'', la musique élève la parole à son plus haut niveau, faisant résonner l'universel à travers le particulier<ref>Nietzsche and the Aesthetic, p. xiii : « In Nietzsches view in The Gay Science... Music, on the other hand, elevates the word to its highest level, as seen in opera. »</ref>. La poésie lyrique occupe une position intermédiaire : elle utilise des images apolliniennes (les mots et les représentations visuelles qu'ils évoquent), mais cherche à exprimer un contenu dionysien (les émotions et les états d'âme qui transcendent l'individu)<ref>Nietzsche and Greek Thought, p. 60 : « The lyricist works with visual images, the passionate agitation or emotion is expressed in the Apollonian mode of seeing longing and aspiration in nature. »</ref>. === La signification métaphysique de la dualité === Au-delà de leur dimension esthétique, les principes apollinien et dionysien possèdent une signification métaphysique profonde. Ils représentent deux modalités fondamentales du rapport de l'homme au monde et à l'existence. L'apollinien correspond à ce que Schopenhauer appelait la représentation (''Vorstellung'') : le monde tel qu'il apparaît à un sujet connaissant, structuré par les formes a priori de l'espace, du temps et de la causalité. C'est le monde du ''principium individuationis'', où les êtres et les choses existent comme des entités séparées et distinctes<ref>''L'origine de la tragédie'', § 1 : « On pourrait dire que l'inébranlable confiance en ce principe [d'individuation] et la calme sécurité de celui qui en est pénétré ont trouvé dans Apollon leur expression la plus sublime. »</ref>. Le dionysien, en revanche, donne accès à ce que Schopenhauer nommait la volonté (''Wille'') : la réalité nouménale qui se cache derrière les apparences, l'unité primordiale dont procèdent toutes les manifestations individuées. Dans l'expérience dionysiaque, le voile de Māyā se déchire, et l'individu fait l'expérience terrifiante et exaltante de sa dissolution dans l'Ur-Eine (l'Un-primordial)<ref>''Die Geburt der Tragödie'', § 1 : « L'extase transportée qui, devant cet effondrement du principe d'individuation, s'élève du plus profond de l'homme, du plus profond de la nature elle-même. »</ref>. Cette distinction possède également des implications pour la compréhension nietzschéenne de la vérité. Le monde apollinien des formes stables et identifiables est certes une illusion (''Schein''), mais c'est une illusion nécessaire qui rend la vie possible. Le monde dionysien révèle une vérité plus profonde - l'unité chaotique et contradictoire du réel - mais cette vérité, si elle n'était pas voilée par l'apollinien, serait insupportable<ref>Will to Power, Nietzsches Last Idol, pp. 100-101 : « In The Birth of Tragedy, Nietzsche posited that the ultimate substratum of actuality is a diffuse intention, a striving, a general and shapeless will that objectifies itself in the tangible world of everyday experience. »</ref>. === L'équilibre tragique et son déclin === L'équilibre entre l'apollinien et le dionysien atteint son apogée dans la tragédie attique de l'époque d'Eschyle et de Sophocle. Dans ces œuvres, le contenu dionysien terrible (la souffrance du héros, la cruauté du destin, l'injustice cosmique) trouve une expression apollinienne sublime à travers la beauté des vers, la noblesse des caractères, et l'harmonie de la structure dramatique<ref>Nietzsche and Greek Thought, p. 62-63 : « The Dionysian insights shared in the drama are what distinguish it so sharply... from the epic... Tragedy does not bring redemption through the beauty of cultivated appearances. It does so by the musical achievement of a Dionysian unity with what is primordial in life. »</ref>. Cependant, cet équilibre fragile fut détruit, selon Nietzsche, par l'intervention du rationalisme socratique. Avec Euripide et Socrate, l'élément dionysien fut progressivement expulsé de la tragédie, remplacé par un rationalisme apollinien excessif qui cherchait à rendre tout explicable et compréhensible par la raison<ref>Nietzsche and Greek Thought, p. 64-65 : « Nietzsches hypothesis about the death of Tragedy: (i) that Euripides the rational thinker is separable from Euripides the tragic poet and has overridden him; (ii) that a figure named Socrates is the pure exemplar and pioneer of the new logicality; (iii) that the equation of beauty with intelligibility somehow deprives Tragedy of its Dionysian effectiveness. »</ref>. Cette « mort de la tragédie » représente pour Nietzsche le début d'une décadence culturelle qui se poursuivra à travers toute l'histoire occidentale, culminant dans le nihilisme moderne. La tâche qu'il se propose dans ses œuvres ultérieures sera précisément de ressusciter l'esprit tragique, de restaurer l'équilibre entre l'apollinien et le dionysien dans une culture qui a perdu tout contact avec les forces vitales primordiales<ref>Nietzsche and Eternal Recurrence, p. 20 : « Nietzsche realises that the end of the Christian-moral interpretation of the world offers the possibility of another beginning... the emergence of our creatively and intellectually cultivated overhuman capabilities. »</ref>. == 1.2 La décadence socratique et la mort de la tragédie == === Socrate comme symptôme de la décadence grecque === Dans ''Die Geburt der Tragödie'', Nietzsche identifie en Socrate et en Euripide les fossoyeurs de la tragédie attique<ref>Nietzsche and Greek Thought, V. Tejera (1987), p. 21-22 : « Socrates is featured as a crank and genius who contributed to making the cultural break irreparable. He is also featured as a symptom of the decline. »</ref>. Cette thèse, formulée dès la première œuvre de Nietzsche, demeurera centrale dans toute sa philosophie ultérieure, notamment dans ''Götzen-Dämmerung'' (''Le Crépuscule des idoles'', 1888), où elle trouve sa formulation la plus acérée<ref>''Crépuscule des idoles'', « Le problème de Socrate », § 1 : « le socratisme de la morale, la dialectique, la pondération et la sérénité de l'homme théorique — quoi ? ce socratisme ne pourrait-il pas être justement le signe de la décadence ? »</ref>. Socrate n'apparaît pas chez Nietzsche comme une cause isolée mais comme le symptôme d'un mal plus profond qui rongeait déjà la civilisation grecque<ref>''Crépuscule des idoles'', « Le problème de Socrate », § 2 : « Si l'on avait ''besoin'' de Socrate, c'est parce que son idiosyncrasie n'était déjà plus un cas isolé. »</ref>. La culture athénienne du Ve siècle avant notre ère traversait une crise fondamentale : l'anarchie des instincts (''die Anarchie der Instinkte'') menaçait l'équilibre délicat entre l'apollinien et le dionysien qui avait permis l'éclosion de la tragédie<ref>Nietzsche and Greek Thought, p. 108-109 : « The anarchy of Socrates' powerful instincts... In aphorism 9 of The Problem of Socrates, he perceives that Athenian culture as a whole had come to need the counter-force or tyranny of reason in the narrow sense over instincts that were no longer noble. »</ref>. Socrate incarnait à la fois l'expression extrême de cette décadence et la solution illusoire qu'on lui apportait. Il admettait lui-même renfermer « les pires appétits » (''die schlimmsten Begierden''), mais prétendait être parvenu à les maîtriser par la raison<ref>''Crépuscule des idoles'', « Le problème de Socrate », § 3-4 : « Socrate fascinait car il incarnait à la fois le cas extrême d'un mal universel qui commençait alors à se répandre, du fait qu'il admettait renfermer en lui les pires appétits, et à la fois la solution à ce mal. »</ref>. Cette prétendue maîtrise de soi par la dialectique et la raison constituait cependant, selon Nietzsche, non pas une guérison authentique mais une « apparence trompeuse » (''Täuschung'') qui allait entraîner la civilisation occidentale dans une impasse millénaire<ref>Will to Power, Nietzsche's Last Idol, p. 126 : « Socrates n'était en fait qu'une apparence trompeuse de la guérison de ce mal. »</ref>. === L'optimisme théorique et la tyrannie de la raison === Le concept d'optimisme théorique (''theoretischer Optimismus'') constitue le cœur de la critique nietzschéenne du socratisme<ref>''La Naissance de la tragédie'', § 15 : « Socrate incarne l'optimisme théorique qui prétend que l'être est parfaitement rationnel et connaissable. »</ref>. Cet optimisme repose sur trois principes fondamentaux que Nietzsche dénonce comme mortifères pour l'esprit tragique : '''Premièrement''', la conviction que la vertu s'enseigne (''die Tugend ist lehrbar''). Socrate postulait que nul n'est méchant volontairement et que le vice ne provient que de l'ignorance. Cette équation entre savoir et vertu (''Wissen ist Tugend'') évacue la dimension tragique de l'existence humaine, qui reconnaît la possibilité d'un conflit irréductible entre connaissance et action, entre raison et instinct<ref>Nietzsche and Greek Thought, p. 107 : « The slogans of Socratism... to be beautiful everything must be intelligible or conscious and knowledge is virtue. »</ref>. '''Deuxièmement''', l'affirmation que la pensée peut sonder les abîmes les plus profonds de l'être (''das Denken vermag bis in die tiefsten Abgründe des Seins zu gelangen''). Cette confiance illimitée dans le pouvoir de la raison conduit à nier l'existence d'un fond obscur, dionysien, qui échappe par nature à la conceptualisation rationnelle<ref>''La Naissance de la tragédie'', § 15 : « L'optimisme théorique croit que la connaissance peut atteindre toute vérité et résoudre tous les problèmes. »</ref>. '''Troisièmement''', la croyance que la connaissance peut non seulement comprendre mais aussi corriger l'être (''das Denken vermag das Sein nicht nur zu erkennen, sondern sogar zu korrigieren''). Cette prétention prométhéenne à améliorer la nature par la raison marque le début de ce que Nietzsche appellera plus tard le nihilisme européen<ref>Will to Power, Nietzsche's Last Idol, p. 142 : « L'optimisme théorique est une compensation d'un pessimisme faible. »</ref>. === La dialectique comme arme contre l'instinct tragique === La méthode dialectique socratique (''die sokratische Dialektik'') représente pour Nietzsche l'instrument par lequel la raison a étouffé l'instinct créateur<ref>''La Naissance de la tragédie'', § 13-14 : « Socrate, le dialecticien, marque le triomphe de la raison sur l'instinct dionysiaque. »</ref>. Par ses interrogations incessantes (''das beständige Fragen''), Socrate contraignait ses interlocuteurs à justifier rationnellement leurs croyances et leurs actions, minant ainsi la confiance spontanée dans les valeurs héritées de la tradition aristocratique<ref>Nietzsche and Greek Thought, p. 109 : « With dialectics the plebs come to the top... when Socrates' contemporaries, the competitive Sophists, added the techniques of refutation and rationalization, namely, of antilogistic reasoning, to the discursive arsenal of the Athenians, not only argumentation but speech-making became more logical. »</ref>. Cette insistance sur la définition conceptuelle (''die Begriffsbestimmung'') et la cohérence logique (''die logische Konsequenz'') correspond à ce que Nietzsche appelle le passage d'une culture orale-aurale à une culture graphique-visuelle, de la pensée imagée et concrète du mythe à la pensée abstraite du concept<ref>Nietzsche and Greek Thought, p. 27-28 : « The historical Socrates... would have grown up with correspondingly narrative and concrete ways of talking. Contact, as he matured, with foreign Sophists from areas more advanced in literacy could have made him aware of the new kind of discourse that was emerging. »</ref>. Le Socrate de Platon, avec son exigence de définitions universelles et sa recherche d'essences immuables (''die Suche nach dem Wesen''), inaugure une ère où la parole vivante du mythe cède la place au concept figé de la philosophie systématique. La dialectique socratique instaure également une nouvelle hiérarchie des facultés humaines. Là où la tragédie exaltait l'union féconde de l'intellect apollinien et de la passion dionysiaque, Socrate établit la domination exclusive de la raison (''die Herrschaft der Vernunft'') sur les instincts<ref>''Crépuscule des idoles'', « Le problème de Socrate », § 10 : « Être obligé de lutter contre ses instincts — voilà bien la formule de la décadence. »</ref>. Cette tyrannie de la raison ne représente pas, comme le croyaient les Lumières, un progrès civilisationnel, mais constitue au contraire un affaiblissement vital, une manifestation de décadence chez un peuple dont les instincts nobles se sont délités<ref>Nietzsche and Greek Thought, p. 110-111 : « To have to fight the instincts, concludes Nietzsche, that is the formula of decadence as long as life is ascending, happiness equals instinct. »</ref>. === Euripide, allié de Socrate, et la rationalisation de la tragédie === Euripide (''Euripides'') apparaît dans l'analyse nietzschéenne comme le complice dramaturgique de Socrate, celui qui a transposé l'esprit socratique sur la scène tragique<ref>''La Naissance de la tragédie'', § 12 : « En un certain sens, Euripide ne fut, lui aussi, qu'un masque : la divinité qui parlait par sa bouche n'était pas Dionysos, non plus Apollon, mais un démon qui venait d'apparaître, appelé Socrate. »</ref>. Nietzsche voit en lui « le Socrate esthétique » (''der ästhetische Sokrates''), c'est-à-dire l'application des principes socratiques à l'art dramatique<ref>Nietzsche and Greek Thought, p. 64-65 : « The aesthetic Socratic, as Nietzsche calls him... Euripidean tragedy took of making it possible for every spectator to identify fully with the actors on the stage. »</ref>. La transformation qu'Euripide opère dans la tragédie se manifeste à plusieurs niveaux. '''Premièrement''', il fait descendre le héros tragique de sa hauteur aristocratique pour le rendre accessible au spectateur ordinaire. Les personnages euripidéens parlent une langue plus proche du quotidien athénien, leurs motivations sont explicites et rationalisables<ref>Nietzsche and Greek Thought, p. 67-68 : « It is because Euripides' dramas are easier to paraphrase, and because it is easier to verbalize reasons for the actions of his protagonists, that he has been called a rationalist. »</ref>. Cette démocratisation de la tragédie correspond au triomphe de ce que Nietzsche appelle « la plèbe » (''die Plebs'') dans la culture athénienne. '''Deuxièmement''', Euripide remplace l'élément dionysien — l'ivresse collective, la musique envoûtante, le chœur orgiastique — par un « réalisme émotionnel » (''emotionaler Realismus'') et des « paradoxes froids » (''kalte Paradoxe'')<ref>Nietzsche and Greek Thought, p. 64-65 : « Dionysian involvement is replaced by emotional realism... the work done in Dionysian tragedy by Apollonian thoughtfulness is replaced by the effect of cold paradoxes. »</ref>. Les passions qu'il met en scène ne jaillissent plus des profondeurs dionysiaques mais sont des affects psychologiques individuels, analysables et compréhensibles rationnellement. '''Troisièmement''', la structure même de ses pièces trahit l'influence socratique. Le prologue euripidéen, où un personnage expose didactiquement la situation, brise l'illusion théâtrale et transforme la tragédie en leçon<ref>Euripide, Wikipédia : « Ses pièces commencent souvent d'une façon banale qui mine l'illusion théâtrale. À la différence de Sophocle, Euripide prête à une divinité ou à un personnage humain un monologue pour dire directement au public tout ce que celui-ci a besoin de savoir. »</ref>. Le ''deus ex machina'', cette intervention divine mécanique à la fin de nombreuses pièces, symbolise le remplacement de la nécessité tragique par l'arbitraire rationnel<ref>Euripide, Wikipédia : « Parfois condamné par des critiques comme une façon peu imaginative de terminer une histoire, le spectacle d'un dieu en train de prononcer un jugement du haut d'une machine de théâtre pourrait en fait viser à provoquer de façon délibérée un certain scepticisme envers les dimensions religieuses et héroïques de ses pièces. »</ref>. La loi suprême du socratisme esthétique s'énonce ainsi : « Pour être beau, tout doit être intelligible » (''Um schön zu sein, muss alles verständig sein'')<ref>Nietzsche and Greek Thought, p. 65 : « The supreme law of aesthetic Socratism, says Nietzsche, is that to be beautiful is to be intelligible. »</ref>. Cette équation entre beauté et intelligibilité sonne le glas de l'art tragique authentique, qui tirait précisément sa puissance de l'union du compréhensible apollinien et de l'incompréhensible dionysien. === Le socratisme comme maladie de la civilisation occidentale === L'influence de Socrate ne se limite pas à la Grèce antique ; elle marque un tournant décisif (''Wendepunkt'') dans l'histoire universelle<ref>Nietzsche and Greek Thought, p. 100 : « Socrates, as conceptualist, is one turning point... of world history. »</ref>. Le socratisme inaugure ce que Nietzsche nomme « la tyrannie de la raison » (''die Tyrannei der Vernunft''), une domination qui se perpétuera à travers le platonisme, le christianisme, et finalement la science moderne<ref>''Crépuscule des idoles'', « Le problème de Socrate », § 11 : « La rationalité à tout prix des philosophes grecs à partir de Platon devint la planche de salut du monde grec en péril. »</ref>. Nietzsche identifie dans le socratisme les prémisses de ce qu'il appellera plus tard « l'idéal ascétique » (''das asketische Ideal'')<ref>Will to Power, Nietzsche's Last Idol, p. 59-67 : « To fight the ascetic ideal and its perceived dangers, Nietzsche proposed naturalistic conceptions... of ethics and epistemology built upon his concept of will to power. »</ref>. L'exigence socratique de soumettre tous les instincts au contrôle de la raison préfigure le dualisme corps-âme du platonisme et le mépris chrétien de la chair. La quête socratique de définitions universelles et d'essences immuables anticipe la croyance platonicienne en un monde intelligible supérieur au monde sensible. Plus fondamentalement encore, le socratisme installe dans la civilisation occidentale une méfiance envers la vie elle-même (''Misstrauen gegen das Leben selbst''). En posant que la vie ne vaut d'être vécue que si elle peut être justifiée rationnellement, Socrate introduit un nihilisme latent qui rongera de l'intérieur toute la culture européenne<ref>''La Naissance de la tragédie'', « Essai d'autocritique » (1886), § 1 : « La science elle-même, notre science — envisagée comme symptôme de vie, que signifie, au fond, toute science ? »</ref>. Là où la tragédie enseignait l'affirmation inconditionnelle de l'existence malgré sa dimension terrible et irrationnelle, le socratisme subordonne cette affirmation à des conditions rationnelles, inaugurant ainsi la longue histoire du nihilisme européen. === La mort de la tragédie et ses conséquences culturelles === La disparition de la tragédie ne constitue pas un simple changement de genre littéraire mais marque l'effondrement d'une vision du monde (''Weltanschauung''). Avec la tragédie meurt la capacité de la culture grecque à affirmer la vie dans sa totalité, incluant sa dimension terrible et contradictoire<ref>Nietzsche and Greek Thought, p. 62-63 : « Tragedy does not bring redemption through the beauty of cultivated appearances. It does so by the musical achievement of a Dionysian unity with what is primordial in life. »</ref>. Le triomphe du socratisme entraîne plusieurs conséquences culturelles décisives. '''D'abord''', le remplacement de la sagesse tragique (''tragische Weisheit'') — qui accepte la contradiction comme essence de la vie — par l'optimisme théorique, qui postule l'harmonie fondamentale du réel et sa transparence à la raison<ref>Will to Power, Nietzsche's Last Idol, p. 142 : « The optimistic foundation of Western progress leaves individuals deceived and culture immersed in a chilling darkness. »</ref>. '''Ensuite''', la substitution de l'homme théorique (''der theoretische Mensch'') à l'homme tragique comme idéal culturel. Là où le Grec de l'époque tragique était un guerrier, un poète, un athlète — bref, un homme d'action (''Tätigkeitsmensch'') —, l'époque post-socratique exalte le contemplatif, le savant, le philosophe qui observe la vie au lieu de la vivre pleinement<ref>Nietzsche and Greek Thought, p. 99-100 : « The contemplative life (vita contemplativa) is mistakenly equated with happiness. »</ref>. '''Enfin''', le passage d'une culture fondée sur le mythe (''Mythos'') à une culture dominée par le concept (''Begriff''). Le mythe tragique offrait une compréhension intuitive et globale de l'existence ; la pensée conceptuelle socratique la dissèque, l'analyse, la fragmente en définitions abstraites qui, paradoxalement, la rendent moins compréhensible dans son unité vivante<ref>''La Naissance de la tragédie'', § 17 : « Le mythe meurt lorsqu'on veut le conceptualiser. »</ref>. === La tentative nietzschéenne de renaissance de la tragédie === Dès ''La Naissance de la tragédie'', Nietzsche ne se contente pas de diagnostiquer la mort de l'esprit tragique ; il appelle à sa renaissance (''Wiedergeburt''). Il voit dans la musique de Richard Wagner et dans la philosophie de Schopenhauer les signes avant-coureurs d'un renouveau de la culture dionysiaque<ref>''La Naissance de la tragédie'', § 19-25 : « Nietzsche appelle à une redécouverte de l'esprit tragique des Grecs à travers Wagner et la philosophie allemande. »</ref>. Cependant, cette espérance initiale sera progressivement abandonnée. Dans l'« Essai d'autocritique » de 1886, Nietzsche reconnaît que son premier livre demeurait encore trop prisonnier du romantisme schopenhauerien et wagnérien<ref>''La Naissance de la tragédie'', « Essai d'autocritique », § 6 : « Que ne me suis-je gardé d'exprimer dans les formules de Schopenhauer et de Wagner une intuition aussi étrangère et aussi nouvelle ! »</ref>. La tâche de surmonter le socratisme et de créer une nouvelle culture tragique restera au cœur de toute l'œuvre nietzschéenne, trouvant son expression la plus aboutie dans la doctrine du surhomme (''Übermensch'') et de l'éternel retour (''ewige Wiederkunft''). Le diagnostic nietzschéen de la décadence socratique conserve toute son actualité. Car la civilisation occidentale moderne, héritière du platonisme et du christianisme — ce « platonisme pour le peuple » —, demeure profondément socratique dans ses présupposés fondamentaux : foi en la toute-puissance de la raison, confiance dans le progrès scientifique, croyance en la possibilité d'une maîtrise rationnelle de l'existence<ref>Will to Power, Nietzsche's Last Idol, p. 219-228 : « Nietzsche saw himself the task to revalue all values... to propose single-handedly an alternative upon which a different future would be possible. »</ref>. La « mort de la tragédie » n'est donc pas seulement un événement historique du Ve siècle athénien, mais le symptôme d'une maladie culturelle dont l'Occident n'a jamais guéri. == Notes et références == {{Références}} {{AutoCat}} rrzvc9uw6191oiuub7c98e8n8cdp4qb Dictionnaire de philosophie/Avortement 0 83055 764908 753043 2026-04-24T20:08:13Z PandaMystique 119061 764908 wikitext text/x-wiki {{DicoPhilo|Avortement}} == Éthique de l'avortement == L'éthique de l'avortement compte parmi les chapitres les plus étudiés et les plus controversés de la philosophie morale contemporaine. Elle questionne le statut moral de l'être humain en développement, l'articulation entre droit à la vie et droit sur son propre corps, la nature de la personne morale, ainsi que la légitimité d'une régulation publique de l'intimité. Cette question traverse les frontières disciplinaires et mobilise la métaphysique, l'éthique normative, la philosophie politique, le droit constitutionnel et la bioéthique. === Définitions préliminaires === Avant d'entrer dans la discussion proprement morale, plusieurs distinctions doivent être posées, car la plupart des malentendus du débat tiennent à un usage imprécis du vocabulaire. L'avortement désigne l'interruption d'une grossesse avant son terme, avec expulsion ou extraction du produit de la conception. On distingue l'avortement spontané ou ''fausse couche'', qui résulte d'une cause naturelle indépendante de la volonté, et l'avortement provoqué, issu d'une intervention délibérée. En droit français, l'avortement provoqué se décline lui-même en interruption volontaire de grossesse (IVG), autorisée à la demande de la femme jusqu'à la fin de la quatorzième semaine de grossesse (soit seize semaines d'aménorrhée) depuis la loi du 2 mars 2022, et en interruption médicale de grossesse (IMG), sans limite de terme lorsque la poursuite de la grossesse met gravement en péril la santé de la femme ou lorsqu'une affection d'une particulière gravité et reconnue comme incurable affecte l'enfant à naître<ref>Articles L. 2212-1 et L. 2213-1 du Code de la santé publique français, modifiés par la loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Sur le plan biologique, on appelle zygote la cellule issue de la fécondation, embryon l'organisme en développement jusqu'à la huitième semaine de grossesse, et fœtus l'organisme à partir de cette date jusqu'à la naissance. La viabilité, notion à la fois médicale et juridique, désigne le stade à partir duquel un fœtus peut survivre hors de l'utérus avec assistance médicale ; elle se situe aujourd'hui autour de vingt-deux à vingt-quatre semaines de grossesse, avec une marge d'incertitude liée au poids, à la maturation pulmonaire et à l'équipement néonatal disponible. Enfin, on désigne par avortement tardif l'interruption pratiquée après le seuil de viabilité, cas qui soulève des problèmes moraux distincts de ceux posés par l'avortement précoce. Ces distinctions importent philosophiquement. Une même thèse sur le « statut du fœtus » peut être défendable pour un embryon précoce et discutable pour un fœtus viable, ou inversement. Le débat gagne en précision quand on évite d'utiliser « fœtus » comme terme générique pour toutes les étapes du développement prénatal. === Le statut moral de l'être humain en développement === ==== L'argument de la personnalité morale ==== La question du statut moral du zygote, de l'embryon ou du fœtus occupe une place centrale dans le débat. Une première famille d'arguments restrictifs soutient que l'être humain en développement possède, dès la conception ou à partir d'un certain stade, les propriétés qui font d'un être une personne morale, titulaire d'un droit à la vie comparable à celui d'un nouveau-né ou d'un adulte. Mais que signifie être une personne ? John Locke, dans son ''Essai sur l'entendement humain'' (1689), livre II, chapitre 27, propose une définition qui a durablement marqué la philosophie analytique : une personne est « un être pensant intelligent, qui a raison et réflexion, et qui peut se considérer soi-même comme soi-même, une même chose pensante en différents temps et lieux »<ref>Locke, J. (1689/2001). ''Essai philosophique concernant l'entendement humain'', livre II, chapitre 27, § 9, trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris, Vrin, p. 521.</ref>. Cette définition, fondée sur la conscience réflexive et la continuité psychologique, exclut le zygote, l'embryon et vraisemblablement le fœtus à tous les stades de son développement. Mary Anne Warren a prolongé cette ligne lockéenne dans son article de 1973, « On the Moral and Legal Status of Abortion », où elle propose cinq critères cumulatifs pour caractériser une personne morale : la conscience, en particulier la capacité à éprouver la douleur, la raison, l'activité autonome, la capacité de communiquer des messages variés, et la présence d'une conscience de soi<ref>Warren, M. A. (1973). « On the Moral and Legal Status of Abortion », ''The Monist'', 57(1), pp. 43-61, en particulier pp. 55-56 pour les cinq critères.</ref>. Warren conclut qu'aucun fœtus ne satisfait ces critères et qu'aucun n'est donc une personne au sens moral, ce qui ne préjuge pas entièrement de son statut mais interdit de lui reconnaître les droits d'une personne pleinement constituée. Michael Tooley, dans un article de 1972 puis dans son livre ''Abortion and Infanticide'' (1983), défend une position encore plus restrictive : pour posséder un droit à la vie, un être doit avoir le concept de lui-même comme entité persistante et désirer continuer d'exister<ref>Tooley, M. (1972). « Abortion and Infanticide », ''Philosophy & Public Affairs'', 2(1), pp. 37-65 ; voir aussi ''Abortion and Infanticide'', Oxford, Clarendon Press, 1983, chapitre 5.</ref>. Peter Singer, dans ''Practical Ethics'' (3e éd., 2011, chapitre 6), adopte une position utilitariste voisine et distingue l'être humain au sens biologique de la personne au sens moral : seuls les êtres capables de raison, de conscience de soi et de préférences orientées vers l'avenir possèdent le statut pleinement personnel<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, chapitre 6, pp. 132-175.</ref>. L'implication la plus controversée de cette famille d'arguments, assumée par Tooley et Singer, est que les nouveau-nés eux-mêmes ne satisferaient pas encore ces critères, ce qui a conduit Singer à admettre, dans certaines circonstances extrêmes, le caractère moralement admissible de l'infanticide néonatal, position abondamment critiquée, notamment par les auteurs qui y voient une ''reductio ad absurdum'' de la définition purement psychologique de la personne. ==== L'argument du potentiel ==== Face à la difficulté de soutenir que l'embryon satisfait actuellement les critères de la personnalité, certains philosophes ont déplacé le débat vers la notion de potentialité : même si l'être humain en développement ne possède pas encore les propriétés constitutives de la personne, il les possède potentiellement, et ce potentiel suffit à lui conférer un statut moral qui interdit ou restreint sévèrement l'avortement. Cet argument rencontre plusieurs objections classiques. Singer soutient qu'un prince potentiel n'a pas les droits d'un prince actuel, et que la simple capacité future à devenir X ne confère pas les droits attachés à l'actualité de X<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, p. 152.</ref>. On objecte également que si le potentiel comptait moralement au sens le plus large, les gamètes séparés seraient eux aussi porteurs d'une vie humaine en puissance, et la contraception deviendrait moralement problématique. Cette seconde objection, toutefois, ne dispense pas d'examiner la réponse classique des défenseurs de la potentialité. John Finnis, Patrick Lee ou Robert George soulignent qu'il faut distinguer entre un potentiel actif et un potentiel passif : un gamète isolé ne devient un être humain qu'à la condition d'être combiné à un autre gamète, c'est-à-dire par l'intervention d'un événement causal extérieur à lui-même, alors que le zygote, dès la fécondation, est déjà un organisme humain complet doté d'un programme interne de développement qui se poursuivra de lui-même, pour peu qu'on ne l'interrompe pas<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitre 1 ; George, R. P. et Tollefsen, C. (2008). ''Embryo: A Defense of Human Life'', New York, Doubleday, chapitres 2-3.</ref>. Cette distinction entre l'organisme qui a déjà en lui son principe de développement et l'élément cellulaire qui ne l'a pas encore affaiblit la portée de l'objection des gamètes, sans la rendre nécessairement sans réponse. L'argument du potentiel reste discuté, mais il n'est pas démonté aussi vite que pourraient le laisser croire ses versions sommaires. ==== L'argument du futur de valeur ==== Don Marquis, dans un article fondateur de 1989, « Why Abortion is Immoral », a proposé une stratégie argumentative qui se veut indépendante du débat sur la personnalité. Plutôt que de chercher ce qui rend un être moralement digne de protection, Marquis se demande ce qui fait la gravité du meurtre. Sa réponse : ce qui rend le meurtre moralement mauvais ne tient ni aux préférences frustrées de la victime, ni à la souffrance, ni à l'atteinte à sa dignité de personne, mais au fait qu'il prive la victime d'un « futur comme le nôtre », un avenir contenant des expériences, des projets, des activités et des plaisirs de valeur<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 183-202, en particulier pp. 189-194.</ref>. L'intérêt de cette stratégie est d'éviter la question délicate du seuil de la personnalité. Puisque le fœtus, si on ne l'avorte pas, connaîtra un avenir du même type que celui d'un adulte humain, le priver de cet avenir constitue un mal comparable au meurtre d'un adulte. La conclusion de Marquis est que l'avortement est, sauf circonstances exceptionnelles, profondément immoral. L'argument a suscité une abondante littérature. Une objection fréquente, formulée notamment par David Boonin, consiste à remarquer que Marquis présuppose une identité problématique entre l'organisme fœtal actuel et l'adulte futur : ce qui compte, selon Boonin, c'est moins l'identité biologique que la continuité psychologique du sujet, laquelle n'est pas encore établie au stade embryonnaire<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, chapitre 2, pp. 56-85.</ref>. Une autre objection, souvent soulevée, consiste à dire que si l'argument du futur de valeur interdit l'avortement, il semble interdire aussi la contraception, puisque celle-ci empêche elle aussi l'existence d'un être qui aurait eu un futur de valeur. Marquis a répondu à cette objection dans plusieurs textes en soulignant que la contraception ne prive personne d'un futur, puisqu'aucun sujet individuel n'existe encore au moment où elle s'exerce : un spermatozoïde et un ovule ne constituent pas encore un organisme unique identifiable dont on pourrait dire qu'il aurait eu un avenir<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 201-202 ; voir aussi Marquis, D. (2007). « Abortion Revisited », dans B. Steinbock (éd.), ''The Oxford Handbook of Bioethics'', Oxford, Oxford University Press, pp. 395-415.</ref>. Cette réponse n'est pas universellement jugée convaincante, mais elle montre que l'argument ne s'effondre pas aussi facilement que ses critiques le suggèrent parfois. ==== L'argument substantialiste et la continuité de l'organisme ==== Une autre famille d'arguments restrictifs, moins présente dans les manuels d'éthique analytique mais importante dans la philosophie néo-thomiste et dans les travaux de John Finnis, Patrick Lee, Francis Beckwith et Christopher Kaczor, récuse la séparation lockéenne entre l'être humain biologique et la personne morale. Selon cette approche, chacun de nous est identiquement un organisme humain ; nous ne sommes pas un esprit logé dans un corps, ni une conscience apparue à un certain stade du développement d'un corps qui n'était pas encore nous. Si l'on accepte cette ontologie, alors chacun d'entre nous est numériquement identique à l'embryon qu'il a été : l'embryon humain est déjà l'un de nous, et les droits attachés à notre humanité ne peuvent pas ne pas s'étendre à lui. John Finnis a développé cette perspective dès 1973 dans sa réponse à Thomson, « The Rights and Wrongs of Abortion »<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Patrick Lee, dans ''Abortion and Unborn Human Life'' (1996, 2e éd. 2010), et Francis Beckwith, dans ''Defending Life: A Moral and Legal Case Against Abortion Choice'' (2007), construisent une argumentation systématique à partir de trois thèses : l'embryon humain est un organisme humain complet dès la fécondation, tout organisme humain est une personne au sens ontologique, et la valeur morale d'un être ne dépend pas de ses capacités actuelles mais de la sorte d'être qu'il est<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitres 1-3 ; Beckwith, F. J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice'', Cambridge, Cambridge University Press, chapitres 2 et 6.</ref>. Christopher Kaczor, dans ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'' (2011), prolonge cette approche en examinant, et en rejetant, les principales tentatives analytiques pour dissocier humanité biologique et personnalité morale<ref>Kaczor, C. (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'', New York, Routledge, chapitres 3-5.</ref>. L'un des enjeux centraux de ce courant est la critique du gradualisme. Si la valeur morale dépend de capacités psychologiques qui se développent progressivement, alors elle devient elle-même graduelle, et les droits deviennent des quantités variables, ce que ces auteurs tiennent pour incompatible avec l'idée même d'égalité morale entre les êtres humains. Jeff McMahan, dans ''The Ethics of Killing'' (2002), a élaboré une position concurrente de type « psychologique » qui accepte précisément cette gradualité, tout en reconnaissant la force de l'objection substantialiste<ref>McMahan, J. (2002). ''The Ethics of Killing: Problems at the Margins of Life'', New York, Oxford University Press, chapitres 1-4.</ref>. Le débat entre organisme humain et personne psychologique, loin d'être tranché, constitue l'une des lignes de fracture les plus productives de la bioéthique contemporaine. === Les arguments en faveur du droit à l'avortement === ==== L'argument de l'autonomie corporelle : Judith Jarvis Thomson ==== En 1971, Judith Jarvis Thomson publie « A Defense of Abortion » dans le premier numéro de ''Philosophy & Public Affairs'', article qui est devenu l'un des plus discutés de l'éthique analytique<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 47-66.</ref>. L'originalité de sa démarche tient à un choix stratégique : accorder, pour les besoins de l'argument, que le fœtus est une personne titulaire d'un droit à la vie dès la conception. À partir de cette concession, Thomson cherche à montrer que l'avortement reste moralement permis dans de nombreux cas, parce que le droit à la vie ne se confond pas avec un droit d'utiliser le corps d'une autre personne. Thomson propose sa célèbre analogie du violoniste. Vous vous réveillez un matin pour découvrir que la Société des Amateurs de Musique vous a branché, pendant votre sommeil, à un célèbre violoniste inconscient atteint d'une grave maladie rénale. Vous seul possédez le groupe sanguin compatible. Si vous restez branché pendant neuf mois, il sera sauvé ; si vous vous débranchez, il mourra. Thomson soutient qu'il serait généreux de rester branché, mais que vous n'en avez pas l'obligation morale : le droit à la vie du violoniste ne lui confère pas un droit sur votre corps, et vous n'avez pas manqué à la justice en refusant de lui prêter le vôtre<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 48-49.</ref>. L'analogie vise à montrer qu'une asymétrie sépare le droit à la vie et le droit à ce qui est nécessaire à la vie. Même si le fœtus est une personne, l'interruption de la grossesse ne viole pas nécessairement son droit à la vie, parce qu'il n'a pas reçu le droit d'utiliser le corps de la femme enceinte. La femme peut donc avoir le droit moral d'interrompre cette utilisation, même si l'effet prévu est la mort du fœtus. Les critiques ont souligné les disanalogies entre le cas du violoniste et la grossesse ordinaire. Dans la plupart des cas (hors viol, hors échec d'un moyen contraceptif pleinement utilisé), la femme a volontairement pratiqué une activité dont elle connaissait le risque de grossesse. Ce choix, disent ses adversaires, crée une forme de responsabilité envers le fœtus qui n'existe pas dans le cas du violoniste, où le branchement est parfaitement involontaire. John Finnis, dans sa réponse à Thomson, a défendu cette objection en termes rigoureux<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Thomson anticipait cette réplique et y répondait par une seconde analogie, celle des ''people-seeds'', qu'on peut traduire par « graines de personnes ». Imaginez que des graines microscopiques flottent dans l'air, et qu'il suffise qu'une graine entre chez vous par une fenêtre ouverte et s'enracine dans votre tapis pour qu'une personne s'y développe. Vous aimez avoir les fenêtres ouvertes et vous installez des filets de la meilleure qualité disponibles sur le marché, mais l'un d'eux comporte un défaut et une graine pénètre malgré tout. Thomson soutient qu'ouvrir sa fenêtre en sachant qu'un risque minime existe ne vous engage pas moralement à héberger la plante pendant neuf mois<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 58-59.</ref>. Prendre un risque calculé et prendre des précautions raisonnables ne suffit pas à créer une obligation absolue d'assumer toutes les conséquences imaginables de ce risque. Cette réponse est souvent jugée ingénieuse ; elle ne clôt pas pour autant la discussion sur la portée exacte de la responsabilité causale en matière d'avortement. ==== David Boonin et l'absence de droit au corps d'autrui ==== David Boonin, dans ''A Defense of Abortion'' (2002), prolonge et renforce l'argument de Thomson. Son livre examine une quarantaine d'objections contre l'avortement et tente de montrer que, même en accordant que l'embryon est une personne dès la conception, l'avortement demeure moralement admissible dans la grande majorité des cas<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, introduction pp. 1-22, puis chapitres 4-6.</ref>. L'argument central de Boonin s'appuie sur une analyse du cas ''McFall v. Shimp'', tranché en 1978 par la Cour des plaids communs du comté d'Allegheny en Pennsylvanie. Robert McFall souffrait d'une anémie aplasique mortelle et avait besoin d'une greffe de moelle osseuse. Son cousin, David Shimp, était le seul donneur compatible connu dans sa famille, mais refusa de donner sa moelle. McFall poursuivit Shimp pour obtenir une ordonnance contraignant Shimp à subir la procédure. Le juge Flaherty rejeta la demande, estimant que, quelle que fût la dureté morale du refus de Shimp, le droit ne pouvait contraindre une personne à subir une atteinte corporelle, même minime, pour sauver la vie d'autrui<ref>''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). Pour une discussion philosophique, voir Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, pp. 133-148.</ref>. Boonin en tire la conclusion suivante : si l'État ne peut contraindre quelqu'un à permettre l'utilisation de son corps même pour sauver une vie humaine, il ne peut a fortiori contraindre une femme enceinte à poursuivre une grossesse, laquelle impose un fardeau corporel bien plus considérable qu'un don de moelle. L'asymétrie entre le traitement juridique du don d'organes, fondé sur le consentement, et celui de l'avortement, parfois fondé sur l'obligation, révèle, selon Boonin, une incohérence dans les législations restrictives. L'argument n'est pas à l'abri de la critique. Ses adversaires soulignent que la femme enceinte, dans la plupart des cas, a contribué causalement à l'existence du fœtus et à sa situation de dépendance, tandis que Shimp n'a rien fait qui ait causé la maladie de McFall. Cette différence, disent-ils, engendre une obligation spéciale dans le cas de la grossesse, qui n'existe pas dans le cas du don de moelle. Boonin répond à cette objection en distinguant soigneusement les responsabilités morales et les obligations juridiques positives, mais la discussion reste ouverte. === La doctrine du double effet et l'avortement === La doctrine du double effet est une élaboration scolastique ancienne, dont on trouve l'esquisse chez Thomas d'Aquin, dans la ''Somme théologique'', IIa-IIae, question 64, article 7, à propos de la légitime défense<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 64, a. 7, trad. fr. sous la direction du P. A.-M. Roguet, Paris, Éditions du Cerf, 1984.</ref>. Elle propose un principe permettant d'évaluer la moralité d'actions qui produisent à la fois un effet bon et un effet mauvais. Selon sa formulation classique, une action qui cause un dommage peut être moralement permise si quatre conditions sont réunies. Premièrement, l'acte envisagé n'est pas intrinsèquement mauvais. Deuxièmement, l'intention de l'agent vise le bon effet, le mauvais effet étant seulement prévu et toléré. Troisièmement, le mauvais effet n'est pas un moyen d'obtenir le bon effet. Quatrièmement, il existe une raison proportionnellement grave qui justifie de tolérer le mauvais effet. Appliquée à l'avortement, la doctrine produit des distinctions fines. Dans le cas d'une femme enceinte atteinte d'un cancer de l'utérus, l'ablation de l'utérus cancéreux (hystérectomie) serait jugée permise même si elle entraîne la mort du fœtus, parce que l'intention chirurgicale vise l'ablation d'un organe malade et que la mort du fœtus est un effet second, prévu mais non voulu comme moyen. En revanche, une craniotomie destinée à réduire les dimensions du crâne fœtal pour sauver la vie de la mère serait interdite, parce que l'endommagement du fœtus y est le moyen même du sauvetage. Philippa Foot, dans son article de 1967 « The Problem of Abortion and the Doctrine of the Double Effect », a exposé une critique pénétrante de ce principe<ref>Foot, P. (1967). « The Problem of Abortion and the Doctrine of the Double Effect », ''Oxford Review'', 5, pp. 5-15 ; republié dans ''Virtues and Vices and Other Essays in Moral Philosophy'', Oxford, Basil Blackwell, 1978, pp. 19-32.</ref>. Elle soutient que la distinction entre intention directe et simple prévision est souvent arbitraire et moralement peu pertinente. Pour illustrer son propos, Foot invente ses fameux problèmes du tramway (''trolley problems''), qui ont donné naissance à tout un domaine de la philosophie morale expérimentale. Foot propose de remplacer la distinction intentionnelle par une distinction de droit : ce qui importe n'est pas la structure de l'intention de l'agent, mais de savoir si son action viole ou non un droit d'autrui. Dans le cas de l'hystérectomie, la femme n'a simplement pas l'obligation de continuer à fournir son corps pour soutenir le fœtus, surtout au prix de sa propre vie. Alison McIntyre, dans « Doing Away with Double Effect » (2001), approfondit la critique en montrant que la doctrine engendre des verdicts contre-intuitifs dans de nombreux cas et que les distinctions qu'elle suppose sont souvent impossibles à maintenir de manière cohérente<ref>McIntyre, A. (2001). « Doing Away with Double Effect », ''Ethics'', 111(2), pp. 219-255.</ref>. Warren Quinn, à l'inverse, avait défendu une version reformulée de la doctrine dans « Actions, Intentions, and Consequences: The Doctrine of Double Effect » (1989), où il tente de montrer que l'intention joue un rôle moral irréductible<ref>Quinn, W. S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect », ''Philosophy & Public Affairs'', 18(4), pp. 334-351.</ref>. Frances Kamm, dans ''Creation and Abortion'' (1992) et dans des travaux ultérieurs dont « Abortion Bans and Cruelty » (2023), a examiné en détail l'application de la doctrine au cas de l'avortement. Kamm soutient que, même si l'on accepte certains aspects de la doctrine, elle ne suffit pas à interdire l'avortement : tuer le fœtus peut être moralement permis, même lorsque c'est intentionnel, précisément parce que le fœtus ne possède pas de droit à l'utilisation du corps de la femme pour se maintenir en vie<ref>Kamm, F. M. (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy'', New York, Oxford University Press, chapitre 3 ; Kamm, F. M. (2023). « Abortion Bans and Cruelty », ''Journal of Practical Ethics'', 11(1).</ref>. === Questions connexes === ==== Avortement et consentement ==== Une dimension importante du débat porte sur la notion de consentement. Nancy Davis, dans « Abortion and Self-Defense » (1984), examine si et dans quelle mesure l'avortement peut être justifié par un appel au droit de légitime défense<ref>Davis, N. (1984). « Abortion and Self-Defense », ''Philosophy & Public Affairs'', 13(3), pp. 175-207.</ref>. Davis soutient que la relation entre la femme enceinte et le fœtus est ''sui generis'' et ne peut être assimilée aux cas ordinaires de légitime défense. Le fœtus n'est pas un agresseur au sens ordinaire, puisqu'il n'a ni volonté ni intention hostile ; et pourtant sa présence peut menacer la santé ou la vie de la femme. Davis développe une analyse nuancée qui cherche à articuler, sans les assimiler, les catégories de l'agression, de la menace innocente et du conflit de droits. La question du consentement se pose également dans les cas de viol. De nombreuses positions restrictives admettent une exception en pareil cas. Mais pourquoi ? Si le fœtus est vraiment une personne innocente, pourquoi les circonstances de sa conception affecteraient-elles son droit à la vie ? Cette interrogation révèle des tensions internes aux positions restrictives, et a nourri une littérature spécifique sur le viol, le consentement et la responsabilité causale<ref>Mackenzie, C. (1992). « Abortion and Embodiment », ''Australasian Journal of Philosophy'', 70(2), pp. 136-155.</ref>. ==== Avortement tardif ==== L'avortement tardif, pratiqué après le seuil de viabilité, soulève des préoccupations distinctes. À mesure que la grossesse avance, le fœtus acquiert progressivement des capacités physiologiques et neurologiques plus développées, et peut potentiellement survivre hors de l'utérus avec assistance médicale. Les faits empiriques sur lesquels s'appuie cette gradation sont toutefois plus incertains qu'on ne le pense souvent. La question de la douleur fœtale, en particulier, a été abondamment discutée. Un premier rapport du ''Royal College of Obstetricians and Gynaecologists'' publié en 2010 concluait que le fœtus ne possédait pas, avant vingt-quatre semaines, les connexions neuronales nécessaires à l'expérience de la douleur au sens plein. Une actualisation de 2022 a confirmé cette prudence : les réseaux cérébraux impliqués dans la perception de la douleur sont en cours de développement à vingt-quatre semaines, mais leur fonctionnalité n'est pas encore pleinement établie, et les repères neurophysiologiques les plus solides suggèrent plutôt la période de vingt-huit à trente semaines pour une perception douloureuse au sens élaboré<ref>Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice'', Londres, RCOG, synthèse exécutive et sections sur les corrélats neurophysiologiques de la nociception et de la conscience.</ref>. L'article philosophique sérieux sur l'avortement tardif doit donc résister à la tentation de présenter la capacité fœtale à souffrir comme une donnée acquise et de la convertir trop vite en argument moral. La question de la viabilité, elle aussi, a fait l'objet d'un usage juridique important. L'arrêt ''Roe v. Wade'' (1973) de la Cour suprême des États-Unis, désormais renversé, fixait la viabilité autour de vingt-quatre à vingt-huit semaines et associait ce seuil à un intérêt de l'État croissant à protéger la vie potentielle du fœtus<ref>''Roe v. Wade'', 410 U.S. 113 (1973), partie X de l'opinion du juge Blackmun.</ref>. La position « gradualiste » qui en résulte fait face à une objection classique : le développement du fœtus est continu, sans points de rupture naturels évidents. Si le fœtus de vingt-quatre semaines a des droits significatifs, pourquoi pas celui de vingt-trois semaines et six jours ? Cette difficulté, qu'on rapproche parfois du paradoxe sorite, n'est pas propre à la bioéthique et affecte toute tentative de tracer une ligne dans un processus graduel ; elle ne suffit pourtant pas à disqualifier un seuil légal raisonnablement motivé. ==== Avortement sélectif et enjeux du handicap ==== L'avortement sélectif, fondé sur des caractéristiques du fœtus telles que le sexe, des anomalies génétiques ou des pathologies diagnostiquées, soulève des questions éthiques distinctes. Beaucoup de ceux qui soutiennent un droit général à l'avortement peuvent s'inquiéter des implications de l'avortement sélectif selon le sexe, tel qu'il est pratiqué dans certaines sociétés caractérisées par une préférence marquée pour les garçons. L'avortement des fœtus diagnostiqués avec des anomalies génétiques, au premier rang desquelles la trisomie 21, a suscité un débat spécifique, que la littérature anglophone désigne comme la critique du dépistage prénatal formulée au nom des droits des personnes handicapées (''disability rights critique of prenatal testing''). Des auteurs comme Adrienne Asch et Erik Parens ont soutenu que l'interruption quasi systématique des grossesses après un diagnostic de trisomie 21 exprime, puis renforce, une dévalorisation culturelle du handicap, et risque d'être vécue comme un jugement collectif porté sur l'existence des personnes handicapées elles-mêmes<ref>Parens, E. et Asch, A. (éds.) (2000). ''Prenatal Testing and Disability Rights'', Washington, Georgetown University Press, en particulier l'introduction pp. 3-43 et l'essai d'Adrienne Asch pp. 234-258.</ref>. La réplique libérale, formulée par Bonnie Steinbock ou Frances Kamm, consiste à distinguer l'acte individuel d'avorter, qui n'implique pas nécessairement un jugement négatif sur les personnes handicapées, et une politique publique qui valoriserait implicitement une société sans handicap<ref>Kamm, F. M. (1992). ''Creation and Abortion'', New York, Oxford University Press, chapitre 5 ; Steinbock, B. (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e éd., New York, Oxford University Press, chapitre 6.</ref>. Le débat illustre une tension propre aux politiques reproductives : une liberté individuelle peut produire, statistiquement, une norme sociale implicite qui infléchit les choix ultérieurs. === Dimension politique et juridique === ==== Le cadre juridique français ==== En France, l'interruption volontaire de grossesse a été dépénalisée par la loi du 17 janvier 1975, dite loi Veil, initialement pour une période expérimentale de cinq ans, puis pérennisée par la loi du 31 décembre 1979. Plusieurs réformes ont ensuite étendu son régime : la loi du 4 juillet 2001 relative à l'interruption volontaire de grossesse et à la contraception, portée par Élisabeth Guigou, a porté le délai légal de dix à douze semaines de grossesse et assoupli les conditions d'accès pour les mineures ; la loi du 2 mars 2022, dite loi Gaillot, a porté ce délai à quatorze semaines et étendu aux sages-femmes la possibilité de pratiquer l'IVG instrumentale<ref>Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse ; loi n° 79-1204 du 31 décembre 1979 ; loi n° 2001-588 du 4 juillet 2001 ; loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Le 8 mars 2024, la France est devenue le premier État à constitutionnaliser explicitement le recours à l'avortement. La loi constitutionnelle n° 2024-200 a inscrit à l'article 34 de la Constitution la disposition suivante : « La loi détermine les conditions dans lesquelles s'exerce la liberté garantie à la femme d'avoir recours à une interruption volontaire de grossesse »<ref>Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse, ''Journal officiel de la République française'', n° 58 du 9 mars 2024.</ref>. Cette rédaction est volontairement prudente. Elle ne proclame pas un « droit » à l'avortement au sens des droits-libertés fondamentaux, mais elle reconnaît une « liberté garantie » dont le législateur fixe les conditions d'exercice. Ce choix rédactionnel a fait l'objet de débats juridiques entre ceux qui y voient une protection désormais solide et ceux qui estiment qu'il laisse au législateur une marge de régulation importante. La philosophie politique française a accompagné ce mouvement par des travaux spécifiques. Les réflexions de Simone Veil elle-même, dans son célèbre discours du 26 novembre 1974 devant l'Assemblée nationale, ont insisté sur le caractère tragique de l'avortement et sur la nécessité d'éviter qu'il devienne banal tout en reconnaissant le droit des femmes à ne pas être punies pour y recourir. Geneviève Fraisse, Élisabeth Badinter et d'autres ont contribué à une réflexion philosophique francophone qui ne se réduit pas à la transposition du débat anglo-américain<ref>Fraisse, G. (2007). ''Du consentement'', Paris, Le Seuil ; Badinter, É. (2010). ''Le Conflit : la femme et la mère'', Paris, Flammarion.</ref>. ==== Le cadre juridique états-unien ==== Aux États-Unis, l'architecture constitutionnelle du droit à l'avortement a connu une profonde évolution entre 1973 et 2022. L'arrêt ''Roe v. Wade'' (1973) avait reconnu un droit à l'avortement fondé sur le droit à la vie privée implicitement contenu dans le Quatorzième Amendement, en construisant un cadre trimestriel : droit quasi libre au premier trimestre, possibilité de régulation au deuxième, protection plus large de la « vie potentielle » après la viabilité<ref>''Roe v. Wade'', 410 U.S. 113 (1973), opinion de la Cour rédigée par le juge Blackmun.</ref>. L'arrêt ''Planned Parenthood v. Casey'' (1992) a réaffirmé le droit constitutionnel à l'avortement tout en abandonnant le cadre trimestriel au profit d'un critère du « fardeau indu » (''undue burden''), qui autorisait les États à réglementer l'accès à l'avortement avant la viabilité pour peu qu'ils n'imposent pas d'obstacle excessif<ref>''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992).</ref>. L'arrêt ''Dobbs v. Jackson Women's Health Organization'' (2022) a renversé ''Roe'' et ''Casey'', en jugeant que la Constitution des États-Unis ne protège aucun droit à l'avortement et en renvoyant la réglementation de cette question aux législatures des États<ref>''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022), opinion de la Cour rédigée par le juge Alito.</ref>. Cette décision a reconfiguré le paysage juridique américain : plusieurs États ont adopté des législations restrictives, d'autres ont inscrit le droit à l'avortement dans leur constitution locale, et de nouvelles questions juridiques sont apparues, concernant notamment les déplacements de patientes d'un État à l'autre et la pénalisation de la prescription à distance. Philosophiquement, le débat contemporain aux États-Unis tend à se déplacer depuis la question du statut du fœtus vers celle de la cohérence fédérale, de l'égalité entre citoyens selon leur État de résidence, et des conflits de lois. ==== Libéralisme politique et avortement ==== La question de l'avortement confronte le libéralisme politique à l'une de ses difficultés les plus vives. Comment l'État peut-il réguler la matière dans des sociétés pluralistes traversées par des désaccords moraux profonds et, en un sens important, raisonnables ? John Rawls, dans ''Political Liberalism'' (1993), distingue entre les « doctrines compréhensives », religieuses, philosophiques ou morales, que partagent les citoyens, et les « valeurs politiques » partagées par tous dans le cadre de la coopération sociale. Rawls soutient que les questions constitutionnelles essentielles ne doivent être tranchées qu'à partir de ces dernières. Dans une note célèbre de l'introduction à l'édition brochée de 1996, Rawls écrit que si l'on ne considère que trois valeurs politiques, le respect dû à la vie humaine, la reproduction ordonnée de la société et l'égalité des femmes comme citoyennes égales,, « tout équilibre raisonnable de ces trois valeurs donnera à une femme un droit qualifié à mettre fin à sa grossesse au cours du premier trimestre »<ref>Rawls, J. (1996). ''Political Liberalism'', édition brochée, New York, Columbia University Press, introduction, note 32, p. 243.</ref>. Rawls reconnaît lui-même que cette remarque rapide ne constitue pas une démonstration, mais une illustration de la façon dont la raison publique pourrait trancher la question. La position rawlsienne a fait l'objet de critiques importantes. Ses adversaires lui reprochent de présupposer précisément ce qu'il devrait démontrer : pour juger que la reproduction ordonnée et l'égalité des femmes l'emportent sur le respect dû à la vie humaine, il faut avoir déjà décidé que le statut moral du fœtus n'est pas celui d'une personne. Si le fœtus est une personne, alors la protection de sa vie est une question de justice fondamentale que l'État ne peut écarter au nom de la raison publique. Michael Sandel et d'autres communautariens ont construit sur cette base une critique générale du libéralisme rawlsien<ref>Sandel, M. J. (1984). « Morality and the Liberal Ideal », ''The New Republic'', 7 mai ; Sandel, M. J. (1996). ''Democracy's Discontent'', Cambridge (Mass.), Harvard University Press, chapitre 3.</ref>. ==== Féminisme et avortement ==== Les approches féministes relient l'avortement à des structures plus larges : contrôle patriarcal sur le corps et la sexualité des femmes, division sexuée du travail, inégalités économiques et sociales. Catharine MacKinnon, dans « Reflections on Sex Equality Under Law » (1991), soutient que la criminalisation de l'avortement s'inscrit historiquement dans un contexte où les femmes ont été privées du contrôle sur leur propre corps et leur propre sexualité, et que le droit à l'avortement n'est pas réductible à un droit individuel abstrait : c'est une condition de l'égalité réelle des femmes dans la société<ref>MacKinnon, C. A. (1991). « Reflections on Sex Equality Under Law », ''Yale Law Journal'', 100(5), pp. 1281-1328, en particulier pp. 1308-1315.</ref>. Le féminisme, toutefois, n'est pas unanime sur la question. Le féminisme libéral, représenté entre autres par Martha Nussbaum, insiste sur l'autonomie individuelle et le consentement<ref>Nussbaum, M. C. (1999). ''Sex and Social Justice'', New York, Oxford University Press, chapitre 9.</ref>. Le féminisme matérialiste souligne les déterminations économiques et les inégalités d'accès effectives à l'avortement selon la classe sociale. L'éthique du care, développée par Carol Gilligan et Nel Noddings, déplace l'analyse vers les relations concrètes, les responsabilités contextuelles et le réseau d'interdépendances dans lequel la grossesse s'inscrit<ref>Gilligan, C. (1982). ''In a Different Voice: Psychological Theory and Women's Development'', Cambridge (Mass.), Harvard University Press, chapitre 3.</ref>. Certaines féministes, comme Celia Wolf-Devine, s'interrogent par ailleurs sur la compatibilité entre une éthique du care centrée sur la vulnérabilité et une défense inconditionnelle du droit à l'avortement<ref>Wolf-Devine, C. (1989). « Abortion and the 'Feminine Voice' », ''Public Affairs Quarterly'', 3(3), pp. 81-97.</ref>. Des courants féministes critiques du capacitisme, enfin, mettent en garde contre une transformation du droit à l'avortement en norme sociale implicite qui exercerait une pression de fait sur les parents d'enfants susceptibles d'être porteurs d'un handicap. Loin de constituer une position homogène, le féminisme offre au débat un éventail de perspectives qui s'enrichissent mutuellement. Cette pluralité rappelle que se concentrer exclusivement sur la question métaphysique du statut du fœtus risque de dissimuler les dimensions sociales et politiques effectives de l'avortement : qui est affecté par telle ou telle législation ? Avec quelles conséquences concrètes sur l'égalité, la santé, l'accès aux soins et l'autonomie économique ? === Approches de philosophie morale appliquée === ==== Conséquentialisme et avortement ==== Les approches conséquentialistes évaluent la moralité de l'avortement à partir de ses conséquences globales. Un utilitariste se demandera si l'avortement, dans telle circonstance, maximise le bien-être global ou minimise la souffrance. Cette approche tend généralement vers une position permissive, surtout aux stades précoces de la grossesse, où le fœtus ne possède pas encore, selon toute vraisemblance, la capacité de souffrir. Peter Singer, défenseur d'un utilitarisme des préférences, avance que le fœtus précoce ne possédant pas encore de préférences portant sur son avenir, le tuer ne frustre aucune préférence et n'est donc pas comparable au meurtre d'un adulte doté de telles préférences<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, pp. 138-152.</ref>. L'objection la plus forte adressée à cette position ne porte pas sur son formalisme mais sur sa contre-intuitivité en aval. Si ce qui rend le meurtre moralement mauvais consiste dans la frustration de préférences actuelles orientées vers l'avenir, alors le meurtre d'un dormeur temporairement inconscient, ou celui d'un nouveau-né, devrait être moralement moins grave que celui d'un adulte éveillé, conclusion que Singer assume en partie et que la plupart des autres auteurs rejettent. Les utilitaristes doivent par ailleurs prendre en compte des conséquences plus larges : impact psychologique sur la femme, effets sur la famille existante, conséquences sociales des politiques publiques d'avortement, impact différencié selon la classe et le territoire. Ces calculs sont rarement univoques, et leur résultat dépend d'hypothèses empiriques souvent discutées. ==== Éthique de la vertu et avortement ==== L'éthique de la vertu, plutôt que de se concentrer sur des règles ou des conséquences, s'intéresse au caractère de l'agent moral et aux vertus qu'il manifeste ou néglige. Rosalind Hursthouse, dans « Virtue Theory and Abortion » (1991), propose une application novatrice de cette approche au cas de l'avortement<ref>Hursthouse, R. (1991). « Virtue Theory and Abortion », ''Philosophy & Public Affairs'', 20(3), pp. 223-246.</ref>. Hursthouse soutient que, même en laissant ouverte la question du statut moral du fœtus, on peut juger moralement une décision d'avorter selon qu'elle exprime la vertu ou le vice dans la situation concrète de l'agent. Avorter par simple commodité, pour ne pas reporter un voyage, relève selon elle d'une légèreté contraire aux vertus que l'on attend d'une personne prenant au sérieux le prix de la vie humaine et la portée du geste accompli. Avorter dans des circonstances de pauvreté extrême, après un viol, ou parce que la santé de la mère est gravement menacée, relève en revanche d'un jugement pratique raisonnable qui exprime la prudence et le courage. L'intérêt de cette approche est de réintroduire dans l'évaluation morale des dimensions que les théories des droits ou les utilitarismes tendent à évacuer : la qualité du raisonnement pratique, le rapport de la personne à ses propres valeurs, le sens du geste dans une trajectoire de vie. Sa limite est qu'elle fournit difficilement une base à une législation générale : on ne peut pas pénaliser une femme au motif que son avortement exprime un vice, si d'autres peuvent moralement avorter dans des circonstances analogues. ==== Éthique du care ==== L'éthique du care, d'abord développée par Carol Gilligan dans ''In a Different Voice'' (1982) puis systématisée par Nel Noddings et Joan Tronto, insiste sur les relations, les responsabilités contextuelles et l'attention concrète aux besoins, plutôt que sur des principes abstraits et des droits individuels<ref>Gilligan, C. (1982). ''In a Different Voice'', Cambridge (Mass.), Harvard University Press, chapitre 3 ; Noddings, N. (1984). ''Caring: A Feminine Approach to Ethics and Moral Education'', Berkeley, University of California Press.</ref>. Appliquée à l'avortement, cette approche souligne l'importance de considérer la situation concrète de la femme : relations existantes, responsabilités envers d'autres personnes, capacité matérielle et affective à accueillir un enfant, réseau de soutien disponible. L'éthique du care refuse l'idée qu'il existerait une règle unique applicable à tous les cas d'avortement, et insiste sur le jugement contextuel attentif aux singularités de chaque situation. Elle conduit à valoriser l'accompagnement, la délibération partagée et la reconnaissance de la fragilité humaine. On a parfois opposé l'éthique du care à l'éthique des droits en suggérant que la première serait moins attachée aux principes et donc moins rigoureuse. Les théoriciennes du care récusent cette opposition : leur démarche élabore ses propres critères normatifs, fondés sur la reconnaissance de la vulnérabilité et de l'interdépendance. Elles objectent également que le langage des droits, appliqué à la grossesse, peut aboutir à opposer artificiellement des intérêts qui sont en réalité profondément entrelacés, et à masquer la dimension relationnelle qui structure l'expérience réelle de la maternité. === Considérations méthodologiques === Le débat sur l'avortement illustre plusieurs caractéristiques propres à la philosophie morale appliquée. Trois d'entre elles méritent d'être soulignées. La première est l'importance des ''intuitions morales'' pré-théoriques dans l'argumentation. Beaucoup d'arguments avancés de part et d'autre procèdent en testant des principes généraux contre nos jugements spontanés dans des cas hypothétiques. Les exemples de Thomson (le violoniste, les graines de personnes), ceux de Foot (les problèmes du tramway) ou ceux de Kamm (le trolley réexaminé sous diverses variantes) cherchent à isoler les facteurs qui déterminent nos intuitions pour en tirer des principes articulés. Cette méthode, héritée de la pratique philosophique de l'équilibre réfléchi (''reflective equilibrium'') rawlsien, ne va pas sans difficultés : la fiabilité des intuitions, leur variation selon les cultures et les contextes, et leur résistance à la théorisation font l'objet d'une discussion méthodologique soutenue<ref>Rawls, J. (1971/1987). ''Théorie de la justice'', trad. fr. Catherine Audard, Paris, Le Seuil, §§ 4 et 9.</ref>. La seconde est la façon dont des ''désaccords empiriques'' affectent les conclusions normatives. Les questions relatives à la capacité fœtale de sentir la douleur, au degré de conscience à différents stades, aux effets psychologiques réels de l'avortement sur les femmes, aux conséquences sociales des législations restrictives, sont des questions empiriques dont la résolution, même partielle, réoriente les jugements moraux. Cette interpénétration du factuel et du normatif caractérise la philosophie morale appliquée en général, et l'éthique de l'avortement en particulier. La troisième est ce que John Rawls appelle le « fardeau du jugement ». Même des personnes raisonnables et bien informées, usant des mêmes méthodes de raisonnement moral, peuvent parvenir à des conclusions opposées sur l'avortement. Cette possibilité d'un désaccord raisonnable pose un problème distinct : celui de la régulation publique des questions sur lesquelles un accord complet ne semble pas atteignable. Les sociétés démocratiques pluralistes ont développé des stratégies variées, constitutionnalisation, délégation au législateur, référendum, autonomie locale, dont aucune n'est moralement neutre. === Conclusion === L'éthique de l'avortement constitue l'un des domaines les plus travaillés de la philosophie morale contemporaine. Le débat met en jeu des tensions qui traversent toute la philosophie pratique. Une première tension oppose deux ontologies de l'humain : celle de l'organisme humain, qui tient que chacun d'entre nous a été embryon et que la continuité biologique suffit à fonder une identité morale constante, et celle de la personne psychologique, qui tient que la personne s'élabore à partir de capacités de conscience, de raison et de continuité mentale qui n'apparaissent que progressivement. Une deuxième tension oppose le droit à la vie et le droit sur son propre corps. Même en accordant à l'embryon ou au fœtus un droit à la vie, il reste à déterminer dans quelle mesure ce droit fonde une obligation pour la femme enceinte de lui prêter son corps, dans quelles conditions et à quel prix. Une troisième tension oppose la morale individuelle et la législation publique. On peut juger un avortement particulier moralement douteux sans pour autant soutenir qu'il doit être pénalement réprimé ; on peut juger certaines législations restrictives injustes sans pour autant penser que tout avortement est également souhaitable. Une quatrième tension, enfin, oppose le principe abstrait et le jugement contextuel. Les théories des droits et les conséquentialismes fournissent des cadres généraux ; les éthiques de la vertu et du care insistent sur l'irréductibilité des situations concrètes. La pratique réelle du jugement moral, médical et juridique mobilise nécessairement les deux registres. La philosophie ne tranche pas ces tensions au sens où elle rendrait un verdict que toutes les parties accepteraient. Elle les clarifie, les articule, teste la cohérence des positions en présence, expose leurs présupposés, et rend possible une délibération plus précise. Pour le citoyen, le législateur, le médecin ou le juge, elle offre des outils conceptuels qui ne dispensent pas du jugement pratique mais qui l'informent. Si le désaccord subsiste, il n'est pas pour autant arbitraire : il peut être mieux compris, mieux exposé et mieux respecté, ce qui n'est pas un mince résultat dans une société démocratique. == Références == {{Références|colonnes = 2}} == Bibliographie == === Sources primaires === ==== Ouvrages fondamentaux ==== * Beckwith, Francis J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice''. Cambridge : Cambridge University Press. * Boonin, David (2002). ''A Defense of Abortion''. Cambridge : Cambridge University Press. * Feinberg, Joel (éd.) (1984). ''The Problem of Abortion'', 2e édition. Belmont (CA) : Wadsworth Publishing. * Kaczor, Christopher (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice''. New York : Routledge. * Kamm, Frances Myrna (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy''. New York : Oxford University Press. * Lee, Patrick (1996). ''Abortion and Unborn Human Life''. Washington : Catholic University of America Press. * McMahan, Jeff (2002). ''The Ethics of Killing: Problems at the Margins of Life''. New York : Oxford University Press. * Steinbock, Bonnie (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e édition. New York : Oxford University Press. * Sumner, L. W. (1981). ''Abortion and Moral Theory''. Princeton : Princeton University Press. * Tooley, Michael (1983). ''Abortion and Infanticide''. Oxford : Clarendon Press. * Warren, Mary Anne (1997). ''Moral Status: Obligations to Persons and Other Living Things''. Oxford : Clarendon Press. ==== Articles fondateurs ==== * Davis, Nancy (1984). « Abortion and Self-Defense ». ''Philosophy & Public Affairs'', 13(3), 175-207. * Finnis, John (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson ». ''Philosophy & Public Affairs'', 2(2), 117-145. * Foot, Philippa (1967). « The Problem of Abortion and the Doctrine of the Double Effect ». ''Oxford Review'', 5, 5-15. * Hursthouse, Rosalind (1991). « Virtue Theory and Abortion ». ''Philosophy & Public Affairs'', 20(3), 223-246. * Marquis, Don (1989). « Why Abortion is Immoral ». ''The Journal of Philosophy'', 86(4), 183-202. * Thomson, Judith Jarvis (1971). « A Defense of Abortion ». ''Philosophy & Public Affairs'', 1(1), 47-66. * Tooley, Michael (1972). « Abortion and Infanticide ». ''Philosophy & Public Affairs'', 2(1), 37-65. * Warren, Mary Anne (1973). « On the Moral and Legal Status of Abortion ». ''The Monist'', 57(1), 43-61. === Textes classiques et historiques === * Aquin, Thomas d' (1265-1273). ''Somme théologique'', IIa-IIae, question 64, trad. fr. sous la direction du P. A.-M. Roguet, Paris : Éditions du Cerf, 1984. * Aristote (IVe s. av. J.-C.). ''Éthique à Nicomaque'', livre VII, trad. fr. Richard Bodéüs, Paris : Flammarion, 2004. * Augustin (398-419). ''De libero arbitrio'', trad. fr. dans la ''Bibliothèque augustinienne'', Paris : Desclée de Brouwer. * Kant, Immanuel (1785/1994). ''Fondation de la métaphysique des mœurs'', trad. fr. Alain Renaut, Paris : Flammarion. * Locke, John (1689/2001). ''Essai philosophique concernant l'entendement humain'', trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris : Vrin. === Ouvrages collectifs et encyclopédies === * Baird, Robert M. et Stuart E. Rosenbaum (éds.) (2001). ''The Ethics of Abortion: Pro-Life vs. Pro-Choice'', 3e édition. Buffalo (NY) : Prometheus Books. * Beckwith, Francis J. et Louis P. Pojman (éds.) (1998). ''The Abortion Controversy: 25 Years After Roe v. Wade''. Belmont (CA) : Wadsworth Publishing. * Cohen, Marshall, Thomas Nagel et Thomas Scanlon (éds.) (1974). ''The Rights and Wrongs of Abortion''. Princeton : Princeton University Press. * Kuhse, Helga et Peter Singer (éds.) (1999). ''Bioethics: An Anthology''. Oxford : Blackwell Publishers, chapitres 10-12. * LaFollette, Hugh (éd.) (2002). ''Ethics in Practice: An Anthology'', 2e édition. Oxford : Blackwell Publishers, partie IV. * Parens, Erik et Adrienne Asch (éds.) (2000). ''Prenatal Testing and Disability Rights''. Washington : Georgetown University Press. * Steinbock, Bonnie (éd.) (2007). ''The Oxford Handbook of Bioethics''. New York : Oxford University Press. === Approches philosophiques spécialisées === ==== Éthique féministe ==== * Fraisse, Geneviève (2007). ''Du consentement''. Paris : Le Seuil. * Gilligan, Carol (1982). ''In a Different Voice: Psychological Theory and Women's Development''. Cambridge (Mass.) : Harvard University Press. * Mackenzie, Catriona (1992). « Abortion and Embodiment ». ''Australasian Journal of Philosophy'', 70(2), 136-155. * MacKinnon, Catharine A. (1987). ''Feminism Unmodified: Discourses on Life and Law''. Cambridge (Mass.) : Harvard University Press, chapitre 5. * MacKinnon, Catharine A. (1991). « Reflections on Sex Equality Under Law ». ''Yale Law Journal'', 100(5), 1281-1328. * Nussbaum, Martha C. (1999). ''Sex and Social Justice''. New York : Oxford University Press, chapitre 9. * Noddings, Nel (1984). ''Caring: A Feminine Approach to Ethics and Moral Education''. Berkeley : University of California Press. * Sherwin, Susan (1992). ''No Longer Patient: Feminist Ethics and Health Care''. Philadelphia : Temple University Press, chapitre 5. * Wolf-Devine, Celia (1989). « Abortion and the 'Feminine Voice' ». ''Public Affairs Quarterly'', 3(3), 81-97. ==== Éthique de la vertu ==== * Anscombe, G. E. M. (1958). « Modern Moral Philosophy ». ''Philosophy'', 33(124), 1-19. * Crisp, Roger (éd.) (1996). ''How Should We Live? Essays on the Virtues''. Oxford : Clarendon Press. * Foot, Philippa (2001). ''Natural Goodness''. Oxford : Oxford University Press. * MacIntyre, Alasdair (1981). ''After Virtue''. Notre Dame : University of Notre Dame Press. ==== Conséquentialisme et utilitarisme ==== * Bentham, Jeremy (1789/2011). ''Introduction aux principes de morale et de législation''. Trad. fr. Centre Bentham. Paris : Vrin. * Mill, John Stuart (1863/1988). ''L'Utilitarisme''. Trad. fr. Georges Tanesse. Paris : Flammarion. * Singer, Peter (1979/2011). ''Practical Ethics'', 3e édition. Cambridge : Cambridge University Press, chapitre 6. * Smart, J. J. C. et Bernard Williams (1973). ''Utilitarianism: For and Against''. Cambridge : Cambridge University Press. ==== Déontologie et éthique des droits ==== * Badinter, Élisabeth (2010). ''Le Conflit : la femme et la mère''. Paris : Flammarion. * Dworkin, Ronald (1993). ''Life's Dominion: An Argument About Abortion, Euthanasia, and Individual Freedom''. New York : Knopf. * Gewirth, Alan (1978). ''Reason and Morality''. Chicago : University of Chicago Press. * Nozick, Robert (1974). ''Anarchy, State, and Utopia''. New York : Basic Books. * Rawls, John (1971/1987). ''Théorie de la justice''. Trad. fr. Catherine Audard. Paris : Le Seuil. * Rawls, John (1996). ''Political Liberalism'', édition brochée. New York : Columbia University Press. * Sandel, Michael J. (1996). ''Democracy's Discontent: America in Search of a Public Philosophy''. Cambridge (Mass.) : Harvard University Press. === Philosophie du droit et théorie politique === * Finnis, John (1980). ''Natural Law and Natural Rights''. Oxford : Clarendon Press. * George, Robert P. et Christopher Tollefsen (2008). ''Embryo: A Defense of Human Life''. New York : Doubleday. * Hart, H. L. A. (1961). ''The Concept of Law''. Oxford : Clarendon Press. * Raz, Joseph (1986). ''The Morality of Freedom''. Oxford : Clarendon Press. === Bioéthique et éthique médicale === * Beauchamp, Tom L. et James F. Childress (2012). ''Principles of Biomedical Ethics'', 7e édition. New York : Oxford University Press. * Engelhardt, H. Tristram Jr. (1996). ''The Foundations of Bioethics'', 2e édition. New York : Oxford University Press. * Gillon, Raanan (1986). ''Philosophical Medical Ethics''. Chichester : John Wiley & Sons. * Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice''. Londres : RCOG. === Philosophie de l'action et doctrine du double effet === * Boyle, Joseph (1980). « Toward Understanding the Principle of Double Effect ». ''Ethics'', 90(4), 527-538. * McIntyre, Alison (2001). « Doing Away with Double Effect ». ''Ethics'', 111(2), 219-255. * Quinn, Warren S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect ». ''Philosophy & Public Affairs'', 18(4), 334-351. === Métaphysique et philosophie de l'esprit === * Olson, Eric T. (1997). ''The Human Animal: Personal Identity Without Psychology''. New York : Oxford University Press. * Parfit, Derek (1984). ''Reasons and Persons''. Oxford : Oxford University Press. * Wiggins, David (2001). ''Sameness and Substance Renewed''. Cambridge : Cambridge University Press. === Articles récents et développements contemporains === * Kamm, Frances M. (2023). « Abortion Bans and Cruelty ». ''Journal of Practical Ethics'', 11(1). * Schwarz, Stephen D. (1990). ''The Moral Question of Abortion''. Chicago : Loyola University Press. * Strong, Carson (1997). ''Ethics in Reproductive and Perinatal Medicine''. New Haven : Yale University Press. === Textes juridiques et documents officiels === * Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse (loi Veil). * Loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement (loi Gaillot). * Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse. * ''Roe v. Wade'', 410 U.S. 113 (1973). * ''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992). * ''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022). * ''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). === Ressources en ligne et encyclopédies spécialisées === * Kaczor, Christopher (2014). « Abortion ». ''Internet Encyclopedia of Philosophy''. [https://iep.utm.edu/abortion/] * Manninen, Bertha Alvarez (2018). « The Ethics of Abortion ». ''Stanford Encyclopedia of Philosophy''. [https://plato.stanford.edu/entries/abortion/] * ''Routledge Encyclopedia of Philosophy'' (1998). « Abortion, the ethics of ». Londres : Routledge. === Revues spécialisées === ''Bioethics'' (Wiley-Blackwell) ; ''Cambridge Quarterly of Healthcare Ethics'' (Cambridge University Press) ; ''Hastings Center Report'' (The Hastings Center) ; ''Journal of Medical Ethics'' (BMJ Publishing) ; ''Journal of Medicine and Philosophy'' (Oxford University Press) ; ''Kennedy Institute of Ethics Journal'' (Johns Hopkins University Press) ; ''Philosophy & Public Affairs'' (Princeton University Press) ; ''Public Affairs Quarterly'' (Philosophy Documentation Center) ; ''Journal of Practical Ethics'' (Oxford Uehiro Centre) ; ''Revue philosophique de la France et de l'étranger'' (PUF) ; ''Les Études philosophiques'' (PUF). {{Autocat}} azmcxe32bxpmlp21y6q9fqxvu0q33wa 764910 764908 2026-04-24T23:08:01Z PandaMystique 119061 764910 wikitext text/x-wiki {{DicoPhilo|Avortement}} == Éthique de l'avortement == L'éthique de l'avortement compte parmi les chapitres les plus étudiés et les plus controversés de la philosophie morale contemporaine. Elle questionne le statut moral de l'être humain en développement, l'articulation entre droit à la vie et droit sur son propre corps, la nature de la personne morale, ainsi que la légitimité d'une régulation publique de l'intimité. Cette question traverse les frontières disciplinaires et mobilise la métaphysique, l'éthique normative, la philosophie politique, le droit constitutionnel et la bioéthique. === Définitions préliminaires === Avant d'entrer dans la discussion proprement morale, plusieurs distinctions doivent être posées, car la plupart des malentendus du débat tiennent à un usage imprécis du vocabulaire. L'avortement désigne l'interruption d'une grossesse avant son terme, avec expulsion ou extraction du produit de la conception. On distingue l'avortement spontané ou ''fausse couche'', qui résulte d'une cause naturelle indépendante de la volonté, et l'avortement provoqué, issu d'une intervention délibérée. En droit français, l'avortement provoqué se décline lui-même en interruption volontaire de grossesse (IVG), autorisée à la demande de la femme jusqu'à la fin de la quatorzième semaine de grossesse (soit seize semaines d'aménorrhée) depuis la loi du 2 mars 2022, et en interruption médicale de grossesse (IMG), sans limite de terme lorsque la poursuite de la grossesse met gravement en péril la santé de la femme ou lorsqu'une affection d'une particulière gravité et reconnue comme incurable affecte l'enfant à naître<ref>Articles L. 2212-1 et L. 2213-1 du Code de la santé publique français, modifiés par la loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Sur le plan biologique, on appelle zygote la cellule issue de la fécondation, embryon l'organisme en développement jusqu'à la huitième semaine de grossesse, et fœtus l'organisme à partir de cette date jusqu'à la naissance. La viabilité, notion à la fois médicale et juridique, désigne le stade à partir duquel un fœtus peut survivre hors de l'utérus avec assistance médicale ; elle se situe aujourd'hui autour de vingt-deux à vingt-quatre semaines de grossesse, avec une marge d'incertitude liée au poids, à la maturation pulmonaire et à l'équipement néonatal disponible. Enfin, on désigne par avortement tardif l'interruption pratiquée après le seuil de viabilité, cas qui soulève des problèmes moraux distincts de ceux posés par l'avortement précoce. Ces distinctions importent philosophiquement. Une même thèse sur le « statut du fœtus » peut être défendable pour un embryon précoce et discutable pour un fœtus viable, ou inversement. Le débat gagne en précision quand on évite d'utiliser « fœtus » comme terme générique pour toutes les étapes du développement prénatal. === Le statut moral de l'être humain en développement === ==== L'argument de la personnalité morale ==== La question du statut moral du zygote, de l'embryon ou du fœtus occupe une place centrale dans le débat. Une première famille d'arguments restrictifs soutient que l'être humain en développement possède, dès la conception ou à partir d'un certain stade, les propriétés qui font d'un être une personne morale, titulaire d'un droit à la vie comparable à celui d'un nouveau-né ou d'un adulte. Mais que signifie être une personne ? John Locke, dans son ''Essai sur l'entendement humain'' (1689), livre II, chapitre 27, propose une définition qui a durablement marqué la philosophie analytique : une personne est « un être pensant intelligent, qui a raison et réflexion, et qui peut se considérer soi-même comme soi-même, une même chose pensante en différents temps et lieux »<ref>Locke, J. (1689/2001). ''Essai philosophique concernant l'entendement humain'', livre II, chapitre 27, § 9, trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris, Vrin, p. 521.</ref>. Cette définition, fondée sur la conscience réflexive et la continuité psychologique, exclut le zygote, l'embryon et vraisemblablement le fœtus à tous les stades de son développement. Mary Anne Warren a prolongé cette ligne lockéenne dans son article de 1973, « On the Moral and Legal Status of Abortion », où elle propose cinq critères cumulatifs pour caractériser une personne morale : la conscience, en particulier la capacité à éprouver la douleur, la raison, l'activité autonome, la capacité de communiquer des messages variés, et la présence d'une conscience de soi<ref>Warren, M. A. (1973). « On the Moral and Legal Status of Abortion », ''The Monist'', 57(1), pp. 43-61, en particulier pp. 55-56 pour les cinq critères.</ref>. Warren conclut qu'aucun fœtus ne satisfait ces critères et qu'aucun n'est donc une personne au sens moral, ce qui ne préjuge pas entièrement de son statut mais interdit de lui reconnaître les droits d'une personne pleinement constituée. Michael Tooley, dans un article de 1972 puis dans son livre ''Abortion and Infanticide'' (1983), défend une position encore plus restrictive : pour posséder un droit à la vie, un être doit avoir le concept de lui-même comme entité persistante et désirer continuer d'exister<ref>Tooley, M. (1972). « Abortion and Infanticide », ''Philosophy & Public Affairs'', 2(1), pp. 37-65 ; voir aussi ''Abortion and Infanticide'', Oxford, Clarendon Press, 1983, chapitre 5.</ref>. Peter Singer, dans ''Practical Ethics'' (3e éd., 2011, chapitre 6), adopte une position utilitariste voisine et distingue l'être humain au sens biologique de la personne au sens moral : seuls les êtres capables de raison, de conscience de soi et de préférences orientées vers l'avenir possèdent le statut pleinement personnel<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, chapitre 6, pp. 132-175.</ref>. L'implication la plus controversée de cette famille d'arguments, assumée par Tooley et Singer, est que les nouveau-nés eux-mêmes ne satisferaient pas encore ces critères, ce qui a conduit Singer à admettre, dans certaines circonstances extrêmes, le caractère moralement admissible de l'infanticide néonatal, position abondamment critiquée, notamment par les auteurs qui y voient une ''reductio ad absurdum'' de la définition purement psychologique de la personne. ==== L'argument du potentiel ==== Face à la difficulté de soutenir que l'embryon satisfait actuellement les critères de la personnalité, certains philosophes ont déplacé le débat vers la notion de potentialité : même si l'être humain en développement ne possède pas encore les propriétés constitutives de la personne, il les possède potentiellement, et ce potentiel suffit à lui conférer un statut moral qui interdit ou restreint sévèrement l'avortement. Cet argument rencontre plusieurs objections classiques. Singer soutient qu'un prince potentiel n'a pas les droits d'un prince actuel, et que la simple capacité future à devenir X ne confère pas les droits attachés à l'actualité de X<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, p. 152.</ref>. On objecte également que si le potentiel comptait moralement au sens le plus large, les gamètes séparés seraient eux aussi porteurs d'une vie humaine en puissance, et la contraception deviendrait moralement problématique. Cette seconde objection, toutefois, ne dispense pas d'examiner la réponse classique des défenseurs de la potentialité. John Finnis, Patrick Lee ou Robert George soulignent qu'il faut distinguer entre un potentiel actif et un potentiel passif : un gamète isolé ne devient un être humain qu'à la condition d'être combiné à un autre gamète, c'est-à-dire par l'intervention d'un événement causal extérieur à lui-même, alors que le zygote, dès la fécondation, est déjà un organisme humain complet doté d'un programme interne de développement qui se poursuivra de lui-même, pour peu qu'on ne l'interrompe pas<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitre 1 ; George, R. P. et Tollefsen, C. (2008). ''Embryo: A Defense of Human Life'', New York, Doubleday, chapitres 2-3.</ref>. Cette distinction entre l'organisme qui a déjà en lui son principe de développement et l'élément cellulaire qui ne l'a pas encore affaiblit la portée de l'objection des gamètes, sans la rendre nécessairement sans réponse. L'argument du potentiel reste discuté, mais il n'est pas démonté aussi vite que pourraient le laisser croire ses versions sommaires. ==== L'argument du futur de valeur ==== Don Marquis, dans un article fondateur de 1989, « Why Abortion is Immoral », a proposé une stratégie argumentative qui se veut indépendante du débat sur la personnalité. Plutôt que de chercher ce qui rend un être moralement digne de protection, Marquis se demande ce qui fait la gravité du meurtre. Sa réponse : ce qui rend le meurtre moralement mauvais ne tient ni aux préférences frustrées de la victime, ni à la souffrance, ni à l'atteinte à sa dignité de personne, mais au fait qu'il prive la victime d'un « futur comme le nôtre », un avenir contenant des expériences, des projets, des activités et des plaisirs de valeur<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 183-202, en particulier pp. 189-194.</ref>. L'intérêt de cette stratégie est d'éviter la question délicate du seuil de la personnalité. Puisque le fœtus, si on ne l'avorte pas, connaîtra un avenir du même type que celui d'un adulte humain, le priver de cet avenir constitue un mal comparable au meurtre d'un adulte. La conclusion de Marquis est que l'avortement est, sauf circonstances exceptionnelles, profondément immoral. L'argument a suscité une abondante littérature. Une objection fréquente, formulée notamment par David Boonin, consiste à remarquer que Marquis présuppose une identité problématique entre l'organisme fœtal actuel et l'adulte futur : ce qui compte, selon Boonin, c'est moins l'identité biologique que la continuité psychologique du sujet, laquelle n'est pas encore établie au stade embryonnaire<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, chapitre 2, pp. 56-85.</ref>. Une autre objection, souvent soulevée, consiste à dire que si l'argument du futur de valeur interdit l'avortement, il semble interdire aussi la contraception, puisque celle-ci empêche elle aussi l'existence d'un être qui aurait eu un futur de valeur. Marquis a répondu à cette objection dans plusieurs textes en soulignant que la contraception ne prive personne d'un futur, puisqu'aucun sujet individuel n'existe encore au moment où elle s'exerce : un spermatozoïde et un ovule ne constituent pas encore un organisme unique identifiable dont on pourrait dire qu'il aurait eu un avenir<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 201-202 ; voir aussi Marquis, D. (2007). « Abortion Revisited », dans B. Steinbock (éd.), ''The Oxford Handbook of Bioethics'', Oxford, Oxford University Press, pp. 395-415.</ref>. Cette réponse n'est pas universellement jugée convaincante, mais elle montre que l'argument ne s'effondre pas aussi facilement que ses critiques le suggèrent parfois. ==== L'argument substantialiste et la continuité de l'organisme ==== Une autre famille d'arguments restrictifs, moins présente dans les manuels d'éthique analytique mais importante dans la philosophie néo-thomiste et dans les travaux de John Finnis, Patrick Lee, Francis Beckwith et Christopher Kaczor, récuse la séparation lockéenne entre l'être humain biologique et la personne morale. Selon cette approche, chacun de nous est identiquement un organisme humain ; nous ne sommes pas un esprit logé dans un corps, ni une conscience apparue à un certain stade du développement d'un corps qui n'était pas encore nous. Si l'on accepte cette ontologie, alors chacun d'entre nous est numériquement identique à l'embryon qu'il a été : l'embryon humain est déjà l'un de nous, et les droits attachés à notre humanité ne peuvent pas ne pas s'étendre à lui. John Finnis a développé cette perspective dès 1973 dans sa réponse à Thomson, « The Rights and Wrongs of Abortion »<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Patrick Lee, dans ''Abortion and Unborn Human Life'' (1996, 2e éd. 2010), et Francis Beckwith, dans ''Defending Life: A Moral and Legal Case Against Abortion Choice'' (2007), construisent une argumentation systématique à partir de trois thèses : l'embryon humain est un organisme humain complet dès la fécondation, tout organisme humain est une personne au sens ontologique, et la valeur morale d'un être ne dépend pas de ses capacités actuelles mais de la sorte d'être qu'il est<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitres 1-3 ; Beckwith, F. J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice'', Cambridge, Cambridge University Press, chapitres 2 et 6.</ref>. Christopher Kaczor, dans ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'' (2011), prolonge cette approche en examinant, et en rejetant, les principales tentatives analytiques pour dissocier humanité biologique et personnalité morale<ref>Kaczor, C. (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'', New York, Routledge, chapitres 3-5.</ref>. L'un des enjeux centraux de ce courant est la critique du gradualisme. Si la valeur morale dépend de capacités psychologiques qui se développent progressivement, alors elle devient elle-même graduelle, et les droits deviennent des quantités variables, ce que ces auteurs tiennent pour incompatible avec l'idée même d'égalité morale entre les êtres humains. Jeff McMahan, dans ''The Ethics of Killing'' (2002), a élaboré une position concurrente de type « psychologique » qui accepte précisément cette gradualité, tout en reconnaissant la force de l'objection substantialiste<ref>McMahan, J. (2002). ''The Ethics of Killing: Problems at the Margins of Life'', New York, Oxford University Press, chapitres 1-4.</ref>. Le débat entre organisme humain et personne psychologique, loin d'être tranché, constitue l'une des lignes de fracture les plus productives de la bioéthique contemporaine. === Les arguments en faveur du droit à l'avortement === ==== L'argument de l'autonomie corporelle : Judith Jarvis Thomson ==== En 1971, Judith Jarvis Thomson publie « A Defense of Abortion » dans le premier numéro de ''Philosophy & Public Affairs'', article qui est devenu l'un des plus discutés de l'éthique analytique<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 47-66.</ref>. L'originalité de sa démarche tient à un choix stratégique : accorder, pour les besoins de l'argument, que le fœtus est une personne titulaire d'un droit à la vie dès la conception. À partir de cette concession, Thomson cherche à montrer que l'avortement reste moralement permis dans de nombreux cas, parce que le droit à la vie ne se confond pas avec un droit d'utiliser le corps d'une autre personne. Thomson propose sa célèbre analogie du violoniste. Vous vous réveillez un matin pour découvrir que la Société des Amateurs de Musique vous a branché, pendant votre sommeil, à un célèbre violoniste inconscient atteint d'une grave maladie rénale. Vous seul possédez le groupe sanguin compatible. Si vous restez branché pendant neuf mois, il sera sauvé ; si vous vous débranchez, il mourra. Thomson soutient qu'il serait généreux de rester branché, mais que vous n'en avez pas l'obligation morale : le droit à la vie du violoniste ne lui confère pas un droit sur votre corps, et vous n'avez pas manqué à la justice en refusant de lui prêter le vôtre<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 48-49.</ref>. L'analogie vise à montrer qu'une asymétrie sépare le droit à la vie et le droit à ce qui est nécessaire à la vie. Même si le fœtus est une personne, l'interruption de la grossesse ne viole pas nécessairement son droit à la vie, parce qu'il n'a pas reçu le droit d'utiliser le corps de la femme enceinte. Celle-ci peut donc avoir le droit moral d'interrompre cette utilisation, même si l'effet prévu est la mort du fœtus. Les critiques ont souligné les disanalogies entre le cas du violoniste et la grossesse ordinaire. Dans la plupart des cas (hors viol, hors échec d'un moyen contraceptif pleinement utilisé), la grossesse fait suite à une activité volontaire dont les partenaires connaissaient le risque reproductif. Ce choix, disent les adversaires de Thomson, crée une forme de responsabilité envers le fœtus qui n'existe pas dans le cas du violoniste, où le branchement est parfaitement involontaire. John Finnis, dans sa réponse à Thomson, a défendu cette objection en termes rigoureux<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Thomson anticipait cette réplique et y répondait par une seconde analogie, celle des ''people-seeds'', qu'on peut traduire par « graines de personnes ». Imaginez que des graines microscopiques flottent dans l'air, et qu'il suffise qu'une graine entre chez vous par une fenêtre ouverte et s'enracine dans votre tapis pour qu'une personne s'y développe. Vous aimez avoir les fenêtres ouvertes et vous installez des filets de la meilleure qualité disponibles sur le marché, mais l'un d'eux comporte un défaut et une graine pénètre malgré tout. Thomson soutient qu'ouvrir sa fenêtre en sachant qu'un risque minime existe ne vous engage pas moralement à héberger la plante pendant neuf mois<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 58-59.</ref>. Prendre un risque calculé et prendre des précautions raisonnables ne suffit pas à créer une obligation absolue d'assumer toutes les conséquences imaginables de ce risque. Cette réponse est souvent jugée ingénieuse ; elle ne clôt pas pour autant la discussion sur la portée exacte de la responsabilité causale en matière d'avortement. ==== David Boonin et l'absence de droit au corps d'autrui ==== David Boonin, dans ''A Defense of Abortion'' (2002), prolonge et renforce l'argument de Thomson. Son livre examine une quarantaine d'objections contre l'avortement et tente de montrer que, même en accordant que l'embryon est une personne dès la conception, l'avortement demeure moralement admissible dans la grande majorité des cas<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, introduction pp. 1-22, puis chapitres 4-6.</ref>. L'argument central de Boonin s'appuie sur une analyse du cas ''McFall v. Shimp'', tranché en 1978 par la Cour des plaids communs du comté d'Allegheny en Pennsylvanie. Robert McFall souffrait d'une anémie aplasique mortelle et avait besoin d'une greffe de moelle osseuse. Son cousin, David Shimp, était le seul donneur compatible connu dans sa famille, mais refusa de donner sa moelle. McFall poursuivit Shimp pour obtenir une ordonnance contraignant Shimp à subir la procédure. Le juge Flaherty rejeta la demande, estimant que, quelle que fût la dureté morale du refus de Shimp, le droit ne pouvait contraindre une personne à subir une atteinte corporelle, même minime, pour sauver la vie d'autrui<ref>''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). Pour une discussion philosophique, voir Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, pp. 133-148.</ref>. Boonin en tire la conclusion suivante : si l'État ne peut contraindre quelqu'un à permettre l'utilisation de son corps même pour sauver une vie humaine, il ne peut a fortiori contraindre une femme enceinte à poursuivre une grossesse, laquelle impose un fardeau corporel bien plus considérable qu'un don de moelle. L'asymétrie entre le traitement juridique du don d'organes, fondé sur le consentement, et celui de l'avortement, parfois fondé sur l'obligation, révèle, selon Boonin, une incohérence dans les législations restrictives. L'argument n'est pas à l'abri de la critique. Ses adversaires soulignent que la femme enceinte, dans la plupart des cas, a contribué causalement à l'existence du fœtus et à sa situation de dépendance, tandis que Shimp n'a rien fait qui ait causé la maladie de McFall. Cette différence, disent-ils, engendre une obligation spéciale dans le cas de la grossesse, qui n'existe pas dans le cas du don de moelle. Boonin répond à cette objection en distinguant soigneusement les responsabilités morales et les obligations juridiques positives, mais la discussion reste ouverte. === La doctrine du double effet et l'avortement === La doctrine du double effet est une élaboration scolastique ancienne, dont on trouve l'esquisse chez Thomas d'Aquin, dans la ''Somme théologique'', IIa-IIae, question 64, article 7, à propos de la légitime défense<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 64, a. 7, trad. fr. sous la direction du P. A.-M. Roguet, Paris, Éditions du Cerf, 1984.</ref>. Elle propose un principe permettant d'évaluer la moralité d'actions qui produisent à la fois un effet bon et un effet mauvais. Selon sa formulation classique, une action qui cause un dommage peut être moralement permise si quatre conditions sont réunies. Premièrement, l'acte envisagé n'est pas intrinsèquement mauvais. Deuxièmement, l'intention de l'agent vise le bon effet, le mauvais effet étant seulement prévu et toléré. Troisièmement, le mauvais effet n'est pas un moyen d'obtenir le bon effet. Quatrièmement, il existe une raison proportionnellement grave qui justifie de tolérer le mauvais effet. Appliquée à l'avortement, la doctrine produit des distinctions fines. Dans le cas d'une femme enceinte atteinte d'un cancer de l'utérus, l'ablation de l'utérus cancéreux (hystérectomie) serait jugée permise même si elle entraîne la mort du fœtus, parce que l'intention chirurgicale vise l'ablation d'un organe malade et que la mort du fœtus est un effet second, prévu mais non voulu comme moyen. En revanche, une craniotomie destinée à réduire les dimensions du crâne fœtal pour sauver la vie de la mère serait interdite, parce que l'endommagement du fœtus y est le moyen même du sauvetage. Philippa Foot, dans son article de 1967 « The Problem of Abortion and the Doctrine of the Double Effect », a exposé une critique pénétrante de ce principe<ref>Foot, P. (1967). « The Problem of Abortion and the Doctrine of the Double Effect », ''Oxford Review'', 5, pp. 5-15 ; republié dans ''Virtues and Vices and Other Essays in Moral Philosophy'', Oxford, Basil Blackwell, 1978, pp. 19-32.</ref>. Elle soutient que la distinction entre intention directe et simple prévision est souvent arbitraire et moralement peu pertinente. Pour illustrer son propos, Foot invente ses fameux problèmes du tramway (''trolley problems''), qui ont donné naissance à tout un domaine de la philosophie morale expérimentale. Foot propose de remplacer la distinction intentionnelle par une distinction de droit : ce qui importe n'est pas la structure de l'intention de l'agent, mais de savoir si son action viole ou non un droit d'autrui. Dans le cas de l'hystérectomie, la femme n'a simplement pas l'obligation de continuer à fournir son corps pour soutenir le fœtus, surtout au prix de sa propre vie. Alison McIntyre, dans « Doing Away with Double Effect » (2001), approfondit la critique en montrant que la doctrine engendre des verdicts contre-intuitifs dans de nombreux cas et que les distinctions qu'elle suppose sont souvent impossibles à maintenir de manière cohérente<ref>McIntyre, A. (2001). « Doing Away with Double Effect », ''Ethics'', 111(2), pp. 219-255.</ref>. Warren Quinn, à l'inverse, avait défendu une version reformulée de la doctrine dans « Actions, Intentions, and Consequences: The Doctrine of Double Effect » (1989), où il tente de montrer que l'intention joue un rôle moral irréductible<ref>Quinn, W. S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect », ''Philosophy & Public Affairs'', 18(4), pp. 334-351.</ref>. Frances Kamm, dans ''Creation and Abortion'' (1992) et dans des travaux ultérieurs dont « Abortion Bans and Cruelty » (2023), a examiné en détail l'application de la doctrine au cas de l'avortement. Kamm soutient que, même si l'on accepte certains aspects de la doctrine, elle ne suffit pas à interdire l'avortement : tuer le fœtus peut être moralement permis, même lorsque c'est intentionnel, précisément parce que le fœtus ne possède pas de droit à l'utilisation du corps de la femme pour se maintenir en vie<ref>Kamm, F. M. (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy'', New York, Oxford University Press, chapitre 3 ; Kamm, F. M. (2023). « Abortion Bans and Cruelty », ''Journal of Practical Ethics'', 11(1).</ref>. === Questions connexes === ==== Avortement et consentement ==== Une dimension importante du débat porte sur la notion de consentement. Nancy Davis, dans « Abortion and Self-Defense » (1984), examine si et dans quelle mesure l'avortement peut être justifié par un appel au droit de légitime défense<ref>Davis, N. (1984). « Abortion and Self-Defense », ''Philosophy & Public Affairs'', 13(3), pp. 175-207.</ref>. Davis soutient que la relation entre la femme enceinte et le fœtus est ''sui generis'' et ne peut être assimilée aux cas ordinaires de légitime défense. Le fœtus n'est pas un agresseur au sens ordinaire, puisqu'il n'a ni volonté ni intention hostile ; et pourtant sa présence peut menacer la santé ou la vie de la femme. Davis développe une analyse nuancée qui cherche à articuler, sans les assimiler, les catégories de l'agression, de la menace innocente et du conflit de droits. La question du consentement se pose également dans les cas de viol. De nombreuses positions restrictives admettent une exception en pareil cas. Mais pourquoi ? Si le fœtus est vraiment une personne innocente, pourquoi les circonstances de sa conception affecteraient-elles son droit à la vie ? Cette interrogation révèle des tensions internes aux positions restrictives, et a nourri une littérature spécifique sur le viol, le consentement et la responsabilité causale<ref>Mackenzie, C. (1992). « Abortion and Embodiment », ''Australasian Journal of Philosophy'', 70(2), pp. 136-155.</ref>. ==== Avortement tardif ==== L'avortement tardif, pratiqué après le seuil de viabilité, soulève des préoccupations distinctes. À mesure que la grossesse avance, le fœtus acquiert progressivement des capacités physiologiques et neurologiques plus développées, et peut potentiellement survivre hors de l'utérus avec assistance médicale. Les faits empiriques sur lesquels s'appuie cette gradation sont toutefois plus incertains qu'on ne le pense souvent. La question de la douleur fœtale, en particulier, a été abondamment discutée. Un premier rapport du ''Royal College of Obstetricians and Gynaecologists'' publié en 2010 concluait que le fœtus ne possédait pas, avant vingt-quatre semaines, les connexions neuronales nécessaires à l'expérience de la douleur au sens plein. Une actualisation de 2022 a confirmé cette prudence : les réseaux cérébraux impliqués dans la perception de la douleur sont en cours de développement à vingt-quatre semaines, mais leur fonctionnalité n'est pas encore pleinement établie, et les repères neurophysiologiques les plus solides suggèrent plutôt la période de vingt-huit à trente semaines pour une perception douloureuse au sens élaboré<ref>Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice'', Londres, RCOG, synthèse exécutive et sections sur les corrélats neurophysiologiques de la nociception et de la conscience.</ref>. L'article philosophique sérieux sur l'avortement tardif doit donc résister à la tentation de présenter la capacité fœtale à souffrir comme une donnée acquise et de la convertir trop vite en argument moral. La question de la viabilité, elle aussi, a fait l'objet d'un usage juridique important. L'arrêt ''Roe v. Wade'' (1973) de la Cour suprême des États-Unis, désormais renversé, fixait la viabilité autour de vingt-quatre à vingt-huit semaines et associait ce seuil à un intérêt de l'État croissant à protéger la vie potentielle du fœtus<ref>''Roe v. Wade'', 410 U.S. 113 (1973), partie X de l'opinion du juge Blackmun.</ref>. La position « gradualiste » qui en résulte fait face à une objection classique : le développement du fœtus est continu, sans points de rupture naturels évidents. Si le fœtus de vingt-quatre semaines a des droits significatifs, pourquoi pas celui de vingt-trois semaines et six jours ? Cette difficulté, qu'on rapproche parfois du paradoxe sorite, n'est pas propre à la bioéthique et affecte toute tentative de tracer une ligne dans un processus graduel ; elle ne suffit pourtant pas à disqualifier un seuil légal raisonnablement motivé. ==== Avortement sélectif et enjeux du handicap ==== L'avortement sélectif, fondé sur des caractéristiques du fœtus telles que le sexe, des anomalies génétiques ou des pathologies diagnostiquées, soulève des questions éthiques distinctes. Beaucoup de ceux qui soutiennent un droit général à l'avortement peuvent s'inquiéter des implications de l'avortement sélectif selon le sexe, tel qu'il est pratiqué dans certaines sociétés caractérisées par une préférence marquée pour les garçons. L'avortement des fœtus diagnostiqués avec des anomalies génétiques, au premier rang desquelles la trisomie 21, a suscité un débat spécifique, que la littérature anglophone désigne comme la critique du dépistage prénatal formulée au nom des droits des personnes handicapées (''disability rights critique of prenatal testing''). Des auteurs comme Adrienne Asch et Erik Parens ont soutenu que l'interruption quasi systématique des grossesses après un diagnostic de trisomie 21 exprime, puis renforce, une dévalorisation culturelle du handicap, et risque d'être vécue comme un jugement collectif porté sur l'existence des personnes handicapées elles-mêmes<ref>Parens, E. et Asch, A. (éds.) (2000). ''Prenatal Testing and Disability Rights'', Washington, Georgetown University Press, en particulier l'introduction pp. 3-43 et l'essai d'Adrienne Asch pp. 234-258.</ref>. La réplique libérale, formulée par Bonnie Steinbock ou Frances Kamm, consiste à distinguer l'acte individuel d'avorter, qui n'implique pas nécessairement un jugement négatif sur les personnes handicapées, et une politique publique qui valoriserait implicitement une société sans handicap<ref>Kamm, F. M. (1992). ''Creation and Abortion'', New York, Oxford University Press, chapitre 5 ; Steinbock, B. (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e éd., New York, Oxford University Press, chapitre 6.</ref>. Le débat illustre une tension propre aux politiques reproductives : une liberté individuelle peut produire, statistiquement, une norme sociale implicite qui infléchit les choix ultérieurs. === Dimension politique et juridique === ==== Le cadre juridique français ==== En France, l'interruption volontaire de grossesse a été dépénalisée par la loi du 17 janvier 1975, dite loi Veil, initialement pour une période expérimentale de cinq ans, puis pérennisée par la loi du 31 décembre 1979. Plusieurs réformes ont ensuite étendu son régime : la loi du 4 juillet 2001 relative à l'interruption volontaire de grossesse et à la contraception, portée par Élisabeth Guigou, a porté le délai légal de dix à douze semaines de grossesse et assoupli les conditions d'accès pour les mineures ; la loi du 2 mars 2022, dite loi Gaillot, a porté ce délai à quatorze semaines et étendu aux sages-femmes la possibilité de pratiquer l'IVG instrumentale<ref>Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse ; loi n° 79-1204 du 31 décembre 1979 ; loi n° 2001-588 du 4 juillet 2001 ; loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Le 8 mars 2024, la France est devenue le premier État à constitutionnaliser explicitement le recours à l'avortement. La loi constitutionnelle n° 2024-200 a inscrit à l'article 34 de la Constitution la disposition suivante : « La loi détermine les conditions dans lesquelles s'exerce la liberté garantie à la femme d'avoir recours à une interruption volontaire de grossesse »<ref>Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse, ''Journal officiel de la République française'', n° 58 du 9 mars 2024.</ref>. Cette rédaction est volontairement prudente. Elle ne proclame pas un « droit » à l'avortement au sens des droits-libertés fondamentaux, mais elle reconnaît une « liberté garantie » dont le législateur fixe les conditions d'exercice. Ce choix rédactionnel a fait l'objet de débats juridiques entre ceux qui y voient une protection désormais solide et ceux qui estiment qu'il laisse au législateur une marge de régulation importante. La philosophie politique française a accompagné ce mouvement par des travaux spécifiques. Le discours de Simone Veil du 26 novembre 1974 devant l'Assemblée nationale, resté célèbre, insiste sur le caractère tragique de l'avortement et sur la nécessité d'éviter qu'il devienne banal, tout en reconnaissant le droit des femmes à ne plus être punies pour y recourir. Geneviève Fraisse a donné à cette réflexion une ampleur conceptuelle en examinant, dans ''Du consentement'' (2007), les paradoxes d'une notion trop vite considérée comme transparente : un consentement dépourvu de pouvoir réel de négociation n'est pas un véritable consentement, et la liberté de disposer de son corps suppose des conditions sociales, économiques et politiques qui excèdent la seule décision individuelle<ref>Fraisse, G. (2007). ''Du consentement'', Paris, Le Seuil, en particulier chapitres 1 et 4.</ref>. Élisabeth Badinter, dans ''Le Conflit : la femme et la mère'' (2010), a proposé pour sa part une interrogation sur les représentations contemporaines de la maternité et sur les nouvelles formes d'injonction sociale qui pèsent sur les femmes en âge de procréer<ref>Badinter, É. (2010). ''Le Conflit : la femme et la mère'', Paris, Flammarion.</ref>. ==== Le cadre juridique états-unien ==== Aux États-Unis, l'architecture constitutionnelle du droit à l'avortement a connu une profonde évolution entre 1973 et 2022. L'arrêt ''Roe v. Wade'' (1973) avait reconnu un droit à l'avortement fondé sur le droit à la vie privée implicitement contenu dans le Quatorzième Amendement, en construisant un cadre trimestriel : droit quasi libre au premier trimestre, possibilité de régulation au deuxième, protection plus large de la « vie potentielle » après la viabilité<ref>''Roe v. Wade'', 410 U.S. 113 (1973), opinion de la Cour rédigée par le juge Blackmun.</ref>. L'arrêt ''Planned Parenthood v. Casey'' (1992) a réaffirmé le droit constitutionnel à l'avortement tout en abandonnant le cadre trimestriel au profit d'un critère du « fardeau indu » (''undue burden''), qui autorisait les États à réglementer l'accès à l'avortement avant la viabilité pour peu qu'ils n'imposent pas d'obstacle excessif<ref>''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992).</ref>. L'arrêt ''Dobbs v. Jackson Women's Health Organization'' (2022) a renversé ''Roe'' et ''Casey'', en jugeant que la Constitution des États-Unis ne protège aucun droit à l'avortement et en renvoyant la réglementation de cette question aux législatures des États<ref>''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022), opinion de la Cour rédigée par le juge Alito.</ref>. Cette décision a reconfiguré le paysage juridique américain : plusieurs États ont adopté des législations restrictives, d'autres ont inscrit le droit à l'avortement dans leur constitution locale, et de nouvelles questions juridiques sont apparues, concernant notamment les déplacements de patientes d'un État à l'autre et la pénalisation de la prescription à distance. Philosophiquement, le débat contemporain aux États-Unis tend à se déplacer depuis la question du statut du fœtus vers celle de la cohérence fédérale, de l'égalité entre citoyens selon leur État de résidence, et des conflits de lois. ==== Libéralisme politique et avortement ==== La question de l'avortement confronte le libéralisme politique à l'une de ses difficultés les plus vives. Comment l'État peut-il réguler la matière dans des sociétés pluralistes traversées par des désaccords moraux profonds et, en un sens important, raisonnables ? John Rawls, dans ''Political Liberalism'' (1993), distingue entre les « doctrines compréhensives », religieuses, philosophiques ou morales, que partagent les citoyens, et les « valeurs politiques » partagées par tous dans le cadre de la coopération sociale. Rawls soutient que les questions constitutionnelles essentielles ne doivent être tranchées qu'à partir de ces dernières. Dans une note célèbre de l'introduction à l'édition brochée de 1996, Rawls écrit que si l'on ne considère que trois valeurs politiques, à savoir le respect dû à la vie humaine, la reproduction ordonnée de la société et l'égalité des femmes comme citoyennes égales, « tout équilibre raisonnable de ces trois valeurs donnera à une femme un droit qualifié à mettre fin à sa grossesse au cours du premier trimestre »<ref>Rawls, J. (1996). ''Political Liberalism'', édition brochée, New York, Columbia University Press, introduction, note 32, p. 243.</ref>. Rawls reconnaît lui-même que cette remarque rapide ne constitue pas une démonstration, mais une illustration de la façon dont la raison publique pourrait trancher la question. La position rawlsienne a fait l'objet de critiques importantes. Ses adversaires lui reprochent de présupposer précisément ce qu'il devrait démontrer : pour juger que la reproduction ordonnée et l'égalité des femmes l'emportent sur le respect dû à la vie humaine, il faut avoir déjà décidé que le statut moral du fœtus n'est pas celui d'une personne. Si le fœtus est une personne, alors la protection de sa vie est une question de justice fondamentale que l'État ne peut écarter au nom de la raison publique. Michael Sandel et d'autres communautariens ont construit sur cette base une critique générale du libéralisme rawlsien<ref>Sandel, M. J. (1984). « Morality and the Liberal Ideal », ''The New Republic'', 7 mai ; Sandel, M. J. (1996). ''Democracy's Discontent'', Cambridge (Mass.), Harvard University Press, chapitre 3.</ref>. ==== Féminisme et avortement ==== Les approches féministes relient l'avortement à des structures plus larges : contrôle patriarcal sur le corps et la sexualité, division sexuée du travail, inégalités économiques, organisation sociale de la reproduction. Le débat féministe ne forme pas un bloc homogène : il comprend plusieurs traditions théoriques qui divergent sur les concepts mobilisés, les priorités politiques et la place qu'il convient d'accorder à l'analyse du corps et à celle du travail. '''La tradition existentialiste et phénoménologique.''' Simone de Beauvoir, dans ''Le Deuxième Sexe'' (1949), consacre au chapitre « La mère » un développement dense sur l'avortement clandestin tel qu'il se pratiquait dans la France d'avant 1975. Beauvoir décrit la pratique comme un « crime » inventé par les sociétés patriarcales à l'usage exclusif des femmes, et analyse la contradiction d'une société qui refuse à celles-ci la maîtrise de leur fécondité tout en leur imputant seules la charge morale de l'enfant à naître<ref>Beauvoir, S. de (1949/1976). ''Le Deuxième Sexe'', t. II, Paris, Gallimard, coll. « Folio essais », chapitre VI, pp. 334-371.</ref>. Son analyse relie la condition reproductive à la situation existentielle globale des femmes, dans une perspective qui a durablement marqué le féminisme francophone. '''La tradition matérialiste française.''' Christine Delphy, dans ''L'Ennemi principal'' (recueils parus en 1998 et 2001), développe un féminisme matérialiste pour lequel l'oppression des femmes repose sur un « mode de production domestique » où le travail reproductif, incluant la grossesse, l'accouchement, l'allaitement et le soin aux jeunes enfants, est extorqué gratuitement dans le cadre familial<ref>Delphy, C. (1998 et 2001). ''L'Ennemi principal'', 2 vol., Paris, Syllepse, en particulier t. I, chapitre 1, « L'ennemi principal ».</ref>. Dans cette perspective, l'interdiction ou la limitation de l'avortement n'est pas un simple conflit de droits abstraits : c'est un instrument de contrôle de la force de travail reproductive. Colette Guillaumin, dans ''Sexe, race et pratique du pouvoir'' (1992), radicalise cette analyse en parlant d'« appropriation » matérielle des femmes, qui ne porte pas sur tel ou tel service particulier mais sur la personne entière dans ses capacités de reproduction<ref>Guillaumin, C. (1992/2016). ''Sexe, race et pratique du pouvoir. L'idée de nature'', Donnemarie-Dontilly, éditions iXe, première partie, chapitres 1 et 2.</ref>. Nicole-Claude Mathieu, dans ''L'Anatomie politique'' (1991), complète ce dispositif en montrant comment le corps féminin est socialement produit et naturalisé, ce qui rend invisible le caractère politique des contraintes reproductives<ref>Mathieu, N.-C. (1991). ''L'Anatomie politique. Catégorisations et idéologies du sexe'', Paris, Côté-femmes, en particulier les chapitres III et IV.</ref>. Ces travaux offrent au débat sur l'avortement une grille d'analyse qui ne se confond ni avec le libéralisme des droits individuels ni avec l'éthique du care : l'avortement y est traité comme un enjeu dans le rapport social entre les sexes. '''La tradition anglophone des droits.''' Catharine MacKinnon, dans « Reflections on Sex Equality Under Law » (1991), relie la criminalisation de l'avortement à un contexte historique où les femmes ont été privées du contrôle sur leur propre corps et leur propre sexualité, et soutient que le droit à l'avortement est une condition de l'égalité réelle des femmes<ref>MacKinnon, C. A. (1991). « Reflections on Sex Equality Under Law », ''Yale Law Journal'', 100(5), pp. 1281-1328, en particulier pp. 1308-1315.</ref>. Le féminisme libéral, représenté entre autres par Martha Nussbaum, insiste davantage sur l'autonomie individuelle et le consentement dans un cadre plus classiquement libéral<ref>Nussbaum, M. C. (1999). ''Sex and Social Justice'', New York, Oxford University Press, chapitre 9.</ref>. '''L'éthique du care et ses prolongements.''' Carol Gilligan et Nel Noddings déplacent l'analyse vers les relations concrètes, les responsabilités contextuelles et le réseau d'interdépendances dans lequel la grossesse s'inscrit<ref>Gilligan, C. (1982). ''In a Different Voice: Psychological Theory and Women's Development'', Cambridge (Mass.), Harvard University Press, chapitre 3 ; Noddings, N. (1984). ''Caring: A Feminine Approach to Ethics and Moral Education'', Berkeley, University of California Press.</ref>. Certaines féministes, comme Celia Wolf-Devine, s'interrogent par ailleurs sur la compatibilité entre une éthique du care centrée sur la vulnérabilité et une défense inconditionnelle du droit à l'avortement<ref>Wolf-Devine, C. (1989). « Abortion and the 'Feminine Voice' », ''Public Affairs Quarterly'', 3(3), pp. 81-97.</ref>. '''Tensions internes.''' Des courants féministes critiques du capacitisme mettent en garde contre la transformation du droit à l'avortement en norme sociale implicite susceptible d'exercer une pression de fait sur les parents d'enfants potentiellement porteurs d'un handicap. Loin de constituer une position homogène, le féminisme offre au débat un éventail de perspectives qui s'enrichissent mutuellement, parfois s'opposent, et résistent ensemble à la réduction du problème à une pure question métaphysique sur le statut du fœtus. ==== Dimensions sociales et accès effectif à l'avortement ==== La philosophie morale analytique se concentre souvent sur le cas-type : une femme adulte, informée, insérée dans un système de soins fonctionnel, disposant d'un accès effectif à une clinique. Or la réalité sociologique de l'avortement montre que ces conditions sont loin d'être universellement réunies, et que les débats normatifs gagnent en précision quand ils tiennent compte de la matérialité des parcours. L'histoire française avant la loi Veil illustre l'écart entre la règle pénale et la pratique sociale. Les estimations pour les années 1960 évaluent entre 300 000 et 800 000 le nombre d'avortements clandestins annuels en France, pratiqués par des « faiseuses d'anges », par des médecins complaisants moyennant rémunération, ou par des voyages à l'étranger dans les pays qui avaient dépénalisé plus tôt (Royaume-Uni à partir de 1967, Pays-Bas dans les années 1970)<ref>Pavard, B. (2012). ''Si je veux, quand je veux. Contraception et avortement dans la société française (1956-1979)'', Rennes, Presses universitaires de Rennes, introduction et chapitres 1 et 4.</ref>. Ces pratiques n'étaient pas distribuées également selon la classe sociale : les femmes aisées trouvaient plus facilement des filières sûres, tandis que les femmes des milieux populaires subissaient davantage les complications médicales des avortements non encadrés. Le ''Manifeste des 343'' publié dans ''Le Nouvel Observateur'' le 5 avril 1971, et le procès de Bobigny en 1972, plaidé par Gisèle Halimi, ont rendu publiques ces inégalités et contribué à la mobilisation qui a préparé la loi de 1975<ref>Halimi, G. (1973). ''La cause des femmes'', Paris, Grasset ; voir également Halimi, G. (1973). ''Avortement : une loi en procès. L'affaire de Bobigny'', Paris, Gallimard.</ref>. La dépénalisation n'a pas abolit les inégalités d'accès. Les enquêtes menées par l'Institut national d'études démographiques et par l'Institut national de la santé et de la recherche médicale ont montré que l'accès à l'IVG varie selon les territoires, les ressources économiques, l'âge, la situation familiale et l'information disponible. La fermeture progressive de maternités et de centres d'orthogénie, la concentration de l'offre dans les grandes agglomérations, et les tensions sur les effectifs médicaux hospitaliers produisent des « déserts » où le délai légal peut devenir pratiquement infranchissable. L'objection de conscience, que le Code de la santé publique reconnaît aux médecins et aux autres professionnels de santé, accentue cette inégalité territoriale quand elle se concentre dans certaines zones<ref>Haute Autorité de Santé (2018). ''Interruption volontaire de grossesse par méthode médicamenteuse'', recommandation de bonne pratique, Saint-Denis-La-Plaine, HAS.</ref>. Ces constats matériels ont une portée philosophique. Ils montrent d'abord qu'un « droit » à l'avortement purement formel peut coexister avec des obstacles d'accès qui vident ce droit de son contenu, comme Amartya Sen l'a souligné à propos des libertés fondamentales en général : une capacité effective exige des conditions sociales que le seul statut juridique ne garantit pas<ref>Sen, A. (1992/2000). ''Repenser l'inégalité'', trad. fr. Paul Chemla, Paris, Le Seuil, chapitres 3 et 5.</ref>. Ils rappellent ensuite que l'interdiction de l'avortement ne suspend jamais la pratique : elle la déplace vers la clandestinité et en alourdit le coût pour les personnes les moins bien dotées en ressources. Ils invitent enfin à articuler la question morale abstraite sur le statut du fœtus avec une question de justice sociale sur la répartition réelle des conditions dans lesquelles les décisions reproductives se prennent. === Approches de philosophie morale appliquée === ==== Conséquentialisme et avortement ==== Les approches conséquentialistes évaluent la moralité de l'avortement à partir de ses conséquences globales. Un utilitariste se demandera si l'avortement, dans telle circonstance, maximise le bien-être global ou minimise la souffrance. Les conclusions atteintes dépendent de la variante retenue. L'utilitarisme hédoniste classique, inspiré de Bentham et Mill, met au centre la capacité à éprouver plaisir et douleur ; aux stades précoces de la grossesse, où le fœtus ne possède pas, selon toute vraisemblance, les capacités neurophysiologiques d'une telle expérience, cet utilitarisme inclinera vers une position permissive, tout en intégrant les effets secondaires sur la femme, la famille et la société. L'utilitarisme des préférences défendu par Peter Singer aboutit à une position encore plus permissive aux stades précoces : le fœtus ne possédant pas de préférences portant sur son avenir, le tuer ne frustre aucune préférence et n'est donc pas comparable au meurtre d'un adulte doté de telles préférences<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, pp. 138-152.</ref>. Un conséquentialisme non utilitariste, qui prendrait au sérieux la valeur intrinsèque de la vie humaine comme type, produirait des verdicts plus restrictifs ; un utilitarisme des règles, enfin, évaluerait moins chaque avortement particulier que les effets agrégés de règles générales d'autorisation ou d'interdiction. L'objection la plus forte adressée à l'utilitarisme des préférences ne porte pas sur son formalisme mais sur ses implications en aval. Si ce qui rend le meurtre moralement mauvais consiste dans la frustration de préférences actuelles orientées vers l'avenir, alors le meurtre d'un dormeur temporairement inconscient, ou celui d'un nouveau-né, devrait être moralement moins grave que celui d'un adulte éveillé, conclusion que Singer assume en partie et que la plupart des autres auteurs rejettent. Plus largement, toutes les variantes conséquentialistes doivent prendre en compte des effets qu'il est empiriquement difficile d'évaluer : impact psychologique sur les femmes, effets sur la famille existante, conséquences sociales des politiques publiques d'avortement, impact différencié selon la classe et le territoire. Ces calculs sont rarement univoques, et leur résultat dépend d'hypothèses empiriques souvent discutées. ==== Éthique de la vertu et avortement ==== L'éthique de la vertu, plutôt que de se concentrer sur des règles ou des conséquences, s'intéresse au caractère de l'agent moral et aux vertus qu'il manifeste ou néglige. Rosalind Hursthouse, dans « Virtue Theory and Abortion » (1991), propose une application novatrice de cette approche au cas de l'avortement<ref>Hursthouse, R. (1991). « Virtue Theory and Abortion », ''Philosophy & Public Affairs'', 20(3), pp. 223-246.</ref>. Hursthouse soutient que, même en laissant ouverte la question du statut moral du fœtus, on peut juger moralement une décision d'avorter selon qu'elle exprime la vertu ou le vice dans la situation concrète de l'agent. Avorter par simple commodité, pour ne pas reporter un voyage, relève selon elle d'une légèreté contraire aux vertus que l'on attend d'une personne prenant au sérieux le prix de la vie humaine et la portée du geste accompli. Avorter dans des circonstances de pauvreté extrême, après un viol, ou parce que la santé de la mère est gravement menacée, relève en revanche d'un jugement pratique raisonnable qui exprime la prudence et le courage. L'intérêt de cette approche est de réintroduire dans l'évaluation morale des dimensions que les théories des droits ou les utilitarismes tendent à évacuer : la qualité du raisonnement pratique, le rapport de la personne à ses propres valeurs, le sens du geste dans une trajectoire de vie. Sa limite est qu'elle fournit difficilement une base à une législation générale : on ne peut pas pénaliser une femme au motif que son avortement exprime un vice, si d'autres peuvent moralement avorter dans des circonstances analogues. ==== Éthique du care ==== L'éthique du care, d'abord développée par Carol Gilligan dans ''In a Different Voice'' (1982) puis systématisée par Nel Noddings et Joan Tronto, insiste sur les relations, les responsabilités contextuelles et l'attention concrète aux besoins, plutôt que sur des principes abstraits et des droits individuels<ref>Gilligan, C. (1982). ''In a Different Voice'', Cambridge (Mass.), Harvard University Press, chapitre 3 ; Noddings, N. (1984). ''Caring: A Feminine Approach to Ethics and Moral Education'', Berkeley, University of California Press ; Tronto, J. (1993/2009). ''Un monde vulnérable. Pour une politique du care'', trad. fr. Hervé Maury, Paris, La Découverte.</ref>. Appliquée à l'avortement, cette approche souligne l'importance de considérer la situation concrète des femmes concernées : relations existantes, responsabilités envers d'autres personnes, capacité matérielle et affective à accueillir un enfant, réseau de soutien disponible. L'éthique du care refuse l'idée qu'il existerait une règle unique applicable à tous les cas d'avortement, et insiste sur le jugement contextuel attentif aux singularités de chaque situation. Elle conduit à valoriser l'accompagnement, la délibération partagée et la reconnaissance de la fragilité humaine. On a parfois opposé l'éthique du care à l'éthique des droits en suggérant que la première serait moins attachée aux principes et donc moins rigoureuse. Les théoriciennes du care récusent cette opposition : leur démarche élabore ses propres critères normatifs, fondés sur la reconnaissance de la vulnérabilité et de l'interdépendance. Elles objectent également que le langage des droits, appliqué à la grossesse, peut aboutir à opposer artificiellement des intérêts qui sont en réalité profondément entrelacés, et à masquer la dimension relationnelle qui structure l'expérience réelle de la maternité. === Considérations méthodologiques === Le débat sur l'avortement illustre plusieurs caractéristiques propres à la philosophie morale appliquée. Trois d'entre elles méritent d'être soulignées. La première est l'importance des ''intuitions morales'' pré-théoriques dans l'argumentation. Beaucoup d'arguments avancés de part et d'autre procèdent en testant des principes généraux contre nos jugements spontanés dans des cas hypothétiques. Les exemples de Thomson (le violoniste, les graines de personnes), ceux de Foot (les problèmes du tramway) ou ceux de Kamm (le trolley réexaminé sous diverses variantes) cherchent à isoler les facteurs qui déterminent nos intuitions pour en tirer des principes articulés. Cette méthode, héritée de la pratique philosophique de l'équilibre réfléchi (''reflective equilibrium'') rawlsien, ne va pas sans difficultés : la fiabilité des intuitions, leur variation selon les cultures et les contextes, et leur résistance à la théorisation font l'objet d'une discussion méthodologique soutenue<ref>Rawls, J. (1971/1987). ''Théorie de la justice'', trad. fr. Catherine Audard, Paris, Le Seuil, §§ 4 et 9.</ref>. La seconde est la façon dont des ''désaccords empiriques'' affectent les conclusions normatives. Les questions relatives à la capacité fœtale de sentir la douleur, au degré de conscience à différents stades, aux effets psychologiques réels de l'avortement sur les femmes, aux conséquences sociales des législations restrictives, sont des questions empiriques dont la résolution, même partielle, réoriente les jugements moraux. Cette interpénétration du factuel et du normatif caractérise la philosophie morale appliquée en général, et l'éthique de l'avortement en particulier. La troisième est ce que John Rawls appelle le « fardeau du jugement ». Même des personnes raisonnables et bien informées, usant des mêmes méthodes de raisonnement moral, peuvent parvenir à des conclusions opposées sur l'avortement. Cette possibilité d'un désaccord raisonnable pose un problème distinct : celui de la régulation publique des questions sur lesquelles un accord complet ne semble pas atteignable. Les sociétés démocratiques pluralistes ont développé des stratégies variées, parmi lesquelles la constitutionnalisation, la délégation au législateur, le référendum ou l'autonomie des échelons locaux, dont aucune n'est moralement neutre. === Conclusion === L'éthique de l'avortement constitue l'un des domaines les plus travaillés de la philosophie morale contemporaine. Le débat met en jeu des tensions qui traversent toute la philosophie pratique. Une première tension oppose deux ontologies de l'humain : celle de l'organisme humain, qui tient que chacun d'entre nous a été embryon et que la continuité biologique suffit à fonder une identité morale constante, et celle de la personne psychologique, qui tient que la personne s'élabore à partir de capacités de conscience, de raison et de continuité mentale qui n'apparaissent que progressivement. Une deuxième tension oppose le droit à la vie et le droit sur son propre corps. Même en accordant à l'embryon ou au fœtus un droit à la vie, il reste à déterminer dans quelle mesure ce droit fonde une obligation pour la femme enceinte de lui prêter son corps, dans quelles conditions et à quel prix. Une troisième tension oppose la morale individuelle et la législation publique. On peut juger un avortement particulier moralement douteux sans pour autant soutenir qu'il doit être pénalement réprimé ; on peut juger certaines législations restrictives injustes sans pour autant penser que tout avortement est également souhaitable. Une quatrième tension oppose le principe abstrait et le jugement contextuel. Les théories des droits et les conséquentialismes fournissent des cadres généraux ; les éthiques de la vertu et du care insistent sur l'irréductibilité des situations concrètes. La pratique réelle du jugement moral, médical et juridique mobilise nécessairement les deux registres. Une cinquième tension, enfin, oppose l'énoncé formel d'un droit et ses conditions sociales d'exercice. Les analyses matérialistes et les travaux sociologiques rappellent qu'un droit à l'avortement qui n'est pas adossé à des structures de soins accessibles, à des professionnels formés et à une information disponible reste, pour une partie des femmes, une promesse sans contenu. La philosophie morale gagne à dialoguer avec ces analyses au lieu d'opposer l'abstraction conceptuelle à la réalité empirique. La philosophie ne tranche pas ces tensions au sens où elle rendrait un verdict que toutes les parties accepteraient. Elle les clarifie, les articule, teste la cohérence des positions en présence, expose leurs présupposés, et rend possible une délibération plus précise. Pour le citoyen, le législateur, le médecin ou le juge, elle offre des outils conceptuels qui ne dispensent pas du jugement pratique mais qui l'informent. Si le désaccord subsiste, il n'est pas pour autant arbitraire : il peut être mieux compris, mieux exposé et mieux respecté, ce qui n'est pas un mince résultat dans une société démocratique. == Références == {{Références|colonnes = 2}} == Bibliographie == === Références citées dans l'article === ==== Articles et ouvrages fondateurs en éthique analytique ==== * Boonin, David (2002). ''A Defense of Abortion''. Cambridge : Cambridge University Press. * Davis, Nancy (1984). « Abortion and Self-Defense ». ''Philosophy & Public Affairs'', 13(3), 175-207. * Finnis, John (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson ». ''Philosophy & Public Affairs'', 2(2), 117-145. * Foot, Philippa (1967). « The Problem of Abortion and the Doctrine of the Double Effect ». ''Oxford Review'', 5, 5-15. * Hursthouse, Rosalind (1991). « Virtue Theory and Abortion ». ''Philosophy & Public Affairs'', 20(3), 223-246. * Kamm, Frances Myrna (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy''. New York : Oxford University Press. * Kamm, Frances M. (2023). « Abortion Bans and Cruelty ». ''Journal of Practical Ethics'', 11(1). * Marquis, Don (1989). « Why Abortion is Immoral ». ''The Journal of Philosophy'', 86(4), 183-202. * McIntyre, Alison (2001). « Doing Away with Double Effect ». ''Ethics'', 111(2), 219-255. * McMahan, Jeff (2002). ''The Ethics of Killing: Problems at the Margins of Life''. New York : Oxford University Press. * Quinn, Warren S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect ». ''Philosophy & Public Affairs'', 18(4), 334-351. * Singer, Peter (1979/2011). ''Practical Ethics'', 3e édition. Cambridge : Cambridge University Press. * Thomson, Judith Jarvis (1971). « A Defense of Abortion ». ''Philosophy & Public Affairs'', 1(1), 47-66. * Tooley, Michael (1972). « Abortion and Infanticide ». ''Philosophy & Public Affairs'', 2(1), 37-65. * Warren, Mary Anne (1973). « On the Moral and Legal Status of Abortion ». ''The Monist'', 57(1), 43-61. ==== Positions restrictives et critique du gradualisme ==== * Beckwith, Francis J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice''. Cambridge : Cambridge University Press. * George, Robert P. et Christopher Tollefsen (2008). ''Embryo: A Defense of Human Life''. New York : Doubleday. * Kaczor, Christopher (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice''. New York : Routledge. * Lee, Patrick (1996). ''Abortion and Unborn Human Life''. Washington : Catholic University of America Press. ==== Féminismes et études de genre ==== * Badinter, Élisabeth (2010). ''Le Conflit : la femme et la mère''. Paris : Flammarion. * Beauvoir, Simone de (1949/1976). ''Le Deuxième Sexe'', t. II. Paris : Gallimard, coll. « Folio essais ». * Delphy, Christine (1998 et 2001). ''L'Ennemi principal'', 2 vol. Paris : Syllepse. * Fraisse, Geneviève (2007). ''Du consentement''. Paris : Le Seuil. * Gilligan, Carol (1982). ''In a Different Voice: Psychological Theory and Women's Development''. Cambridge (Mass.) : Harvard University Press. * Guillaumin, Colette (1992/2016). ''Sexe, race et pratique du pouvoir. L'idée de nature''. Donnemarie-Dontilly : éditions iXe. * Halimi, Gisèle (1973). ''Avortement : une loi en procès. L'affaire de Bobigny''. Paris : Gallimard. * Halimi, Gisèle (1973). ''La cause des femmes''. Paris : Grasset. * Mackenzie, Catriona (1992). « Abortion and Embodiment ». ''Australasian Journal of Philosophy'', 70(2), 136-155. * MacKinnon, Catharine A. (1991). « Reflections on Sex Equality Under Law ». ''Yale Law Journal'', 100(5), 1281-1328. * Mathieu, Nicole-Claude (1991). ''L'Anatomie politique. Catégorisations et idéologies du sexe''. Paris : Côté-femmes. * Noddings, Nel (1984). ''Caring: A Feminine Approach to Ethics and Moral Education''. Berkeley : University of California Press. * Nussbaum, Martha C. (1999). ''Sex and Social Justice''. New York : Oxford University Press. * Tronto, Joan (1993/2009). ''Un monde vulnérable. Pour une politique du care''. Trad. fr. Hervé Maury. Paris : La Découverte. * Wolf-Devine, Celia (1989). « Abortion and the 'Feminine Voice' ». ''Public Affairs Quarterly'', 3(3), 81-97. ==== Histoire sociale et approche sociologique ==== * Pavard, Bibia (2012). ''Si je veux, quand je veux. Contraception et avortement dans la société française (1956-1979)''. Rennes : Presses universitaires de Rennes. * Haute Autorité de Santé (2018). ''Interruption volontaire de grossesse par méthode médicamenteuse'', recommandation de bonne pratique. Saint-Denis-La-Plaine : HAS. * Sen, Amartya (1992/2000). ''Repenser l'inégalité''. Trad. fr. Paul Chemla. Paris : Le Seuil. ==== Philosophie politique et juridique ==== * Rawls, John (1996). ''Political Liberalism'', édition brochée. New York : Columbia University Press. * Sandel, Michael J. (1984). « Morality and the Liberal Ideal ». ''The New Republic'', 7 mai. * Sandel, Michael J. (1996). ''Democracy's Discontent: America in Search of a Public Philosophy''. Cambridge (Mass.) : Harvard University Press. ==== Bioéthique, handicap, enfance à naître ==== * Parens, Erik et Adrienne Asch (éds.) (2000). ''Prenatal Testing and Disability Rights''. Washington : Georgetown University Press. * Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice''. Londres : RCOG. * Steinbock, Bonnie (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e édition. New York : Oxford University Press. ==== Textes classiques cités ==== * Aquin, Thomas d' (1265-1273). ''Somme théologique'', IIa-IIae, question 64, trad. fr. sous la direction du P. A.-M. Roguet, Paris : Éditions du Cerf, 1984. * Locke, John (1689/2001). ''Essai philosophique concernant l'entendement humain'', trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris : Vrin. * Rawls, John (1971/1987). ''Théorie de la justice''. Trad. fr. Catherine Audard. Paris : Le Seuil. ==== Textes juridiques ==== * Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse (loi Veil). * Loi n° 2001-588 du 4 juillet 2001 relative à l'interruption volontaire de grossesse et à la contraception. * Loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement (loi Gaillot). * Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse. * ''Roe v. Wade'', 410 U.S. 113 (1973). * ''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992). * ''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022). * ''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). === Lectures complémentaires === ==== Ouvrages généraux et anthologies ==== * Baird, Robert M. et Stuart E. Rosenbaum (éds.) (2001). ''The Ethics of Abortion: Pro-Life vs. Pro-Choice'', 3e édition. Buffalo (NY) : Prometheus Books. * Beckwith, Francis J. et Louis P. Pojman (éds.) (1998). ''The Abortion Controversy: 25 Years After Roe v. Wade''. Belmont (CA) : Wadsworth Publishing. * Cohen, Marshall, Thomas Nagel et Thomas Scanlon (éds.) (1974). ''The Rights and Wrongs of Abortion''. Princeton : Princeton University Press. * Feinberg, Joel (éd.) (1984). ''The Problem of Abortion'', 2e édition. Belmont (CA) : Wadsworth Publishing. * Kuhse, Helga et Peter Singer (éds.) (1999). ''Bioethics: An Anthology''. Oxford : Blackwell Publishers. * LaFollette, Hugh (éd.) (2002). ''Ethics in Practice: An Anthology'', 2e édition. Oxford : Blackwell Publishers. * Steinbock, Bonnie (éd.) (2007). ''The Oxford Handbook of Bioethics''. New York : Oxford University Press. * Sumner, L. W. (1981). ''Abortion and Moral Theory''. Princeton : Princeton University Press. * Tooley, Michael (1983). ''Abortion and Infanticide''. Oxford : Clarendon Press. * Warren, Mary Anne (1997). ''Moral Status: Obligations to Persons and Other Living Things''. Oxford : Clarendon Press. ==== Éthique de la vertu et philosophie morale ==== * Anscombe, G. E. M. (1958). « Modern Moral Philosophy ». ''Philosophy'', 33(124), 1-19. * Crisp, Roger (éd.) (1996). ''How Should We Live? Essays on the Virtues''. Oxford : Clarendon Press. * Foot, Philippa (2001). ''Natural Goodness''. Oxford : Oxford University Press. * MacIntyre, Alasdair (1981). ''After Virtue''. Notre Dame : University of Notre Dame Press. ==== Conséquentialisme et utilitarisme ==== * Bentham, Jeremy (1789/2011). ''Introduction aux principes de morale et de législation''. Trad. fr. Centre Bentham. Paris : Vrin. * Mill, John Stuart (1863/1988). ''L'Utilitarisme''. Trad. fr. Georges Tanesse. Paris : Flammarion. * Smart, J. J. C. et Bernard Williams (1973). ''Utilitarianism: For and Against''. Cambridge : Cambridge University Press. ==== Déontologie, droit et philosophie politique ==== * Dworkin, Ronald (1993). ''Life's Dominion: An Argument About Abortion, Euthanasia, and Individual Freedom''. New York : Knopf. * Finnis, John (1980). ''Natural Law and Natural Rights''. Oxford : Clarendon Press. * Gewirth, Alan (1978). ''Reason and Morality''. Chicago : University of Chicago Press. * Hart, H. L. A. (1961). ''The Concept of Law''. Oxford : Clarendon Press. * Kant, Immanuel (1785/1994). ''Fondation de la métaphysique des mœurs'', trad. fr. Alain Renaut, Paris : Flammarion. * Nozick, Robert (1974). ''Anarchy, State, and Utopia''. New York : Basic Books. * Raz, Joseph (1986). ''The Morality of Freedom''. Oxford : Clarendon Press. ==== Bioéthique et éthique médicale ==== * Beauchamp, Tom L. et James F. Childress (2012). ''Principles of Biomedical Ethics'', 7e édition. New York : Oxford University Press. * Engelhardt, H. Tristram Jr. (1996). ''The Foundations of Bioethics'', 2e édition. New York : Oxford University Press. * Gillon, Raanan (1986). ''Philosophical Medical Ethics''. Chichester : John Wiley & Sons. * Strong, Carson (1997). ''Ethics in Reproductive and Perinatal Medicine''. New Haven : Yale University Press. ==== Doctrine du double effet ==== * Boyle, Joseph (1980). « Toward Understanding the Principle of Double Effect ». ''Ethics'', 90(4), 527-538. ==== Métaphysique et identité personnelle ==== * Olson, Eric T. (1997). ''The Human Animal: Personal Identity Without Psychology''. New York : Oxford University Press. * Parfit, Derek (1984). ''Reasons and Persons''. Oxford : Oxford University Press. * Wiggins, David (2001). ''Sameness and Substance Renewed''. Cambridge : Cambridge University Press. ==== Autres ==== * MacKinnon, Catharine A. (1987). ''Feminism Unmodified: Discourses on Life and Law''. Cambridge (Mass.) : Harvard University Press. * Schwarz, Stephen D. (1990). ''The Moral Question of Abortion''. Chicago : Loyola University Press. * Sherwin, Susan (1992). ''No Longer Patient: Feminist Ethics and Health Care''. Philadelphia : Temple University Press. === Ressources en ligne et encyclopédies spécialisées === * Kaczor, Christopher (2014). « Abortion ». ''Internet Encyclopedia of Philosophy''. [https://iep.utm.edu/abortion/] * Manninen, Bertha Alvarez (2018). « The Ethics of Abortion ». ''Stanford Encyclopedia of Philosophy''. [https://plato.stanford.edu/entries/abortion/] * ''Routledge Encyclopedia of Philosophy'' (1998). « Abortion, the ethics of ». Londres : Routledge. === Revues spécialisées === ''Bioethics'' (Wiley-Blackwell) ; ''Cambridge Quarterly of Healthcare Ethics'' (Cambridge University Press) ; ''Hastings Center Report'' (The Hastings Center) ; ''Journal of Medical Ethics'' (BMJ Publishing) ; ''Journal of Medicine and Philosophy'' (Oxford University Press) ; ''Kennedy Institute of Ethics Journal'' (Johns Hopkins University Press) ; ''Philosophy & Public Affairs'' (Princeton University Press) ; ''Public Affairs Quarterly'' (Philosophy Documentation Center) ; ''Journal of Practical Ethics'' (Oxford Uehiro Centre) ; ''Nouvelles Questions Féministes'' (Antipodes) ; ''Revue philosophique de la France et de l'étranger'' (PUF) ; ''Les Études philosophiques'' (PUF) ; ''Travail, genre et sociétés'' (La Découverte). {{Autocat}} 3l60udpic4xq9bkyuf5dme5ro3cum98 764911 764910 2026-04-25T00:10:58Z PandaMystique 119061 764911 wikitext text/x-wiki {{DicoPhilo|Avortement}} == Éthique de l'avortement == L'éthique de l'avortement compte parmi les chapitres les plus étudiés et les plus controversés de la philosophie morale contemporaine. Elle questionne le statut moral de l'être humain en développement, l'articulation entre droit à la vie et droit sur son propre corps, la nature de la personne morale, ainsi que la légitimité d'une régulation publique de l'intimité. Cette question traverse les frontières disciplinaires et mobilise la métaphysique, l'éthique normative, la philosophie politique, le droit constitutionnel et la bioéthique. On peut ramener le débat à cinq grands problèmes que l'article examinera tour à tour. Le premier est le problème du statut moral de l'embryon et du fœtus : sont-ils des personnes, des organismes humains, des êtres en devenir ? Le deuxième est le problème de l'autonomie corporelle : même si le fœtus possédait un droit à la vie, ce droit lui donnerait-il le pouvoir d'exiger l'usage du corps d'une autre personne ? Le troisième est le problème de la responsabilité : la grossesse, lorsqu'elle suit un acte volontaire, engendre-t-elle un devoir spécifique envers l'être qui en résulte ? Le quatrième est le problème de la régulation publique : dans des sociétés divisées, sur quelles bases l'État peut-il interdire, autoriser ou encadrer l'avortement sans imposer une doctrine particulière ? Le cinquième, enfin, est le problème de la justice sociale : un droit à l'avortement reste une promesse vide quand l'accès effectif aux soins est inégalement distribué selon la classe, le territoire et le genre. Ces cinq problèmes ne se recouvrent pas, et la plupart des positions du débat se distinguent moins par leur réponse à un seul d'entre eux que par la hiérarchie qu'elles établissent entre les cinq. === Définitions préliminaires === Avant d'entrer dans la discussion proprement morale, plusieurs distinctions doivent être posées, car la plupart des malentendus du débat tiennent à un usage imprécis du vocabulaire. L'avortement désigne l'interruption d'une grossesse avant son terme, avec expulsion ou extraction du produit de la conception. On distingue l'avortement spontané ou ''fausse couche'', qui résulte d'une cause naturelle indépendante de la volonté, et l'avortement provoqué, issu d'une intervention délibérée. En droit français, l'avortement provoqué se décline lui-même en interruption volontaire de grossesse (IVG), autorisée à la demande de la femme jusqu'à la fin de la quatorzième semaine de grossesse (soit seize semaines d'aménorrhée) depuis la loi du 2 mars 2022, et en interruption médicale de grossesse (IMG), sans limite de terme lorsque la poursuite de la grossesse met gravement en péril la santé de la femme ou lorsqu'une affection d'une particulière gravité et reconnue comme incurable affecte l'enfant à naître<ref>Articles L. 2212-1 et L. 2213-1 du Code de la santé publique français, modifiés par la loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Sur le plan biologique, on appelle zygote la cellule issue de la fécondation, embryon l'organisme en développement jusqu'à la fin de la huitième semaine après la fécondation (soit environ dix semaines d'aménorrhée), et fœtus l'organisme à partir de cette date jusqu'à la naissance. La distinction entre semaines de développement embryonnaire, semaines de grossesse comptées à partir de la fécondation et semaines d'aménorrhée comptées à partir des dernières règles importe : un délai légal exprimé en semaines de grossesse correspond à environ deux semaines de moins quand on le convertit en semaines d'aménorrhée. La viabilité, notion à la fois médicale et juridique, désigne le stade à partir duquel un fœtus peut survivre hors de l'utérus avec assistance médicale ; elle se situe aujourd'hui autour de vingt-deux à vingt-quatre semaines d'aménorrhée, avec une marge d'incertitude liée au poids, à la maturation pulmonaire et à l'équipement néonatal disponible. Enfin, on désigne par avortement tardif l'interruption pratiquée après le seuil de viabilité, cas qui soulève des problèmes moraux distincts de ceux posés par l'avortement précoce. Ces distinctions importent philosophiquement. Une même thèse sur le « statut du fœtus » peut être défendable pour un embryon précoce et discutable pour un fœtus viable, ou inversement. Le débat gagne en précision quand on évite d'utiliser « fœtus » comme terme générique pour toutes les étapes du développement prénatal. === Le statut moral de l'être humain en développement === ==== L'argument de la personnalité morale ==== La question du statut moral du zygote, de l'embryon ou du fœtus occupe une place centrale dans le débat. Une première famille d'arguments restrictifs soutient que l'être humain en développement possède, dès la conception ou à partir d'un certain stade, les propriétés qui font d'un être une personne morale, titulaire d'un droit à la vie comparable à celui d'un nouveau-né ou d'un adulte. Mais que signifie être une personne ? John Locke, dans son ''Essai sur l'entendement humain'' (1689), livre II, chapitre 27, propose une définition qui a durablement marqué la philosophie analytique : une personne est « un être pensant intelligent, qui a raison et réflexion, et qui peut se considérer soi-même comme soi-même, une même chose pensante en différents temps et lieux »<ref>Locke, J. (1689/2001). ''Essai philosophique concernant l'entendement humain'', livre II, chapitre 27, § 9, trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris, Vrin, p. 521.</ref>. Cette définition, fondée sur la conscience réflexive et la continuité psychologique, exclut le zygote, l'embryon et vraisemblablement le fœtus à tous les stades de son développement. Mary Anne Warren a prolongé cette ligne lockéenne dans son article de 1973, « On the Moral and Legal Status of Abortion », où elle propose cinq critères cumulatifs pour caractériser une personne morale : la conscience, en particulier la capacité à éprouver la douleur, la raison, l'activité autonome, la capacité de communiquer des messages variés, et la présence d'une conscience de soi<ref>Warren, M. A. (1973). « On the Moral and Legal Status of Abortion », ''The Monist'', 57(1), pp. 43-61, en particulier pp. 55-56 pour les cinq critères.</ref>. Warren conclut qu'aucun fœtus ne satisfait ces critères et qu'aucun n'est donc une personne au sens moral, ce qui ne préjuge pas entièrement de son statut mais interdit de lui reconnaître les droits d'une personne pleinement constituée. Michael Tooley, dans un article de 1972 puis dans son livre ''Abortion and Infanticide'' (1983), défend une position encore plus restrictive : pour posséder un droit à la vie, un être doit avoir le concept de lui-même comme entité persistante et désirer continuer d'exister<ref>Tooley, M. (1972). « Abortion and Infanticide », ''Philosophy & Public Affairs'', 2(1), pp. 37-65 ; voir aussi ''Abortion and Infanticide'', Oxford, Clarendon Press, 1983, chapitre 5.</ref>. Peter Singer, dans ''Practical Ethics'' (3e éd., 2011, chapitre 6), adopte une position utilitariste voisine et distingue l'être humain au sens biologique de la personne au sens moral : seuls les êtres capables de raison, de conscience de soi et de préférences orientées vers l'avenir possèdent le statut pleinement personnel<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, chapitre 6, pp. 132-175.</ref>. L'implication la plus controversée de cette famille d'arguments, assumée par Tooley et Singer, est que les nouveau-nés eux-mêmes ne satisferaient pas encore ces critères, ce qui a conduit Singer à admettre, dans certaines circonstances extrêmes, le caractère moralement admissible de l'infanticide néonatal, position abondamment critiquée, notamment par les auteurs qui y voient une ''reductio ad absurdum'' de la définition purement psychologique de la personne. ==== L'argument du potentiel ==== Face à la difficulté de soutenir que l'embryon satisfait actuellement les critères de la personnalité, certains philosophes ont déplacé le débat vers la notion de potentialité : même si l'être humain en développement ne possède pas encore les propriétés constitutives de la personne, il les possède potentiellement, et ce potentiel suffit à lui conférer un statut moral qui interdit ou restreint sévèrement l'avortement. Cet argument rencontre plusieurs objections classiques. Singer soutient qu'un prince potentiel n'a pas les droits d'un prince actuel, et que la simple capacité future à devenir X ne confère pas les droits attachés à l'actualité de X<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, p. 152.</ref>. On objecte également que si le potentiel comptait moralement au sens le plus large, les gamètes séparés seraient eux aussi porteurs d'une vie humaine en puissance, et la contraception deviendrait moralement problématique. Cette seconde objection, toutefois, ne dispense pas d'examiner la réponse classique des défenseurs de la potentialité. John Finnis, Patrick Lee ou Robert George soulignent qu'il faut distinguer entre un potentiel actif et un potentiel passif : un gamète isolé ne devient un être humain qu'à la condition d'être combiné à un autre gamète, c'est-à-dire par l'intervention d'un événement causal extérieur à lui-même, alors que le zygote, dès la fécondation, est déjà un organisme humain complet doté d'un programme interne de développement qui se poursuivra de lui-même, pour peu qu'on ne l'interrompe pas<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitre 1 ; George, R. P. et Tollefsen, C. (2008). ''Embryo: A Defense of Human Life'', New York, Doubleday, chapitres 2-3.</ref>. Cette distinction entre l'organisme qui a déjà en lui son principe de développement et l'élément cellulaire qui ne l'a pas encore affaiblit la portée de l'objection des gamètes, sans la rendre nécessairement sans réponse. L'argument du potentiel reste discuté, mais il n'est pas démonté aussi vite que pourraient le laisser croire ses versions sommaires. ==== L'argument du futur de valeur ==== Don Marquis, dans un article fondateur de 1989, « Why Abortion is Immoral », a proposé une stratégie argumentative qui se veut indépendante du débat sur la personnalité. Plutôt que de chercher ce qui rend un être moralement digne de protection, Marquis se demande ce qui fait la gravité du meurtre. Sa réponse : ce qui rend le meurtre moralement mauvais ne tient ni aux préférences frustrées de la victime, ni à la souffrance, ni à l'atteinte à sa dignité de personne, mais au fait qu'il prive la victime d'un « futur comme le nôtre », un avenir contenant des expériences, des projets, des activités et des plaisirs de valeur<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 183-202, en particulier pp. 189-194.</ref>. L'intérêt de cette stratégie est d'éviter la question délicate du seuil de la personnalité. Puisque le fœtus, si on ne l'avorte pas, connaîtra un avenir du même type que celui d'un adulte humain, le priver de cet avenir constitue un mal comparable au meurtre d'un adulte. La conclusion de Marquis est que l'avortement est, sauf circonstances exceptionnelles, profondément immoral. L'argument a suscité une abondante littérature. Une objection fréquente, formulée notamment par David Boonin, consiste à remarquer que Marquis présuppose une identité problématique entre l'organisme fœtal actuel et l'adulte futur : ce qui compte, selon Boonin, c'est moins l'identité biologique que la continuité psychologique du sujet, laquelle n'est pas encore établie au stade embryonnaire<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, chapitre 2, pp. 56-85.</ref>. Une autre objection, souvent soulevée, consiste à dire que si l'argument du futur de valeur interdit l'avortement, il semble interdire aussi la contraception, puisque celle-ci empêche elle aussi l'existence d'un être qui aurait eu un futur de valeur. Marquis a répondu à cette objection dans plusieurs textes en soulignant que la contraception ne prive personne d'un futur, puisqu'aucun sujet individuel n'existe encore au moment où elle s'exerce : un spermatozoïde et un ovule ne constituent pas encore un organisme unique identifiable dont on pourrait dire qu'il aurait eu un avenir<ref>Marquis, D. (1989). « Why Abortion is Immoral », ''The Journal of Philosophy'', 86(4), pp. 201-202 ; voir aussi Marquis, D. (2007). « Abortion Revisited », dans B. Steinbock (éd.), ''The Oxford Handbook of Bioethics'', Oxford, Oxford University Press, pp. 395-415.</ref>. Cette réponse n'est pas universellement jugée convaincante, mais elle montre que l'argument ne s'effondre pas aussi facilement que ses critiques le suggèrent parfois. ==== L'argument substantialiste et la continuité de l'organisme ==== Une autre famille d'arguments restrictifs, moins présente dans les manuels d'éthique analytique mais importante dans la philosophie néo-thomiste et dans les travaux de John Finnis, Patrick Lee, Francis Beckwith et Christopher Kaczor, récuse la séparation lockéenne entre l'être humain biologique et la personne morale. Selon cette approche, chacun de nous est identiquement un organisme humain ; nous ne sommes pas un esprit logé dans un corps, ni une conscience apparue à un certain stade du développement d'un corps qui n'était pas encore nous. Si l'on accepte cette ontologie, alors chacun d'entre nous est numériquement identique à l'embryon qu'il a été : l'embryon humain est déjà l'un de nous, et les droits attachés à notre humanité ne peuvent pas ne pas s'étendre à lui. John Finnis a développé cette perspective dès 1973 dans sa réponse à Thomson, « The Rights and Wrongs of Abortion »<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Patrick Lee, dans ''Abortion and Unborn Human Life'' (1996, 2e éd. 2010), et Francis Beckwith, dans ''Defending Life: A Moral and Legal Case Against Abortion Choice'' (2007), construisent une argumentation systématique à partir de trois thèses : l'embryon humain est un organisme humain complet dès la fécondation, tout organisme humain est une personne au sens ontologique, et la valeur morale d'un être ne dépend pas de ses capacités actuelles mais de la sorte d'être qu'il est<ref>Lee, P. (1996). ''Abortion and Unborn Human Life'', Washington, Catholic University of America Press, chapitres 1-3 ; Beckwith, F. J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice'', Cambridge, Cambridge University Press, chapitres 2 et 6.</ref>. Christopher Kaczor, dans ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'' (2011), prolonge cette approche en examinant, et en rejetant, les principales tentatives analytiques pour dissocier humanité biologique et personnalité morale<ref>Kaczor, C. (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice'', New York, Routledge, chapitres 3-5.</ref>. L'un des enjeux centraux de ce courant est la critique du gradualisme. Si la valeur morale dépend de capacités psychologiques qui se développent progressivement, alors elle devient elle-même graduelle, et les droits deviennent des quantités variables, ce que ces auteurs tiennent pour incompatible avec l'idée même d'égalité morale entre les êtres humains. Jeff McMahan, dans ''The Ethics of Killing'' (2002), a élaboré une position concurrente de type « psychologique » qui accepte précisément cette gradualité, tout en reconnaissant la force de l'objection substantialiste<ref>McMahan, J. (2002). ''The Ethics of Killing: Problems at the Margins of Life'', New York, Oxford University Press, chapitres 1-4.</ref>. Le débat entre organisme humain et personne psychologique, loin d'être tranché, constitue l'une des lignes de fracture les plus productives de la bioéthique contemporaine. === Les arguments en faveur du droit à l'avortement === ==== L'argument de l'autonomie corporelle : Judith Jarvis Thomson ==== En 1971, Judith Jarvis Thomson publie « A Defense of Abortion » dans le premier numéro de ''Philosophy & Public Affairs'', article qui est devenu l'un des plus discutés de l'éthique analytique<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 47-66.</ref>. L'originalité de sa démarche tient à un choix stratégique : accorder, pour les besoins de l'argument, que le fœtus est une personne titulaire d'un droit à la vie dès la conception. À partir de cette concession, Thomson cherche à montrer que l'avortement reste moralement permis dans de nombreux cas, parce que le droit à la vie ne se confond pas avec un droit d'utiliser le corps d'une autre personne. Thomson propose sa célèbre analogie du violoniste. Vous vous réveillez un matin pour découvrir que la Société des Amateurs de Musique vous a branché, pendant votre sommeil, à un célèbre violoniste inconscient atteint d'une grave maladie rénale. Vous seul possédez le groupe sanguin compatible. Si vous restez branché pendant neuf mois, il sera sauvé ; si vous vous débranchez, il mourra. Thomson soutient qu'il serait généreux de rester branché, mais que vous n'en avez pas l'obligation morale : le droit à la vie du violoniste ne lui confère pas un droit sur votre corps, et vous n'avez pas manqué à la justice en refusant de lui prêter le vôtre<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 48-49.</ref>. L'analogie vise à montrer qu'une asymétrie sépare le droit à la vie et le droit à ce qui est nécessaire à la vie. Même si le fœtus est une personne, l'interruption de la grossesse ne viole pas nécessairement son droit à la vie, parce qu'il n'a pas reçu le droit d'utiliser le corps de la femme enceinte. Celle-ci peut donc avoir le droit moral d'interrompre cette utilisation, même si l'effet prévu est la mort du fœtus. Les critiques ont souligné les disanalogies entre le cas du violoniste et la grossesse ordinaire. Dans la plupart des cas (hors viol, hors échec d'un moyen contraceptif pleinement utilisé), la grossesse fait suite à une activité volontaire dont les partenaires connaissaient le risque reproductif. Ce choix, disent les adversaires de Thomson, crée une forme de responsabilité envers le fœtus qui n'existe pas dans le cas du violoniste, où le branchement est parfaitement involontaire. John Finnis, dans sa réponse à Thomson, a défendu cette objection en termes rigoureux<ref>Finnis, J. (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson », ''Philosophy & Public Affairs'', 2(2), pp. 117-145.</ref>. Thomson anticipait cette réplique et y répondait par une seconde analogie, celle des ''people-seeds'', qu'on peut traduire par « graines de personnes ». Imaginez que des graines microscopiques flottent dans l'air, et qu'il suffise qu'une graine entre chez vous par une fenêtre ouverte et s'enracine dans votre tapis pour qu'une personne s'y développe. Vous aimez avoir les fenêtres ouvertes et vous installez des filets de la meilleure qualité disponibles sur le marché, mais l'un d'eux comporte un défaut et une graine pénètre malgré tout. Thomson soutient qu'ouvrir sa fenêtre en sachant qu'un risque minime existe ne vous engage pas moralement à héberger la plante pendant neuf mois<ref>Thomson, J. J. (1971). « A Defense of Abortion », ''Philosophy & Public Affairs'', 1(1), pp. 58-59.</ref>. Prendre un risque calculé et prendre des précautions raisonnables ne suffit pas à créer une obligation absolue d'assumer toutes les conséquences imaginables de ce risque. Cette réponse est souvent jugée ingénieuse ; elle ne clôt pas pour autant la discussion sur la portée exacte de la responsabilité causale en matière d'avortement. ==== David Boonin et l'absence de droit au corps d'autrui ==== David Boonin, dans ''A Defense of Abortion'' (2002), prolonge et renforce l'argument de Thomson. Son livre examine une quarantaine d'objections contre l'avortement et tente de montrer que, même en accordant que l'embryon est une personne dès la conception, l'avortement demeure moralement admissible dans la grande majorité des cas<ref>Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, introduction pp. 1-22, puis chapitres 4-6.</ref>. L'argument central de Boonin s'appuie sur une analyse du cas ''McFall v. Shimp'', tranché en 1978 par la Cour des plaids communs du comté d'Allegheny en Pennsylvanie. Robert McFall souffrait d'une anémie aplasique mortelle et avait besoin d'une greffe de moelle osseuse. Son cousin, David Shimp, était le seul donneur compatible connu dans sa famille, mais refusa de donner sa moelle. McFall poursuivit Shimp pour obtenir une ordonnance contraignant Shimp à subir la procédure. Le juge Flaherty rejeta la demande, estimant que, quelle que fût la dureté morale du refus de Shimp, le droit ne pouvait contraindre une personne à subir une atteinte corporelle, même minime, pour sauver la vie d'autrui<ref>''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). Pour une discussion philosophique, voir Boonin, D. (2002). ''A Defense of Abortion'', Cambridge, Cambridge University Press, pp. 133-148.</ref>. Boonin en tire la conclusion suivante : si l'État ne peut contraindre quelqu'un à permettre l'utilisation de son corps même pour sauver une vie humaine, il ne peut a fortiori contraindre une femme enceinte à poursuivre une grossesse, laquelle impose un fardeau corporel bien plus considérable qu'un don de moelle. L'asymétrie entre le traitement juridique du don d'organes, fondé sur le consentement, et celui de l'avortement, parfois fondé sur l'obligation, révèle, selon Boonin, une incohérence dans les législations restrictives. L'argument n'est pas à l'abri de la critique. Ses adversaires soulignent que la femme enceinte, dans la plupart des cas, a contribué causalement à l'existence du fœtus et à sa situation de dépendance, tandis que Shimp n'a rien fait qui ait causé la maladie de McFall. Cette différence, disent-ils, engendre une obligation spéciale dans le cas de la grossesse, qui n'existe pas dans le cas du don de moelle. Boonin répond à cette objection en distinguant soigneusement les responsabilités morales et les obligations juridiques positives, mais la discussion reste ouverte. === La doctrine du double effet et l'avortement === La doctrine du double effet est une élaboration scolastique ancienne, dont on trouve l'esquisse chez Thomas d'Aquin, dans la ''Somme théologique'', IIa-IIae, question 64, article 7, à propos de la légitime défense<ref>Thomas d'Aquin, ''Somme théologique'', IIa-IIae, q. 64, a. 7, trad. fr. sous la direction du P. A.-M. Roguet, Paris, Éditions du Cerf, 1984.</ref>. Elle propose un principe permettant d'évaluer la moralité d'actions qui produisent à la fois un effet bon et un effet mauvais. Selon sa formulation classique, une action qui cause un dommage peut être moralement permise si quatre conditions sont réunies. Premièrement, l'acte envisagé n'est pas intrinsèquement mauvais. Deuxièmement, l'intention de l'agent vise le bon effet, le mauvais effet étant seulement prévu et toléré. Troisièmement, le mauvais effet n'est pas un moyen d'obtenir le bon effet. Quatrièmement, il existe une raison proportionnellement grave qui justifie de tolérer le mauvais effet. Appliquée à l'avortement, la doctrine produit des distinctions fines. Dans le cas d'une femme enceinte atteinte d'un cancer de l'utérus, l'ablation de l'utérus cancéreux (hystérectomie) serait jugée permise même si elle entraîne la mort du fœtus, parce que l'intention chirurgicale vise l'ablation d'un organe malade et que la mort du fœtus est un effet second, prévu mais non voulu comme moyen. En revanche, une craniotomie destinée à réduire les dimensions du crâne fœtal pour sauver la vie de la mère serait interdite, parce que l'endommagement du fœtus y est le moyen même du sauvetage. Philippa Foot, dans son article de 1967 « The Problem of Abortion and the Doctrine of the Double Effect », a exposé une critique pénétrante de ce principe<ref>Foot, P. (1967). « The Problem of Abortion and the Doctrine of the Double Effect », ''Oxford Review'', 5, pp. 5-15 ; republié dans ''Virtues and Vices and Other Essays in Moral Philosophy'', Oxford, Basil Blackwell, 1978, pp. 19-32.</ref>. Elle soutient que la distinction entre intention directe et simple prévision est souvent arbitraire et moralement peu pertinente. Pour illustrer son propos, Foot invente ses fameux problèmes du tramway (''trolley problems''), qui ont donné naissance à tout un domaine de la philosophie morale expérimentale. Foot propose de remplacer la distinction intentionnelle par une distinction de droit : ce qui importe n'est pas la structure de l'intention de l'agent, mais de savoir si son action viole ou non un droit d'autrui. Dans le cas de l'hystérectomie, la femme n'a simplement pas l'obligation de continuer à fournir son corps pour soutenir le fœtus, surtout au prix de sa propre vie. Alison McIntyre, dans « Doing Away with Double Effect » (2001), approfondit la critique en montrant que la doctrine engendre des verdicts contre-intuitifs dans de nombreux cas et que les distinctions qu'elle suppose sont souvent impossibles à maintenir de manière cohérente<ref>McIntyre, A. (2001). « Doing Away with Double Effect », ''Ethics'', 111(2), pp. 219-255.</ref>. Warren Quinn, à l'inverse, avait défendu une version reformulée de la doctrine dans « Actions, Intentions, and Consequences: The Doctrine of Double Effect » (1989), où il tente de montrer que l'intention joue un rôle moral irréductible<ref>Quinn, W. S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect », ''Philosophy & Public Affairs'', 18(4), pp. 334-351.</ref>. Frances Kamm, dans ''Creation and Abortion'' (1992) et dans des travaux ultérieurs dont « Abortion Bans and Cruelty » (2023), a examiné en détail l'application de la doctrine au cas de l'avortement. Kamm soutient que, même si l'on accepte certains aspects de la doctrine, elle ne suffit pas à interdire l'avortement : tuer le fœtus peut être moralement permis, même lorsque c'est intentionnel, précisément parce que le fœtus ne possède pas de droit à l'utilisation du corps de la femme pour se maintenir en vie<ref>Kamm, F. M. (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy'', New York, Oxford University Press, chapitre 3 ; Kamm, F. M. (2023). « Abortion Bans and Cruelty », ''Journal of Practical Ethics'', 11(1).</ref>. === Questions connexes === ==== Avortement et consentement ==== Une dimension importante du débat porte sur la notion de consentement. Nancy Davis, dans « Abortion and Self-Defense » (1984), examine si et dans quelle mesure l'avortement peut être justifié par un appel au droit de légitime défense<ref>Davis, N. (1984). « Abortion and Self-Defense », ''Philosophy & Public Affairs'', 13(3), pp. 175-207.</ref>. Davis soutient que la relation entre la femme enceinte et le fœtus est ''sui generis'' et ne peut être assimilée aux cas ordinaires de légitime défense. Le fœtus n'est pas un agresseur au sens ordinaire, puisqu'il n'a ni volonté ni intention hostile ; et pourtant sa présence peut menacer la santé ou la vie de la femme. Davis développe une analyse nuancée qui cherche à articuler, sans les assimiler, les catégories de l'agression, de la menace innocente et du conflit de droits. La question du consentement se pose également dans les cas de viol. De nombreuses positions restrictives admettent une exception en pareil cas. Mais pourquoi ? Si le fœtus est vraiment une personne innocente, pourquoi les circonstances de sa conception affecteraient-elles son droit à la vie ? Cette interrogation révèle des tensions internes aux positions restrictives, et a nourri une littérature spécifique sur le viol, le consentement et la responsabilité causale<ref>Mackenzie, C. (1992). « Abortion and Embodiment », ''Australasian Journal of Philosophy'', 70(2), pp. 136-155.</ref>. ==== Avortement tardif ==== L'avortement tardif, pratiqué après le seuil de viabilité, soulève des préoccupations distinctes. À mesure que la grossesse avance, le fœtus acquiert progressivement des capacités physiologiques et neurologiques plus développées, et peut potentiellement survivre hors de l'utérus avec assistance médicale. Les faits empiriques sur lesquels s'appuie cette gradation sont toutefois plus incertains qu'on ne le pense souvent. La question de la douleur fœtale, en particulier, a été abondamment discutée. Un premier rapport du ''Royal College of Obstetricians and Gynaecologists'' publié en 2010 concluait que le fœtus ne possédait pas, avant vingt-quatre semaines, les connexions neuronales nécessaires à l'expérience de la douleur au sens plein. Une actualisation de 2022 a confirmé cette prudence : les réseaux cérébraux impliqués dans la perception de la douleur sont en cours de développement à vingt-quatre semaines, mais leur fonctionnalité n'est pas encore pleinement établie, et la perception douloureuse au sens élaboré relèverait plutôt de la période de vingt-huit à trente semaines<ref>Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice'', Londres, RCOG, synthèse exécutive et sections sur les corrélats neurophysiologiques de la nociception et de la conscience.</ref>. Ces seuils sont des repères scientifiques probabilistes, susceptibles d'être révisés au fil des recherches, et non des frontières morales nettes. Une analyse philosophique rigoureuse de l'avortement tardif doit donc résister à la tentation de présenter la capacité fœtale à souffrir comme une donnée acquise et de la convertir trop vite en argument moral. La question de la viabilité, elle aussi, a fait l'objet d'un usage juridique important. L'arrêt ''Roe v. Wade'' (1973) de la Cour suprême des États-Unis, désormais renversé, fixait la viabilité autour de vingt-quatre à vingt-huit semaines et associait ce seuil à un intérêt de l'État croissant à protéger la vie potentielle du fœtus<ref>''Roe v. Wade'', 410 U.S. 113 (1973), partie X de l'opinion du juge Blackmun.</ref>. La position « gradualiste » qui en résulte fait face à une objection classique : le développement du fœtus est continu, sans points de rupture naturels évidents. Si le fœtus de vingt-quatre semaines a des droits significatifs, pourquoi pas celui de vingt-trois semaines et six jours ? Cette difficulté, qu'on rapproche parfois du paradoxe sorite, n'est pas propre à la bioéthique et affecte toute tentative de tracer une ligne dans un processus graduel ; elle ne suffit pourtant pas à disqualifier un seuil légal raisonnablement motivé. ==== Avortement sélectif et enjeux du handicap ==== L'avortement sélectif, fondé sur des caractéristiques du fœtus telles que le sexe, des anomalies génétiques ou des pathologies diagnostiquées, soulève des questions éthiques distinctes. Beaucoup de ceux qui soutiennent un droit général à l'avortement peuvent s'inquiéter des implications de l'avortement sélectif selon le sexe, tel qu'il est pratiqué dans certaines sociétés caractérisées par une préférence marquée pour les garçons. L'avortement des fœtus diagnostiqués avec des anomalies génétiques, au premier rang desquelles la trisomie 21, a suscité un débat spécifique, que la littérature anglophone désigne comme la critique du dépistage prénatal formulée au nom des droits des personnes handicapées (''disability rights critique of prenatal testing''). Des auteurs comme Adrienne Asch et Erik Parens ont soutenu que l'interruption quasi systématique des grossesses après un diagnostic de trisomie 21 exprime, puis renforce, une dévalorisation culturelle du handicap, et risque d'être vécue comme un jugement collectif porté sur l'existence des personnes handicapées elles-mêmes<ref>Parens, E. et Asch, A. (éds.) (2000). ''Prenatal Testing and Disability Rights'', Washington, Georgetown University Press, en particulier l'introduction pp. 3-43 et l'essai d'Adrienne Asch pp. 234-258.</ref>. La réplique libérale, formulée par Bonnie Steinbock ou Frances Kamm, consiste à distinguer l'acte individuel d'avorter, qui n'implique pas nécessairement un jugement négatif sur les personnes handicapées, et une politique publique qui valoriserait implicitement une société sans handicap<ref>Kamm, F. M. (1992). ''Creation and Abortion'', New York, Oxford University Press, chapitre 5 ; Steinbock, B. (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e éd., New York, Oxford University Press, chapitre 6.</ref>. Le débat illustre une tension propre aux politiques reproductives : une liberté individuelle peut produire, statistiquement, une norme sociale implicite qui infléchit les choix ultérieurs. === Dimension politique et juridique === ==== Le cadre juridique français ==== En France, l'interruption volontaire de grossesse a été dépénalisée par la loi du 17 janvier 1975, dite loi Veil, initialement pour une période expérimentale de cinq ans, puis pérennisée par la loi du 31 décembre 1979. Plusieurs réformes ont ensuite étendu son régime : la loi du 4 juillet 2001 relative à l'interruption volontaire de grossesse et à la contraception, portée par Élisabeth Guigou, a porté le délai légal de dix à douze semaines de grossesse et assoupli les conditions d'accès pour les mineures ; la loi du 2 mars 2022, dite loi Gaillot, a porté ce délai à quatorze semaines et étendu aux sages-femmes la possibilité de pratiquer l'IVG instrumentale<ref>Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse ; loi n° 79-1204 du 31 décembre 1979 ; loi n° 2001-588 du 4 juillet 2001 ; loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement.</ref>. Le 8 mars 2024, la France est devenue le premier État à constitutionnaliser explicitement le recours à l'avortement. La loi constitutionnelle n° 2024-200 a inscrit à l'article 34 de la Constitution la disposition suivante : « La loi détermine les conditions dans lesquelles s'exerce la liberté garantie à la femme d'avoir recours à une interruption volontaire de grossesse »<ref>Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse, ''Journal officiel de la République française'', n° 58 du 9 mars 2024.</ref>. Cette rédaction est juridiquement protectrice : elle hisse au rang constitutionnel une « liberté garantie », ce qui interdit au législateur ordinaire d'en abroger le principe sans réviser la Constitution. Elle ne proclame pas pour autant un « droit » à l'avortement au sens des droits-libertés directement opposables, mais elle reconnaît une liberté dont le législateur fixe les conditions d'exercice. Ce choix rédactionnel a fait l'objet de débats juridiques entre ceux qui y voient une protection désormais solide et ceux qui estiment qu'il laisse au législateur une marge d'appréciation importante sur les délais, l'organisation de l'offre de soins et la portée du principe. La philosophie politique française a accompagné ce mouvement par des travaux spécifiques. Le discours de Simone Veil du 26 novembre 1974 devant l'Assemblée nationale, resté célèbre, insiste sur le caractère tragique de l'avortement et sur la nécessité d'éviter qu'il devienne banal, tout en reconnaissant le droit des femmes à ne plus être punies pour y recourir. Geneviève Fraisse a donné à cette réflexion une ampleur conceptuelle en examinant, dans ''Du consentement'' (2007), les paradoxes d'une notion trop vite considérée comme transparente : un consentement dépourvu de pouvoir réel de négociation n'est pas un véritable consentement, et la liberté de disposer de son corps suppose des conditions sociales, économiques et politiques qui excèdent la seule décision individuelle<ref>Fraisse, G. (2007). ''Du consentement'', Paris, Le Seuil, en particulier chapitres 1 et 4.</ref>. Élisabeth Badinter, dans ''Le Conflit : la femme et la mère'' (2010), a proposé pour sa part une interrogation sur les représentations contemporaines de la maternité et sur les nouvelles formes d'injonction sociale qui pèsent sur les femmes en âge de procréer<ref>Badinter, É. (2010). ''Le Conflit : la femme et la mère'', Paris, Flammarion.</ref>. ==== Le cadre juridique états-unien ==== Aux États-Unis, l'architecture constitutionnelle du droit à l'avortement a connu une profonde évolution entre 1973 et 2022. L'arrêt ''Roe v. Wade'' (1973) avait reconnu un droit à l'avortement fondé sur le droit à la vie privée implicitement contenu dans le Quatorzième Amendement, en construisant un cadre trimestriel : droit quasi libre au premier trimestre, possibilité de régulation au deuxième, protection plus large de la « vie potentielle » après la viabilité<ref>''Roe v. Wade'', 410 U.S. 113 (1973), opinion de la Cour rédigée par le juge Blackmun.</ref>. L'arrêt ''Planned Parenthood v. Casey'' (1992) a réaffirmé le droit constitutionnel à l'avortement tout en abandonnant le cadre trimestriel au profit d'un critère du « fardeau indu » (''undue burden''), qui autorisait les États à réglementer l'accès à l'avortement avant la viabilité pour peu qu'ils n'imposent pas d'obstacle excessif<ref>''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992).</ref>. L'arrêt ''Dobbs v. Jackson Women's Health Organization'' (2022) a renversé ''Roe'' et ''Casey'', en jugeant que la Constitution des États-Unis ne protège aucun droit à l'avortement et en renvoyant la réglementation de cette question aux législatures des États<ref>''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022), opinion de la Cour rédigée par le juge Alito.</ref>. Cette décision a reconfiguré le paysage juridique américain : plusieurs États ont adopté des législations restrictives, d'autres ont inscrit le droit à l'avortement dans leur constitution locale, et de nouvelles questions juridiques sont apparues, concernant notamment les déplacements de patientes d'un État à l'autre et la pénalisation de la prescription à distance. Dans le débat juridique américain post-''Dobbs'', une partie de la discussion se déplace ainsi de la question du statut du fœtus vers celle de la cohérence fédérale, de l'égalité entre citoyens selon leur État de résidence, et des conflits de lois. La question morale du statut du fœtus, de la personnalité juridique prénatale et de la protection de la vie embryonnaire reste néanmoins centrale dans le débat public, dans les mobilisations militantes et dans une partie de la doctrine, comme en témoigne notamment la diffusion des projets législatifs dits de « personnalité fœtale » (''fetal personhood'') dans plusieurs États. ==== Libéralisme politique et avortement ==== La question de l'avortement confronte le libéralisme politique à l'une de ses difficultés les plus vives. Comment l'État peut-il réguler la matière dans des sociétés pluralistes traversées par des désaccords moraux profonds et, en un sens important, raisonnables ? John Rawls, dans ''Political Liberalism'' (1993), distingue entre les « doctrines compréhensives », religieuses, philosophiques ou morales, que partagent les citoyens, et les « valeurs politiques » partagées par tous dans le cadre de la coopération sociale. Rawls soutient que les questions constitutionnelles essentielles ne doivent être tranchées qu'à partir de ces dernières. Dans une note célèbre de l'introduction à l'édition brochée de 1996, Rawls écrit que si l'on ne considère que trois valeurs politiques, à savoir le respect dû à la vie humaine, la reproduction ordonnée de la société et l'égalité des femmes comme citoyennes égales, « tout équilibre raisonnable de ces trois valeurs donnera à une femme un droit qualifié à mettre fin à sa grossesse au cours du premier trimestre »<ref>Rawls, J. (1996). ''Political Liberalism'', édition brochée, New York, Columbia University Press, introduction, note 32, p. 243.</ref>. Rawls reconnaît lui-même que cette remarque rapide ne constitue pas une démonstration, mais une illustration de la façon dont la raison publique pourrait trancher la question. La position rawlsienne a fait l'objet de critiques importantes. Ses adversaires lui reprochent de présupposer précisément ce qu'il devrait démontrer : pour juger que la reproduction ordonnée et l'égalité des femmes l'emportent sur le respect dû à la vie humaine, il faut avoir déjà décidé que le statut moral du fœtus n'est pas celui d'une personne. Si le fœtus est une personne, alors la protection de sa vie est une question de justice fondamentale que l'État ne peut écarter au nom de la raison publique. Michael Sandel et d'autres communautariens ont construit sur cette base une critique générale du libéralisme rawlsien<ref>Sandel, M. J. (1984). « Morality and the Liberal Ideal », ''The New Republic'', 7 mai ; Sandel, M. J. (1996). ''Democracy's Discontent'', Cambridge (Mass.), Harvard University Press, chapitre 3.</ref>. ==== Féminisme et avortement ==== Les approches féministes relient l'avortement à des structures plus larges : contrôle patriarcal sur le corps et la sexualité, division sexuée du travail, inégalités économiques, organisation sociale de la reproduction. Le débat féministe ne forme pas un bloc homogène : il comprend plusieurs traditions théoriques qui divergent sur les concepts mobilisés, les priorités politiques et la place qu'il convient d'accorder à l'analyse du corps et à celle du travail. La tradition existentialiste et phénoménologique. Simone de Beauvoir, dans ''Le Deuxième Sexe'' (1949), consacre au chapitre « La mère » un développement dense sur l'avortement clandestin tel qu'il se pratiquait dans la France d'avant 1975. Beauvoir décrit la pratique comme un « crime » inventé par les sociétés patriarcales à l'usage exclusif des femmes, et analyse la contradiction d'une société qui refuse à celles-ci la maîtrise de leur fécondité tout en leur imputant seules la charge morale de l'enfant à naître<ref>Beauvoir, S. de (1949/1976). ''Le Deuxième Sexe'', t. II, Paris, Gallimard, coll. « Folio essais », chapitre VI, pp. 334-371.</ref>. Son analyse relie la condition reproductive à la situation existentielle globale des femmes, dans une perspective qui a durablement marqué le féminisme francophone. La tradition matérialiste française. Christine Delphy, dans ''L'Ennemi principal'' (recueils parus en 1998 et 2001), développe un féminisme matérialiste pour lequel l'oppression des femmes repose sur un « mode de production domestique » où le travail reproductif, incluant la grossesse, l'accouchement, l'allaitement et le soin aux jeunes enfants, est extorqué gratuitement dans le cadre familial<ref>Delphy, C. (1998 et 2001). ''L'Ennemi principal'', 2 vol., Paris, Syllepse, en particulier t. I, chapitre 1, « L'ennemi principal ».</ref>. Dans cette perspective, l'interdiction ou la limitation de l'avortement n'est pas un simple conflit de droits abstraits : c'est un instrument de contrôle de la force de travail reproductive. Colette Guillaumin, dans ''Sexe, race et pratique du pouvoir'' (1992), prolonge cette analyse en parlant d'« appropriation » matérielle des femmes, qui ne porte pas sur tel ou tel service particulier mais sur la personne entière dans ses capacités de reproduction<ref>Guillaumin, C. (1992/2016). ''Sexe, race et pratique du pouvoir. L'idée de nature'', Donnemarie-Dontilly, éditions iXe, première partie, chapitres 1 et 2.</ref>. La grossesse y apparaît non comme une donnée naturelle dont les femmes pourraient disposer en toute autonomie, mais comme une dimension de leur être dont la société dispose à leur place. Nicole-Claude Mathieu, dans ''L'Anatomie politique'' (1991), complète ce dispositif en montrant comment le corps féminin est socialement produit et naturalisé, ce qui rend invisible le caractère politique des contraintes reproductives<ref>Mathieu, N.-C. (1991). ''L'Anatomie politique. Catégorisations et idéologies du sexe'', Paris, Côté-femmes, en particulier les chapitres III et IV.</ref>. Ces trois apports composent une grille d'analyse qui déplace l'enjeu de l'avortement : il y est traité comme un rapport social entre les sexes plutôt que comme un dilemme moral abstrait entre deux droits. La tradition anglophone des droits. Catharine MacKinnon, dans « Reflections on Sex Equality Under Law » (1991), relie la criminalisation de l'avortement à un contexte historique où les femmes ont été privées du contrôle sur leur propre corps et leur propre sexualité, et soutient que le droit à l'avortement est une condition de l'égalité réelle des femmes<ref>MacKinnon, C. A. (1991). « Reflections on Sex Equality Under Law », ''Yale Law Journal'', 100(5), pp. 1281-1328, en particulier pp. 1308-1315.</ref>. Le féminisme libéral, représenté entre autres par Martha Nussbaum, insiste davantage sur l'autonomie individuelle et le consentement dans un cadre plus classiquement libéral<ref>Nussbaum, M. C. (1999). ''Sex and Social Justice'', New York, Oxford University Press, chapitre 9.</ref>. L'éthique du care et ses prolongements. L'éthique du care, ou éthique du soin et de l'attention, déplace l'analyse vers les relations concrètes, les responsabilités contextuelles et le réseau d'interdépendances dans lequel la grossesse s'inscrit. Carol Gilligan et Nel Noddings ont posé les bases de cette approche, ultérieurement systématisée par Joan Tronto<ref>Gilligan, C. (1982). ''In a Different Voice: Psychological Theory and Women's Development'', Cambridge (Mass.), Harvard University Press, chapitre 3 ; Noddings, N. (1984). ''Caring: A Feminine Approach to Ethics and Moral Education'', Berkeley, University of California Press.</ref>. Certaines féministes, comme Celia Wolf-Devine, s'interrogent par ailleurs sur la compatibilité entre une éthique du care centrée sur la vulnérabilité et une défense inconditionnelle du droit à l'avortement<ref>Wolf-Devine, C. (1989). « Abortion and the 'Feminine Voice' », ''Public Affairs Quarterly'', 3(3), pp. 81-97.</ref>. Synthèse comparative. Ces traditions ne disent pas simplement la même chose en termes différents, elles formulent le problème de l'avortement à partir d'unités d'analyse distinctes. Le féminisme libéral parle d'autonomie individuelle et de consentement, et lit l'avortement comme un cas-limite des libertés fondamentales. Le féminisme matérialiste parle de classe de sexe et de travail reproductif, et lit l'avortement comme un moment où s'exerce, ou se dérobe, l'appropriation sociale des corps. L'éthique du care, enfin, parle de relations, de dépendances et de responsabilités situées, et lit l'avortement comme une décision morale prise dans un tissu d'attaches concrètes plutôt que comme l'application d'un principe abstrait. Ces langages ne sont pas incompatibles, mais ils éclairent le problème sous trois angles différents, et leur articulation est l'une des tâches théoriques importantes du féminisme contemporain. Tensions internes. Des courants féministes critiques du capacitisme mettent en garde contre la transformation du droit à l'avortement en norme sociale implicite susceptible d'exercer une pression de fait sur les parents d'enfants potentiellement porteurs d'un handicap. Loin de constituer une position homogène, le féminisme offre au débat un éventail de perspectives qui s'enrichissent mutuellement, parfois s'opposent, et résistent ensemble à la réduction du problème à une pure question métaphysique sur le statut du fœtus. ==== Dimensions sociales et accès effectif à l'avortement ==== La philosophie morale analytique se concentre souvent sur le cas-type : une femme adulte, informée, insérée dans un système de soins fonctionnel, disposant d'un accès effectif à une clinique. Or la réalité sociologique de l'avortement montre que ces conditions sont loin d'être universellement réunies, et que les débats normatifs gagnent en précision quand ils tiennent compte de la matérialité des parcours. L'histoire française avant la loi Veil illustre l'écart entre la règle pénale et la pratique sociale. Les estimations pour les années 1960 évaluent entre 300 000 et 800 000 le nombre d'avortements clandestins annuels en France, pratiqués par des « faiseuses d'anges », par des médecins complaisants moyennant rémunération, ou par des voyages à l'étranger dans les pays qui avaient dépénalisé plus tôt (Royaume-Uni à partir de 1967, Pays-Bas dans les années 1970)<ref>Pavard, B. (2012). ''Si je veux, quand je veux. Contraception et avortement dans la société française (1956-1979)'', Rennes, Presses universitaires de Rennes, introduction et chapitres 1 et 4.</ref>. Ces pratiques n'étaient pas distribuées également selon la classe sociale : les femmes aisées trouvaient plus facilement des filières sûres, tandis que les femmes des milieux populaires subissaient davantage les complications médicales des avortements non encadrés. Le ''Manifeste des 343'' publié dans ''Le Nouvel Observateur'' le 5 avril 1971, et le procès de Bobigny en 1972, plaidé par Gisèle Halimi, ont rendu publiques ces inégalités et contribué à la mobilisation qui a préparé la loi de 1975<ref>Halimi, G. (1973). ''La cause des femmes'', Paris, Grasset ; voir également Halimi, G. (1973). ''Avortement : une loi en procès. L'affaire de Bobigny'', Paris, Gallimard.</ref>. La dépénalisation n'a pas aboli les inégalités d'accès. Les enquêtes menées par l'Institut national d'études démographiques et par l'Institut national de la santé et de la recherche médicale ont montré que l'accès à l'IVG varie selon les territoires, les ressources économiques, l'âge, la situation familiale et l'information disponible. La fermeture progressive de maternités et de centres d'orthogénie, la concentration de l'offre dans les grandes agglomérations, et les tensions sur les effectifs médicaux hospitaliers produisent des « déserts » où le délai légal peut devenir pratiquement infranchissable. L'objection de conscience, que le Code de la santé publique reconnaît aux médecins et aux autres professionnels de santé, accentue cette inégalité territoriale quand elle se concentre dans certaines zones<ref>Haute Autorité de Santé (2018). ''Interruption volontaire de grossesse par méthode médicamenteuse'', recommandation de bonne pratique, Saint-Denis-La-Plaine, HAS.</ref>. Ces constats matériels ont une portée philosophique. Ils montrent d'abord qu'un « droit » à l'avortement purement formel peut coexister avec des obstacles d'accès qui vident ce droit de son contenu, comme Amartya Sen l'a souligné à propos des libertés fondamentales en général : une capacité effective exige des conditions sociales que le seul statut juridique ne garantit pas<ref>Sen, A. (1992/2000). ''Repenser l'inégalité'', trad. fr. Paul Chemla, Paris, Le Seuil, chapitres 3 et 5.</ref>. Ils rappellent ensuite que l'interdiction de l'avortement ne suspend jamais la pratique : elle la déplace vers la clandestinité et en alourdit le coût pour les personnes les moins bien dotées en ressources. Ils invitent enfin à articuler la question morale abstraite sur le statut du fœtus avec une question de justice sociale sur la répartition réelle des conditions dans lesquelles les décisions reproductives se prennent. === Approches de philosophie morale appliquée === ==== Conséquentialisme et avortement ==== Les approches conséquentialistes évaluent la moralité de l'avortement à partir de ses conséquences globales. Un utilitariste se demandera si l'avortement, dans telle circonstance, maximise le bien-être global ou minimise la souffrance. Les conclusions atteintes dépendent de la variante retenue. L'utilitarisme hédoniste classique, inspiré de Bentham et Mill, met au centre la capacité à éprouver plaisir et douleur ; aux stades précoces de la grossesse, où le fœtus ne possède pas, selon toute vraisemblance, les capacités neurophysiologiques d'une telle expérience, cet utilitarisme inclinera vers une position permissive, tout en intégrant les effets secondaires sur la femme, la famille et la société. L'utilitarisme des préférences défendu par Peter Singer aboutit à une position encore plus permissive aux stades précoces : le fœtus ne possédant pas de préférences portant sur son avenir, le tuer ne frustre aucune préférence et n'est donc pas comparable au meurtre d'un adulte doté de telles préférences<ref>Singer, P. (1979/2011). ''Practical Ethics'', 3e éd., Cambridge, Cambridge University Press, pp. 138-152.</ref>. Un conséquentialisme non utilitariste, qui prendrait au sérieux la valeur intrinsèque de la vie humaine comme type, produirait des verdicts plus restrictifs ; un utilitarisme des règles, enfin, évaluerait moins chaque avortement particulier que les effets agrégés de règles générales d'autorisation ou d'interdiction. L'objection la plus forte adressée à l'utilitarisme des préférences ne porte pas sur son formalisme mais sur ses implications en aval. Si ce qui rend le meurtre moralement mauvais consiste dans la frustration de préférences actuelles orientées vers l'avenir, alors le meurtre d'un dormeur temporairement inconscient, ou celui d'un nouveau-né, devrait être moralement moins grave que celui d'un adulte éveillé, conclusion que Singer assume en partie et que la plupart des autres auteurs rejettent. Plus largement, toutes les variantes conséquentialistes doivent prendre en compte des effets qu'il est empiriquement difficile d'évaluer : impact psychologique sur les femmes, effets sur la famille existante, conséquences sociales des politiques publiques d'avortement, impact différencié selon la classe et le territoire. Ces calculs sont rarement univoques, et leur résultat dépend d'hypothèses empiriques souvent discutées. ==== Éthique de la vertu et avortement ==== L'éthique de la vertu, plutôt que de se concentrer sur des règles ou des conséquences, s'intéresse au caractère de l'agent moral et aux vertus qu'il manifeste ou néglige. Rosalind Hursthouse, dans « Virtue Theory and Abortion » (1991), propose une application novatrice de cette approche au cas de l'avortement<ref>Hursthouse, R. (1991). « Virtue Theory and Abortion », ''Philosophy & Public Affairs'', 20(3), pp. 223-246.</ref>. Hursthouse soutient que, même en laissant ouverte la question du statut moral du fœtus, on peut juger moralement une décision d'avorter selon qu'elle exprime la vertu ou le vice dans la situation concrète de l'agent. Avorter par simple commodité, pour ne pas reporter un voyage, relève selon elle d'une légèreté contraire aux vertus que l'on attend d'une personne prenant au sérieux le prix de la vie humaine et la portée du geste accompli. Avorter dans des circonstances de pauvreté extrême, après un viol, ou parce que la santé de la mère est gravement menacée, relève en revanche d'un jugement pratique raisonnable qui exprime la prudence et le courage. L'intérêt de cette approche est de réintroduire dans l'évaluation morale des dimensions que les théories des droits ou les utilitarismes tendent à évacuer : la qualité du raisonnement pratique, le rapport de la personne à ses propres valeurs, le sens du geste dans une trajectoire de vie. Sa limite est qu'elle fournit difficilement une base à une législation générale : on ne peut pas pénaliser une femme au motif que son avortement exprime un vice, si d'autres peuvent moralement avorter dans des circonstances analogues. ==== Éthique du care ==== L'éthique du care, d'abord développée par Carol Gilligan dans ''In a Different Voice'' (1982) puis systématisée par Nel Noddings et Joan Tronto, insiste sur les relations, les responsabilités contextuelles et l'attention concrète aux besoins, plutôt que sur des principes abstraits et des droits individuels<ref>Gilligan, C. (1982). ''In a Different Voice'', Cambridge (Mass.), Harvard University Press, chapitre 3 ; Noddings, N. (1984). ''Caring: A Feminine Approach to Ethics and Moral Education'', Berkeley, University of California Press ; Tronto, J. (1993/2009). ''Un monde vulnérable. Pour une politique du care'', trad. fr. Hervé Maury, Paris, La Découverte.</ref>. Appliquée à l'avortement, cette approche souligne l'importance de considérer la situation concrète des femmes concernées : relations existantes, responsabilités envers d'autres personnes, capacité matérielle et affective à accueillir un enfant, réseau de soutien disponible. L'éthique du care refuse l'idée qu'il existerait une règle unique applicable à tous les cas d'avortement, et insiste sur le jugement contextuel attentif aux singularités de chaque situation. Elle conduit à valoriser l'accompagnement, la délibération partagée et la reconnaissance de la fragilité humaine. On a parfois opposé l'éthique du care à l'éthique des droits en suggérant que la première serait moins attachée aux principes et donc moins rigoureuse. Les théoriciennes du care récusent cette opposition : leur démarche élabore ses propres critères normatifs, fondés sur la reconnaissance de la vulnérabilité et de l'interdépendance. Elles objectent également que le langage des droits, appliqué à la grossesse, peut aboutir à opposer artificiellement des intérêts qui sont en réalité profondément entrelacés, et à masquer la dimension relationnelle qui structure l'expérience réelle de la maternité. === Considérations méthodologiques === Le débat sur l'avortement illustre plusieurs caractéristiques propres à la philosophie morale appliquée. Trois d'entre elles méritent d'être soulignées. La première est l'importance des ''intuitions morales'' pré-théoriques dans l'argumentation. Beaucoup d'arguments avancés de part et d'autre procèdent en testant des principes généraux contre nos jugements spontanés dans des cas hypothétiques. Les exemples de Thomson (le violoniste, les graines de personnes), ceux de Foot (les problèmes du tramway) ou ceux de Kamm (le trolley réexaminé sous diverses variantes) cherchent à isoler les facteurs qui déterminent nos intuitions pour en tirer des principes articulés. Cette méthode, héritée de la pratique philosophique de l'équilibre réfléchi (''reflective equilibrium'') rawlsien, ne va pas sans difficultés : la fiabilité des intuitions, leur variation selon les cultures et les contextes, et leur résistance à la théorisation font l'objet d'une discussion méthodologique soutenue<ref>Rawls, J. (1971/1987). ''Théorie de la justice'', trad. fr. Catherine Audard, Paris, Le Seuil, §§ 4 et 9.</ref>. La seconde est la façon dont des ''désaccords empiriques'' affectent les conclusions normatives. Les questions relatives à la capacité fœtale de sentir la douleur, au degré de conscience à différents stades, aux effets psychologiques réels de l'avortement sur les femmes, aux conséquences sociales des législations restrictives, sont des questions empiriques dont la résolution, même partielle, réoriente les jugements moraux. Cette interpénétration du factuel et du normatif caractérise la philosophie morale appliquée en général, et l'éthique de l'avortement en particulier. La troisième est ce que John Rawls appelle le « fardeau du jugement ». Même des personnes raisonnables et bien informées, usant des mêmes méthodes de raisonnement moral, peuvent parvenir à des conclusions opposées sur l'avortement. Cette possibilité d'un désaccord raisonnable pose un problème distinct : celui de la régulation publique des questions sur lesquelles un accord complet ne semble pas atteignable. Les sociétés démocratiques pluralistes ont développé des stratégies variées, parmi lesquelles la constitutionnalisation, la délégation au législateur, le référendum ou l'autonomie des échelons locaux, dont aucune n'est moralement neutre. === Conclusion === L'éthique de l'avortement constitue l'un des domaines les plus travaillés de la philosophie morale contemporaine. Le débat met en jeu des tensions qui traversent toute la philosophie pratique. Une première tension oppose deux ontologies de l'humain : celle de l'organisme humain, qui tient que chacun d'entre nous a été embryon et que la continuité biologique suffit à fonder une identité morale constante, et celle de la personne psychologique, qui tient que la personne s'élabore à partir de capacités de conscience, de raison et de continuité mentale qui n'apparaissent que progressivement. Une deuxième tension oppose le droit à la vie et le droit sur son propre corps. Même en accordant à l'embryon ou au fœtus un droit à la vie, il reste à déterminer dans quelle mesure ce droit fonde une obligation pour la femme enceinte de lui prêter son corps, dans quelles conditions et à quel prix. Une troisième tension oppose la morale individuelle et la législation publique. On peut juger un avortement particulier moralement douteux sans pour autant soutenir qu'il doit être pénalement réprimé ; on peut juger certaines législations restrictives injustes sans pour autant penser que tout avortement est également souhaitable. Une quatrième tension oppose le principe abstrait et le jugement contextuel. Les théories des droits et les conséquentialismes fournissent des cadres généraux ; les éthiques de la vertu et du care insistent sur l'irréductibilité des situations concrètes. La pratique réelle du jugement moral, médical et juridique mobilise nécessairement les deux registres. Une cinquième tension, enfin, oppose l'énoncé formel d'un droit et ses conditions sociales d'exercice. Les analyses matérialistes et les travaux sociologiques rappellent qu'un droit à l'avortement qui n'est pas adossé à des structures de soins accessibles, à des professionnels formés et à une information disponible reste, pour une partie des femmes, une promesse sans contenu. La philosophie morale gagne à dialoguer avec ces analyses au lieu d'opposer l'abstraction conceptuelle à la réalité empirique. La philosophie ne tranche pas ces tensions au sens où elle rendrait un verdict que toutes les parties accepteraient. Elle les clarifie, les articule, teste la cohérence des positions en présence, expose leurs présupposés, et rend possible une délibération plus précise. Pour le citoyen, le législateur, le médecin ou le juge, elle offre des outils conceptuels qui ne dispensent pas du jugement pratique mais qui l'informent. Si le désaccord subsiste, il n'est pas pour autant arbitraire : il peut être mieux compris, mieux exposé et mieux respecté, ce qui n'est pas un mince résultat dans une société démocratique. == Références == {{Références|colonnes = 2}} == Bibliographie == === Références citées dans l'article === ==== Articles et ouvrages fondateurs en éthique analytique ==== * Boonin, David (2002). ''A Defense of Abortion''. Cambridge : Cambridge University Press. * Davis, Nancy (1984). « Abortion and Self-Defense ». ''Philosophy & Public Affairs'', 13(3), 175-207. * Finnis, John (1973). « The Rights and Wrongs of Abortion: A Reply to Judith Thomson ». ''Philosophy & Public Affairs'', 2(2), 117-145. * Foot, Philippa (1967). « The Problem of Abortion and the Doctrine of the Double Effect ». ''Oxford Review'', 5, 5-15. * Hursthouse, Rosalind (1991). « Virtue Theory and Abortion ». ''Philosophy & Public Affairs'', 20(3), 223-246. * Kamm, Frances Myrna (1992). ''Creation and Abortion: A Study in Moral and Legal Philosophy''. New York : Oxford University Press. * Kamm, Frances M. (2023). « Abortion Bans and Cruelty ». ''Journal of Practical Ethics'', 11(1). * Marquis, Don (1989). « Why Abortion is Immoral ». ''The Journal of Philosophy'', 86(4), 183-202. * McIntyre, Alison (2001). « Doing Away with Double Effect ». ''Ethics'', 111(2), 219-255. * McMahan, Jeff (2002). ''The Ethics of Killing: Problems at the Margins of Life''. New York : Oxford University Press. * Quinn, Warren S. (1989). « Actions, Intentions, and Consequences: The Doctrine of Double Effect ». ''Philosophy & Public Affairs'', 18(4), 334-351. * Singer, Peter (1979/2011). ''Practical Ethics'', 3e édition. Cambridge : Cambridge University Press. * Thomson, Judith Jarvis (1971). « A Defense of Abortion ». ''Philosophy & Public Affairs'', 1(1), 47-66. * Tooley, Michael (1972). « Abortion and Infanticide ». ''Philosophy & Public Affairs'', 2(1), 37-65. * Warren, Mary Anne (1973). « On the Moral and Legal Status of Abortion ». ''The Monist'', 57(1), 43-61. ==== Positions restrictives et critique du gradualisme ==== * Beckwith, Francis J. (2007). ''Defending Life: A Moral and Legal Case Against Abortion Choice''. Cambridge : Cambridge University Press. * George, Robert P. et Christopher Tollefsen (2008). ''Embryo: A Defense of Human Life''. New York : Doubleday. * Kaczor, Christopher (2011). ''The Ethics of Abortion: Women's Rights, Human Life, and the Question of Justice''. New York : Routledge. * Lee, Patrick (1996). ''Abortion and Unborn Human Life''. Washington : Catholic University of America Press. ==== Féminismes et études de genre ==== * Badinter, Élisabeth (2010). ''Le Conflit : la femme et la mère''. Paris : Flammarion. * Beauvoir, Simone de (1949/1976). ''Le Deuxième Sexe'', t. II. Paris : Gallimard, coll. « Folio essais ». * Delphy, Christine (1998 et 2001). ''L'Ennemi principal'', 2 vol. Paris : Syllepse. * Fraisse, Geneviève (2007). ''Du consentement''. Paris : Le Seuil. * Gilligan, Carol (1982). ''In a Different Voice: Psychological Theory and Women's Development''. Cambridge (Mass.) : Harvard University Press. * Guillaumin, Colette (1992/2016). ''Sexe, race et pratique du pouvoir. L'idée de nature''. Donnemarie-Dontilly : éditions iXe. * Halimi, Gisèle (1973). ''Avortement : une loi en procès. L'affaire de Bobigny''. Paris : Gallimard. * Halimi, Gisèle (1973). ''La cause des femmes''. Paris : Grasset. * Mackenzie, Catriona (1992). « Abortion and Embodiment ». ''Australasian Journal of Philosophy'', 70(2), 136-155. * MacKinnon, Catharine A. (1991). « Reflections on Sex Equality Under Law ». ''Yale Law Journal'', 100(5), 1281-1328. * Mathieu, Nicole-Claude (1991). ''L'Anatomie politique. Catégorisations et idéologies du sexe''. Paris : Côté-femmes. * Noddings, Nel (1984). ''Caring: A Feminine Approach to Ethics and Moral Education''. Berkeley : University of California Press. * Nussbaum, Martha C. (1999). ''Sex and Social Justice''. New York : Oxford University Press. * Tronto, Joan (1993/2009). ''Un monde vulnérable. Pour une politique du care''. Trad. fr. Hervé Maury. Paris : La Découverte. * Wolf-Devine, Celia (1989). « Abortion and the 'Feminine Voice' ». ''Public Affairs Quarterly'', 3(3), 81-97. ==== Histoire sociale et approche sociologique ==== * Pavard, Bibia (2012). ''Si je veux, quand je veux. Contraception et avortement dans la société française (1956-1979)''. Rennes : Presses universitaires de Rennes. * Haute Autorité de Santé (2018). ''Interruption volontaire de grossesse par méthode médicamenteuse'', recommandation de bonne pratique. Saint-Denis-La-Plaine : HAS. * Sen, Amartya (1992/2000). ''Repenser l'inégalité''. Trad. fr. Paul Chemla. Paris : Le Seuil. ==== Philosophie politique et juridique ==== * Rawls, John (1996). ''Political Liberalism'', édition brochée. New York : Columbia University Press. * Sandel, Michael J. (1984). « Morality and the Liberal Ideal ». ''The New Republic'', 7 mai. * Sandel, Michael J. (1996). ''Democracy's Discontent: America in Search of a Public Philosophy''. Cambridge (Mass.) : Harvard University Press. ==== Bioéthique, handicap, enfance à naître ==== * Parens, Erik et Adrienne Asch (éds.) (2000). ''Prenatal Testing and Disability Rights''. Washington : Georgetown University Press. * Royal College of Obstetricians and Gynaecologists (2022). ''Fetal Awareness: Updated Review of Research and Recommendations for Practice''. Londres : RCOG. * Steinbock, Bonnie (2011). ''Life Before Birth: The Moral and Legal Status of Embryos and Fetuses'', 2e édition. New York : Oxford University Press. ==== Textes classiques cités ==== * Aquin, Thomas d' (1265-1273). ''Somme théologique'', IIa-IIae, question 64, trad. fr. sous la direction du P. A.-M. Roguet, Paris : Éditions du Cerf, 1984. * Locke, John (1689/2001). ''Essai philosophique concernant l'entendement humain'', trad. fr. Pierre Coste, revue par Jean-Michel Vienne, Paris : Vrin. * Rawls, John (1971/1987). ''Théorie de la justice''. Trad. fr. Catherine Audard. Paris : Le Seuil. ==== Textes juridiques ==== * Loi n° 75-17 du 17 janvier 1975 relative à l'interruption volontaire de grossesse (loi Veil). * Loi n° 2001-588 du 4 juillet 2001 relative à l'interruption volontaire de grossesse et à la contraception. * Loi n° 2022-295 du 2 mars 2022 visant à renforcer le droit à l'avortement (loi Gaillot). * Loi constitutionnelle n° 2024-200 du 8 mars 2024 relative à la liberté de recourir à l'interruption volontaire de grossesse. * ''Roe v. Wade'', 410 U.S. 113 (1973). * ''Planned Parenthood of Southeastern Pennsylvania v. Casey'', 505 U.S. 833 (1992). * ''Dobbs v. Jackson Women's Health Organization'', 597 U.S. 215 (2022). * ''McFall v. Shimp'', 10 Pa. D. & C. 3d 90 (1978). === Lectures complémentaires === ==== Ouvrages généraux et anthologies ==== * Baird, Robert M. et Stuart E. Rosenbaum (éds.) (2001). ''The Ethics of Abortion: Pro-Life vs. Pro-Choice'', 3e édition. Buffalo (NY) : Prometheus Books. * Beckwith, Francis J. et Louis P. Pojman (éds.) (1998). ''The Abortion Controversy: 25 Years After Roe v. Wade''. Belmont (CA) : Wadsworth Publishing. * Cohen, Marshall, Thomas Nagel et Thomas Scanlon (éds.) (1974). ''The Rights and Wrongs of Abortion''. Princeton : Princeton University Press. * Feinberg, Joel (éd.) (1984). ''The Problem of Abortion'', 2e édition. Belmont (CA) : Wadsworth Publishing. * Kuhse, Helga et Peter Singer (éds.) (1999). ''Bioethics: An Anthology''. Oxford : Blackwell Publishers. * LaFollette, Hugh (éd.) (2002). ''Ethics in Practice: An Anthology'', 2e édition. Oxford : Blackwell Publishers. * Steinbock, Bonnie (éd.) (2007). ''The Oxford Handbook of Bioethics''. New York : Oxford University Press. * Sumner, L. W. (1981). ''Abortion and Moral Theory''. Princeton : Princeton University Press. * Tooley, Michael (1983). ''Abortion and Infanticide''. Oxford : Clarendon Press. * Warren, Mary Anne (1997). ''Moral Status: Obligations to Persons and Other Living Things''. Oxford : Clarendon Press. ==== Éthique de la vertu et philosophie morale ==== * Anscombe, G. E. M. (1958). « Modern Moral Philosophy ». ''Philosophy'', 33(124), 1-19. * Crisp, Roger (éd.) (1996). ''How Should We Live? Essays on the Virtues''. Oxford : Clarendon Press. * Foot, Philippa (2001). ''Natural Goodness''. Oxford : Oxford University Press. * MacIntyre, Alasdair (1981). ''After Virtue''. Notre Dame : University of Notre Dame Press. ==== Conséquentialisme et utilitarisme ==== * Bentham, Jeremy (1789/2011). ''Introduction aux principes de morale et de législation''. Trad. fr. Centre Bentham. Paris : Vrin. * Mill, John Stuart (1863/1988). ''L'Utilitarisme''. Trad. fr. Georges Tanesse. Paris : Flammarion. * Smart, J. J. C. et Bernard Williams (1973). ''Utilitarianism: For and Against''. Cambridge : Cambridge University Press. ==== Déontologie, droit et philosophie politique ==== * Dworkin, Ronald (1993). ''Life's Dominion: An Argument About Abortion, Euthanasia, and Individual Freedom''. New York : Knopf. * Finnis, John (1980). ''Natural Law and Natural Rights''. Oxford : Clarendon Press. * Gewirth, Alan (1978). ''Reason and Morality''. Chicago : University of Chicago Press. * Hart, H. L. A. (1961). ''The Concept of Law''. Oxford : Clarendon Press. * Kant, Immanuel (1785/1994). ''Fondation de la métaphysique des mœurs'', trad. fr. Alain Renaut, Paris : Flammarion. * Nozick, Robert (1974). ''Anarchy, State, and Utopia''. New York : Basic Books. * Raz, Joseph (1986). ''The Morality of Freedom''. Oxford : Clarendon Press. ==== Bioéthique et éthique médicale ==== * Beauchamp, Tom L. et James F. Childress (2012). ''Principles of Biomedical Ethics'', 7e édition. New York : Oxford University Press. * Engelhardt, H. Tristram Jr. (1996). ''The Foundations of Bioethics'', 2e édition. New York : Oxford University Press. * Gillon, Raanan (1986). ''Philosophical Medical Ethics''. Chichester : John Wiley & Sons. * Strong, Carson (1997). ''Ethics in Reproductive and Perinatal Medicine''. New Haven : Yale University Press. ==== Doctrine du double effet ==== * Boyle, Joseph (1980). « Toward Understanding the Principle of Double Effect ». ''Ethics'', 90(4), 527-538. ==== Métaphysique et identité personnelle ==== * Olson, Eric T. (1997). ''The Human Animal: Personal Identity Without Psychology''. New York : Oxford University Press. * Parfit, Derek (1984). ''Reasons and Persons''. Oxford : Oxford University Press. * Wiggins, David (2001). ''Sameness and Substance Renewed''. Cambridge : Cambridge University Press. ==== Autres ==== * MacKinnon, Catharine A. (1987). ''Feminism Unmodified: Discourses on Life and Law''. Cambridge (Mass.) : Harvard University Press. * Schwarz, Stephen D. (1990). ''The Moral Question of Abortion''. Chicago : Loyola University Press. * Sherwin, Susan (1992). ''No Longer Patient: Feminist Ethics and Health Care''. Philadelphia : Temple University Press. === Ressources en ligne et encyclopédies spécialisées === * Kaczor, Christopher (2014). « Abortion ». ''Internet Encyclopedia of Philosophy''. [https://iep.utm.edu/abortion/] * Manninen, Bertha Alvarez (2018). « The Ethics of Abortion ». ''Stanford Encyclopedia of Philosophy''. [https://plato.stanford.edu/entries/abortion/] * ''Routledge Encyclopedia of Philosophy'' (1998). « Abortion, the ethics of ». Londres : Routledge. === Revues spécialisées === ''Bioethics'' (Wiley-Blackwell) ; ''Cambridge Quarterly of Healthcare Ethics'' (Cambridge University Press) ; ''Hastings Center Report'' (The Hastings Center) ; ''Journal of Medical Ethics'' (BMJ Publishing) ; ''Journal of Medicine and Philosophy'' (Oxford University Press) ; ''Kennedy Institute of Ethics Journal'' (Johns Hopkins University Press) ; ''Philosophy & Public Affairs'' (Princeton University Press) ; ''Public Affairs Quarterly'' (Philosophy Documentation Center) ; ''Journal of Practical Ethics'' (Oxford Uehiro Centre) ; ''Nouvelles Questions Féministes'' (Antipodes) ; ''Revue philosophique de la France et de l'étranger'' (PUF) ; ''Les Études philosophiques'' (PUF) ; ''Travail, genre et sociétés'' (La Découverte). {{Autocat}} a8gxumrgnffdv600mibgxwukqgiinsw Dictionnaire de philosophie/Aristote 0 83057 764917 764801 2026-04-25T06:08:04Z PandaMystique 119061 764917 wikitext text/x-wiki {{DicoPhilo|Aristote}} == Introduction générale : Aristote, le philosophe universel == === Vie et contexte historique === ==== Origines familiales et contexte macédonien ==== Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la prestigieuse corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une longue tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations influentes avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>. Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Ces origines ioniennes expliqueraient en partie son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>. Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, qui était originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera même sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. ==== Formation à l'Académie de Platon (367-347 av. J.-C.) ==== À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, le principal foyer intellectuel et culturel du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, l'école philosophique fondée par Platon en 387 av. J.-C. après son retour de Sicile<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution, véritable prototype des universités futures, dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>. Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie précise. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. Très rapidement, le jeune Aristote se distingua par son intelligence exceptionnelle et son ardeur à l'étude. Platon lui-même l'aurait surnommé le Liseur (''anagnôstês'') ou encore l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms témoignent de la reconnaissance par le Maître des dons hors du commun de son élève. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>. Contrairement à une légende tenace, probablement issue des polémiques ultérieures entre épicuriens et péripatéticiens, Aristote ne rompit jamais avec Platon de son vivant<ref>Les récits de Diogène Laërce évoquant une rupture violente sont aujourd'hui considérés comme des médisances sans fondement historique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments confirment au contraire la profonde amitié et le respect mutuel qui les unirent jusqu'à la fin. Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il célèbre magnifiquement Platon comme le maître qui ne saurait jamais être loué comme il le mériterait par des hommes méchants<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l'''Éthique à Nicomaque'', Aristote écrit ces mots célèbres : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été traduite en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>. Aristote participa activement à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule provocatrice : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la beauté littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>. ==== Voyages et maturation (348-335 av. J.-C.) ==== À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote, qui peut-être avait espéré cette succession, quitte alors Athènes. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne pendant trois ans (347-345), accompagné probablement de Xénocrate, autre disciple de Platon<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y fonde une sorte de succursale de l'Académie et poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris d'importantes observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l'''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>. Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et finalement exécuté<ref>Malgré les tortures, Hermias refusa de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote, profondément affecté par cette mort héroïque, composa un célèbre Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias, témoignant de l'attachement profond qu'il lui porta. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>. Après la mort d'Hermias, Aristote quitte Assos pour se rendre à Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l'''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>. ==== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ==== En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Le choix d'Aristote par Philippe s'explique à la fois par leurs relations antérieures et par la réputation encyclopédique qu'avait acquise le philosophe. Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza, ville où Philippe avait installé son fils<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>. L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Aristote aurait fait connaître à Alexandre une édition annotée de l'''Iliade'' d'Homère, que le conquérant emportera dans toutes ses expéditions. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte qu'Alexandre disait aimer Aristote autant que son père car, disait-il, « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa sans doute à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu, pour l'édification du jeune prince<ref>Ce traité devait exposer la conception aristotélicienne du bon gouvernement monarchique. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>. Toutefois, si les relations entre le maître et l'élève furent marquées par une affection réciproque, Alexandre ne suivit que fort peu les conseils de son précepteur. Alors qu'Aristote prêchait la modération et la distinction entre Grecs et Barbares<ref>Aristote considérait les Barbares comme naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux, allant jusqu'à adopter certains usages perses et prétendre à une origine divine<ref>Ces orientations politiques d'Alexandre furent en contradiction complète avec la pensée politique d'Aristote. Voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lorsque Alexandre part pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Callisthène, fils de Damastos et neveu d'Aristote, avait collaboré avec le philosophe pour l'établissement de la liste des vainqueurs aux Jeux Pythiques de Delphes. Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Mais Callisthène, refusant d'adopter la proskynèse (prosternation devant le roi) exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C., probablement sous l'accusation d'avoir participé à une conjuration<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin tragique. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>. ==== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ==== En 335-334 av. J.-C., après la défaite définitive d'Athènes face à la Macédoine à Chéronée (338 av. J.-C.) et l'affermissement de l'hégémonie macédonienne sur la Grèce, Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), ainsi nommé parce que situé près du temple d'Apollon Lycien<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes et ouvert au public en 2014. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>. Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période d'intense activité intellectuelle, où il poursuit ses cours, dirige des recherches collectives et rédige la plupart de ses traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Son enseignement se déployait, selon les témoignages antiques, selon deux modalités : le matin, il dispensait des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux initiés (enseignement acroamatique ou ésotérique) ; l'après-midi, il donnait des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large (enseignement exotérique)<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>. Aristote professait en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une vaste bibliothèque, la première grande bibliothèque privée du monde grec, et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Alexandre aurait aidé financièrement son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23.</ref>. Il entreprit également avec ses collaborateurs la rédaction monumentale des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre colossale de recherche historique et politique fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>. ==== Exil et mort (323-322 av. J.-C.) ==== À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une violente réaction antimacédonienne éclate à Athènes, dirigée par le parti nationaliste de Démosthène et d'Hypéride<ref>Cette réaction avait été préparée pendant la captivité de Démosthène et éclata au grand jour à la nouvelle de la mort d'Alexandre. Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque (étranger domicilié) proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien ni le droit de participer à la vie publique. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation d'impiété rappelait évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>. Sans attendre le jugement qui le condamnerait certainement, Aristote quitte précipitamment Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère, où il possédait des biens hérités par elle<ref>En partant, Aristote aurait déclaré, selon Aulu-Gelle, vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion évidente au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse, son plus fidèle disciple et collaborateur<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C., poursuivant l'œuvre encyclopédique de son maître. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>. Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, très probablement des suites de la maladie d'estomac chronique dont il avait souffert toute sa vie<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, est rejetée par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé intégralement par Diogène Laërce (V, 11-16), témoigne de sa sollicitude envers tous les membres de sa maisonnée, esclaves compris, et prescrit que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire, sa ville natale, et les citoyens de Stagire érigèrent en son honneur un monument funéraire (l'''Aristoteleion'') qui devint un lieu de rassemblement civique<ref>Les habitants de Stagire instituèrent également des fêtes annuelles en l'honneur de leur illustre concitoyen. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>. Aristote laissait deux enfants : Pythias, née de son premier mariage avec Pythias, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos, qui lui donna également une fille<ref>Nicomaque mourut jeune, mais c'est à lui que fut dédiée l'''Éthique à Nicomaque'', peut-être publiée après sa mort par Nicomaque lui-même ou par un disciple. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis, la mère de Nicomaque, lui assurant des moyens d'existence confortables et la recommandant aux bons soins de ses amis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>. === L'œuvre aristotélicienne : constitution et transmission === La question de la constitution et de la transmission de l'œuvre d'Aristote représente l'un des problèmes les plus complexes de l'histoire de la philosophie antique. Notre accès actuel à la pensée du Stagirite est le résultat d'un long processus historique marqué par des péripéties qui ont profondément affecté la forme sous laquelle nous lisons aujourd'hui ses écrits. ==== La double nature de l'œuvre aristotélicienne ==== L'œuvre d'Aristote se composait à l'origine de deux types d'écrits bien distincts, qui correspondent à deux publics différents et à deux modes d'exposition philosophique. D'une part, les '''écrits exotériques''' (ἐξωτερικοὶ λόγοι), destinés au grand public et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Aristote, ''Œuvres'', éd. Firmin-Didot, Paris, 1854-1869 ; cf. aussi Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27</ref>. Ces dialogues de jeunesse, dont Cicéron vantait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'' (361 av. J.-C.), l'''Eudème ou De l'âme'' (354 av. J.-C.) sur l'immortalité de l'âme, le ''Protreptique'' (353 av. J.-C.) et le traité ''Sur la philosophie'' (348-345 av. J.-C.)<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886</ref>. Ces œuvres, mieux connues durant l'Antiquité que les traités techniques, ne nous sont malheureusement parvenues que sous forme de fragments épars. D'autre part, les '''écrits acroamatiques''' ou '''ésotériques''' (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples avancés du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7</ref>. Ces textes, qui constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui, prenaient probablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs au sein du Lyce. La différence entre ces deux catégories ne portait pas tant sur les questions traitées que sur la forme et les procédés d'argumentation et d'exposition<ref>Simplicius, ''In Physica'', CAG IX, p. 8, 15-23</ref>. ==== Le sort de la bibliothèque d'Aristote ==== L'histoire de la transmission des œuvres d'Aristote est intimement liée au destin de sa bibliothèque personnelle, qui contenait ses propres écrits ainsi que ceux de son école. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à '''Nélée de Scepsis''', fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3</ref>. Nélée, en quittant Athènes pour retourner dans sa cité natale de Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, gens peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame, qui cherchaient à enrichir leur célèbre bibliothèque<ref>Strabon, ''Géographie'', XIII, 1, 54 : « Lorsqu'ils vinrent à savoir quelle ardeur mettaient les Attalides, auxquels leur ville obéissait, à assembler des livres pour la bibliothèque de Pergame, ils cachèrent les leurs sous terre, dans une cave, où ils furent gâtés par l'humidité et par les vers »</ref>. Les ouvrages restèrent ainsi enfouis pendant près de deux siècles, dans des conditions qui endommagèrent gravement les manuscrits. Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par '''Apellicon de Téos''', un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36</ref>. Apellicon, davantage amateur de livres (φιλόβιβλος) que véritable philosophe, entreprit de restaurer les manuscrits endommagés. Cependant, en tentant de combler les lacunes et de reconstituer les passages illisibles, il commit de nombreuses erreurs qui altérèrent le texte original<ref>Strabon, ''Géographie'', XIII, 1, 54 : « Apellicon était un amoureux des livres plutôt qu'un philosophe ; c'est pourquoi, en cherchant à réparer les dégâts, il fit de nouvelles copies en comblant mal les lacunes, et publia les livres pleins d'erreurs »</ref>. ==== Le transfert à Rome et l'édition d'Andronicos ==== En 86 av. J.-C., lors de la prise d'Athènes par les troupes romaines, le général '''Sylla''' s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54</ref>. À Rome, ces manuscrits furent confiés au grammairien '''Tyrannion d'Amisos''', qui en fit des copies et commença un travail préliminaire d'organisation<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1</ref>. C'est finalement '''Andronicos de Rhodes''', onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 : « Andronicos divisa les œuvres d'Aristote et de Théophraste en traités, rassemblant les matériaux connexes au même endroit » ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique qui n'était probablement pas celui d'Aristote lui-même, en regroupant les traités par affinité de contenu. C'est ainsi que naquit la division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d''''Organon'''), physiques, biologiques, métaphysiques, éthiques et politiques<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8</ref>. C'est également à Andronicos que l'on doit le titre de '''Métaphysique''' (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques », titre qu'il donna à un ensemble de quatorze livres qu'il plaça après les traités de physique dans son édition<ref>Voir Métaphysique, éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; bien que le terme apparaisse déjà chez Théophraste, c'est l'édition d'Andronicos qui l'a consacré</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3</ref>. ==== Les conséquences pour notre accès au texte ==== Cette histoire mouvementée a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. D'abord, la perte quasi-totale des écrits exotériques nous prive d'un pan entier de son œuvre, celui qui était le mieux connu dans l'Antiquité et qui témoignait probablement d'une phase plus platonicienne de sa pensée. Ensuite, l'état fragmentaire et endommagé des manuscrits retrouvés, aggravé par les restaurations maladroites d'Apellicon, a introduit de nombreuses corruptions dans le texte. Enfin, l'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote. Il faut également noter que contrairement à la légende propagée par certaines sources antiques, les œuvres d'Aristote n'étaient pas totalement inconnues entre la mort de Théophraste et leur « redécouverte » au Ier siècle av. J.-C. Des témoignages indiquent que certains textes circulaient et étaient étudiés, notamment à Alexandrie<ref>Athénée, ''Deipnosophistes'', I, 3a-b, affirme que Ptolémée II Philadelphe aurait acheté de Nélée les livres d'Aristote et de Théophraste pour la bibliothèque d'Alexandrie, contredisant ainsi Strabon</ref>. Les philosophes hellénistiques, notamment les stoïciens et les épicuriens, connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel à ses écrits<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31</ref>. Le texte d'Aristote tel que nous le connaissons aujourd'hui est donc le produit d'une longue chaîne de transmission qui a commencé avec l'édition d'Andronicos et s'est poursuivie à travers les commentateurs néoplatoniciens de l'Antiquité tardive (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle grâce aux traductions latines<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972</ref>. Chaque étape de cette transmission a laissé sa marque sur le texte et son interprétation, faisant de l'œuvre aristotélicienne un palimpseste dont il est parfois difficile de retrouver la strate originelle. === Aristote et Platon : continuité et rupture === La relation intellectuelle entre Aristote et Platon demeure l'une des questions les plus débattues de l'histoire de la philosophie. Deux traditions interprétatives se sont longtemps affrontées. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, insistaient sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32</ref>. À l'inverse, la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences profondes, au point que le poète anglais Samuel Taylor Coleridge affirmait : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90</ref>. La vérité se situe entre ces deux extrêmes. Si Aristote s'oppose à Platon sur des questions ontologiques fondamentales, il demeure profondément tributaire de l'héritage platonicien et socratique. Comme il l'écrit lui-même dans un passage célèbre de l'''Éthique à Nicomaque'' : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44</ref>. ==== La critique aristotélicienne des Idées platoniciennes ==== ===== Le rejet de la séparation (''chôrismos'') ===== L'un des points de rupture les plus décisifs entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315</ref>. Aristote refuse catégoriquement cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique et parfois virulente de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2</ref>. Ses objections portent sur trois points principaux. Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles. Comme il l'écrit avec ironie : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement que nous observons constamment dans le monde sensible. Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs''), c'est-à-dire le principe qui déclenche effectivement le changement<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29</ref>. Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi de suite à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10</ref>. Cette régression infinie montre l'absurdité de poser des Idées séparées comme principes explicatifs. Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4</ref>. Au lieu d'expliquer le monde sensible, on crée un second monde qui requiert lui-même une explication. Aristote estime que c'est là une violation du principe d'économie ontologique : « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60</ref>. ===== L'hylémorphisme aristotélicien ===== Face à la théorie platonicienne de la participation, Aristote propose une solution originale : la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12</ref>. La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. Par exemple, la forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'', littéralement « ce qu'était le fait d'être »)<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2</ref>. Comme l'explique Aristote : « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372</ref>. Cette conception hylémorphique permet à Aristote de résoudre plusieurs problèmes que posait la théorie platonicienne. D'abord, elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. La matière possède en puissance la forme qui s'actualisera en elle, et ce passage s'effectue grâce à une cause efficiente qui possède déjà cette forme en acte<ref>Aristote, ''Métaphysique'', Θ, 6-8, 1048a25-1050b6 ; ''Physique'', III, 1, 201a10-11</ref>. Ensuite, elle sauvegarde l'individualité des substances premières. Pour Aristote, les véritables réalités sont les individus concrets (''tode ti'', « ceci particulier »), comme « cet homme-ci » ou « ce cheval-ci »<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3</ref>. La forme n'existe que dans les individus qu'elle informe, et non dans un monde séparé. Enfin, elle unifie forme et finalité. La forme est à la fois cause formelle et cause finale, car elle est ce vers quoi tend le développement naturel de la chose. « La nature, en tant que génération, est un chemin vers la nature » au sens de forme achevée<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27</ref>. Dans la génération d'un chêne à partir d'un gland, la forme du chêne est à la fois le principe structurant qui guide le développement et la fin vers laquelle tend ce processus. ==== La critique de la participation et de l'imitation ==== ===== L'ambiguïté conceptuelle de la participation ===== Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique vivement ces notions, les considérant comme métaphoriques et vides de sens explicatif<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26</ref>. La notion de participation pose en effet de redoutables problèmes conceptuels. Platon lui-même les a identifiés dans le ''Parménide'', dialogue où le vieux Parménide soumet le jeune Socrate à un interrogatoire serré sur la théorie des Idées<ref>Platon, ''Parménide'', 130e-134e</ref>. Comment une chose participe-t-elle d'une Idée ? Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée, qui est une, se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise, ce qui contredit son unité et son indivisibilité<ref>Platon, ''Parménide'', 131a-e</ref>. Aristote estime que Platon n'a jamais résolu ces difficultés et s'est contenté d'images poétiques. « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21</ref>. Pour Aristote, la participation n'est qu'un nom différent pour désigner le même problème : « Ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49</ref>. ===== La ressemblance par la forme immanente ===== Pour Aristote, la ressemblance entre les individus d'une même espèce ne s'explique pas par la participation à une Idée transcendante, mais par la possession d'une même forme immanente. Cette forme se transmet dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna''), c'est-à-dire qu'un être possédant déjà la forme humaine en acte produit un autre être possédant cette même forme<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8</ref>. Dans la génération, trois facteurs interviennent : la matière (fournie par la femelle), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32</ref>. Le géniteur, possédant la forme en acte, la transmet à la matière fournie par la génitrice, qui la possédait seulement en puissance. Ainsi, la ressemblance entre père et fils s'explique par la transmission d'une même forme immanente, sans qu'il soit besoin de recourir à une Idée séparée de l'Homme. La forme n'est donc pas un modèle extérieur que les choses imiteraient, mais un principe immanent de structuration et de développement qui se perpétue de génération en génération. Comme l'écrit Aristote : « La forme et la définition sont identiques dans les choses qui naissent les unes des autres »<ref>Aristote, ''Métaphysique'', Z, 8, 1034a5-8, trad. J. Tricot, op. cit., t. I, p. 385</ref>. ==== Substance, essence et ''ousia'' ==== ===== Les sens multiples de l'''ousia'' ===== Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations profondément différentes chez Platon et Aristote, bien que les deux philosophes l'utilisent pour désigner ce qui est véritablement réel. Chez Platon, l’''ousia'' désigne principalement l'Idée, la réalité véritable qui possède une existence stable, immuable et éternelle, par opposition aux choses sensibles qui sont en perpétuel devenir et ne possèdent qu'une existence dérivée et illusoire<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d</ref>. Dans le ''Phédon'', Socrate affirme que « chaque chose qui est en soi, l'ousia, est toujours identique à elle-même de la même manière »<ref>Platon, ''Phédon'', 78d, trad. M. Dixsaut, op. cit., p. 293</ref>. L'''ousia'' platonicienne est donc séparée du monde sensible et accessible uniquement par l'intellect pur. Chez Aristote, l'''ousia'' a plusieurs sens, mais désigne avant tout la substance première, c'est-à-dire l'individu concret qui existe réellement et par lui-même : « cet homme-ci », « ce cheval-ci »<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7</ref>. Dans les ''Catégories'', Aristote définit la substance première comme « ce qui n'est ni affirmé d'un sujet ni dans un sujet, par exemple, l'homme individuel ou le cheval individuel »<ref>Aristote, ''Catégories'', 5, 2a11-13, trad. F. Ildefonse & J. Lallot, Paris, Seuil, 2002, p. 15</ref>. L'''ousia'' aristotélicienne se caractérise par trois traits fondamentaux : # Elle n'est pas dans un sujet : elle ne se dit pas d'autre chose mais existe par elle-même # Elle est séparée (''chôriston'') : elle peut exister indépendamment des accidents qui l'affectent # Elle est déterminée (''tode ti'') : elle est un « ceci particulier », un individu identifiable<ref>Aristote, ''Métaphysique'', Z, 3, 1029a27-28 ; Δ, 8, 1017b23-26</ref> ===== Substance première et substance seconde ===== Aristote distingue, dans les ''Catégories'', entre substance première et substance seconde. La substance première est l'individu concret (Socrate, Bucéphale), tandis que la substance seconde est l'espèce ou le genre auquel appartient cet individu (l'homme, l'animal)<ref>Aristote, ''Catégories'', 5, 2a11-19, 2b7-29</ref>. Les substances secondes sont dites substances uniquement parce qu'elles sont prédiquées des substances premières et révèlent ce qu'elles sont essentiellement. Cette distinction marque une rupture ontologique majeure avec Platon. Pour ce dernier, l'universel (l'Idée) est la réalité première et véritable, tandis que l'individu sensible n'est qu'une ombre ou une copie imparfaite. Pour Aristote, c'est exactement l'inverse : l'individu est la substance première, et l'universel n'existe que dans les individus ou dans l'esprit qui les pense. Comme Aristote le formule catégoriquement dans la ''Métaphysique'' : « Aucun universel n'est une substance »<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; Z, 16, 1040b23-1041a5 ; M, 10, 1086b14-1087a25</ref>. Cette thèse a des conséquences considérables. Si seuls les individus existent véritablement, alors la science, qui porte sur l'universel, ne porte pas directement sur ce qui existe, mais sur les formes universelles abstraites à partir des individus. Aristote résout cette tension en distinguant l'ordre de l'être (où l'individu est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 3, 1029b3-12 ; ''Seconds Analytiques'', I, 2, 71b33-72a5</ref>. ===== La forme comme substance ===== Dans la ''Métaphysique'', Aristote développe une conception plus complexe où la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance. Cette évolution s'explique par le fait qu'Aristote cherche à identifier ce qui, dans le composé hylémorphique, mérite le plus le nom de substance<ref>Aristote, ''Métaphysique'', Z, 3, 1028b33-1029a7 ; Z, 7, 1032b1-2 ; Z, 17, 1041b7-9</ref>. Cependant, cette forme n'est pas l'Idée platonicienne. Elle s'en distingue sur trois points essentiels : # Elle est immanente aux choses, non séparée. La forme du cheval n'existe que dans les chevaux individuels # Elle est le principe d'unité du composé matière-forme. Elle fait que le composé est un être et non une simple agrégation # Elle est l'actualité (''energeia'') de la chose, son essence en acte, par opposition à la matière qui est en puissance<ref>Aristote, ''Métaphysique'', H, 2, 1042b9-11 ; Θ, 8, 1050a15-16</ref> La forme aristotélicienne s'apparente davantage à la définition essentielle de la chose (''logos tês ousias'') qu'à une entité séparée existant par elle-même. Elle est « ce qui est signifié par la définition »<ref>Aristote, ''Métaphysique'', Z, 4, 1029b19-20 ; Z, 10, 1035b31-1036a12</ref>. Ainsi, la forme de l'homme est ce que définit la définition « animal rationnel mortel », et cette forme existe uniquement dans les hommes individuels qui la réalisent. ==== Éléments de continuité entre Platon et Aristote ==== ===== La primauté de la forme sur la matière ===== Malgré leurs divergences ontologiques fondamentales, Platon et Aristote partagent une conviction commune : la forme (ou l'Idée) est supérieure à la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon, seules les Idées sont pleinement réelles (''ontôs onta'') et pleinement connaissables (''epistêta''), tandis que la matière, le réceptacle (''chôra'') du ''Timée'', est principe d'indétermination, de multiplicité et d'altération. Elle n'est ni intelligible ni perceptible, mais saisissable seulement par un « raisonnement bâtard »<ref>Platon, ''Timée'', 49a-52d ; 51a-52a</ref>. C'est elle qui explique pourquoi les choses sensibles sont changeantes, multiples et imparfaites. Pour Aristote également, la matière pure, prise en elle-même et abstraction faite de toute forme, est indéterminée (''aoriston'') et inconnaissable. « La matière en soi est inconnaissable »<ref>Aristote, ''Métaphysique'', Z, 10, 1036a8-9 ; cf. Z, 3, 1029a20-26</ref>. Seule la forme rend la chose intelligible et définissable. C'est elle qui fait qu'une chose est ce qu'elle est et qui la rend connaissable par la science. Comme l'écrit Aristote : « Ce que nous appelons la forme ou la substance, c'est ce dont l'énoncé est une définition »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372</ref>. Cette primauté de la forme se manifeste aussi dans le fait que, pour les deux philosophes, la perfection d'une chose consiste dans l'actualisation complète de sa forme, et que les déficiences s'expliquent par la résistance ou les limitations de la matière. Chez Platon, les choses sensibles sont imparfaites parce qu'elles ne peuvent réaliser parfaitement les Idées à cause de leur nature matérielle. Chez Aristote, les monstres et les anomalies s'expliquent par le fait que la matière ne se laisse pas toujours informer conformément à la forme spécifique<ref>Aristote, ''De la Génération des Animaux'', IV, 3, 767b5-15 ; 768b15-25</ref>. ===== La finalité dans la nature ===== Platon et Aristote partagent une vision téléologique de la nature, c'est-à-dire l'idée que les processus naturels sont orientés vers des fins et que le monde possède une structure rationnelle et ordonnée. Dans le ''Timée'', Platon présente le cosmos comme l'œuvre d'un Démiurge divin qui organise la matière chaotique en ayant les yeux fixés sur les Idées éternelles. Le Démiurge, « voulant que toutes choses soient bonnes et que rien ne soit mauvais dans la mesure du possible », façonne le monde sensible à l'image du monde intelligible<ref>Platon, ''Timée'', 28a-30c ; 29d-30a</ref>. Cette orientation vers le Bien confère au cosmos sa structure rationnelle et harmonieuse. Aristote reprend cette conception finaliste, mais l'intériorise et la naturalise. La nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9</ref>. Chaque être naturel tend vers sa forme achevée comme vers sa fin naturelle : le gland tend à devenir chêne, l'enfant tend à devenir adulte. Comme l'écrit Aristote : « La nature ne fait rien en vain, et de toutes choses elle fait toujours la meilleure possible dans chaque genre »<ref>Aristote, ''Du Ciel'', II, 5, 288a2-3 ; cf. ''Des Parties des Animaux'', III, 1, 661b23-24</ref>. Dans les deux cas, la finalité garantit l'intelligibilité du monde naturel et permet de le comprendre non comme un chaos de mouvements aléatoires, mais comme un ordre structuré où chaque chose a sa place et sa raison d'être. La forme est à la fois modèle et fin du développement naturel. ===== La connaissance par les causes ===== Platon et Aristote s'accordent sur le fait que la véritable connaissance scientifique (''epistêmê'') consiste à connaître les causes (''aitiai'') des choses et non simplement à constater leur existence. Dans le ''Phédon'', Socrate raconte sa déception face aux philosophes de la nature présocratiques. Lorsqu'il apprit qu'Anaxagore posait l'Intelligence (''Nous'') comme principe du cosmos, il espéra trouver enfin des explications véritablement causales. Mais Anaxagore se contentait d'invoquer des causes mécaniques (l'air, l'éther, l'eau) sans jamais expliquer pourquoi l'Intelligence avait disposé chaque chose de la meilleure manière possible. Pour Socrate-Platon, une véritable explication doit remonter au Bien, cause finale de toute chose<ref>Platon, ''Phédon'', 96a-99d ; 97b-99c</ref>. Aristote approuve cette exigence et la systématise dans sa doctrine des quatre causes. Toute science véritable doit expliquer non seulement que quelque chose est (''hoti''), mais aussi pourquoi il est (''dioti''). Elle doit identifier la cause matérielle (ce dont une chose est faite), la cause formelle (ce qu'elle est essentiellement), la cause efficiente (ce qui l'a produite) et la cause finale (ce en vue de quoi elle existe)<ref>Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4 ; ''Métaphysique'', A, 3, 983a24-b6</ref>. Cependant, Aristote reproche à Platon de n'avoir effectivement utilisé que deux des quatre causes : la cause formelle (les Idées) et la cause matérielle (la matière ou le réceptacle). Platon aurait négligé la cause efficiente (le principe du mouvement) et la cause finale, ou du moins ne les aurait pas clairement distinguées de la cause formelle<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4</ref>. C'est ce manque qui expliquerait l'incapacité du platonisme à rendre compte du devenir et du mouvement dans la nature. ===== La définition et l'universel ===== Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier. On ne peut définir un individu comme Socrate ou Callias, mais seulement l'espèce à laquelle il appartient (l'homme) ou le genre dont relève cette espèce (l'animal)<ref>Platon, ''Théétète'', 201c-210b ; ''Sophiste'', 218b-221c ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7 ; ''Seconds Analytiques'', II, 13, 97b26-98a17</ref>. Dans le ''Théétète'', Platon montre que la connaissance (''epistêmê'') ne peut être réduite à la sensation ni à l'opinion vraie, car la sensation porte sur le particulier changeant tandis que la connaissance requiert la saisie de l'universel stable. De même, dans le ''Sophiste'', la méthode de division dichotomique (''diairesis'') permet de définir une Idée en la divisant progressivement jusqu'à isoler son essence spécifique<ref>Platon, ''Sophiste'', 218b-221c ; 264c-268d</ref>. Aristote reprend cette exigence mais en tire des conclusions opposées. Pour Platon, le fait que la définition porte sur l'universel prouve que seul l'universel (l'Idée) est pleinement connaissable et réel. Pour Aristote, cela montre que la connaissance scientifique porte certes sur l'universel, mais que la réalité réside dans le particulier. La définition exprime la forme universelle (l'homme est un animal rationnel), mais cette forme n'existe qu'instanciée dans des individus concrets (Socrate, Callias, Platon)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; Z, 15, 1039b27-1040a7 ; M, 10, 1086b14-1087a25</ref>. Ainsi, Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier). Cette distinction lui permet de concilier le réalisme (seuls les individus existent) avec l'exigence de scientificité (la science porte sur l'universel). ==== La dialectique et la méthode philosophique ==== ===== L'héritage socratique commun ===== Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate. Cette méthode consiste à progresser vers la vérité par l'examen critique des opinions (''doxai'') et par le dialogue argumenté qui met à l'épreuve les thèses avancées<ref>Platon, ''République'', VII, 533c-534e ; ''Sophiste'', 253b-254b ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4</ref>. Dans les dialogues platoniciens, Socrate procède systématiquement par questions et réponses (''elenchus''), examinant les opinions de ses interlocuteurs pour en montrer les contradictions internes et les conduire progressivement vers la vérité. Cette méthode suppose que la vérité n'est pas simplement transmise du maître à l'élève, mais découverte par l'âme elle-même à travers un processus d'examen rationnel<ref>Platon, ''Ménon'', 81a-86c ; ''Théétète'', 148e-151d</ref>. Aristote conserve cette approche dialectique dans ses traités. Il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), puis examine les difficultés (''aporiai'') que soulève le sujet, avant de proposer sa propre solution. Cette méthode apparaît clairement dans l'''Éthique à Nicomaque'' : « Comme pour les autres sujets, il faut, après avoir exposé les phénomènes et d'abord parcouru les difficultés, démontrer, si possible, la vérité de toutes les opinions relatives à ces affections de l'âme, ou du moins du plus grand nombre et des plus autorisées »<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7, trad. J. Tricot, op. cit., p. 317</ref>. Cependant, la portée de la dialectique diffère chez les deux philosophes. Pour Platon, la dialectique est la méthode suprême de la philosophie, celle qui permet de s'élever jusqu'à la contemplation des Idées et du Bien. Le dialecticien est le véritable philosophe<ref>Platon, ''République'', VII, 532a-535a ; 537c-539d</ref>. Pour Aristote, la dialectique est un outil préparatoire utile, notamment pour examiner les opinions reçues et identifier les apories, mais elle ne constitue pas une science à proprement parler, car elle ne démontre rien de façon apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26 ; B, 1, 995a24-b4</ref>. La véritable science procède par démonstration à partir de principes premiers nécessaires et vrais. ===== Le rôle de l'expérience sensible ===== Un point de divergence majeur concerne le rôle de l'expérience sensible (''aisthêsis'') dans la connaissance. Pour Platon, les sens nous trompent et nous maintiennent dans l'ignorance (''agnoia'') ou au mieux dans l'opinion (''doxa''). La véritable connaissance (''epistêmê'') requiert de se détourner du sensible pour se tourner vers l'intelligible pur, accessible uniquement par l'intellect (''nous''). Dans le ''Phédon'', Socrate affirme que « tant que nous aurons notre corps et que notre âme sera pétrie avec cette chose mauvaise, jamais nous ne posséderons en suffisance l'objet de notre désir. Or, cet objet, nous l'avons dit, c'est le vrai »<ref>Platon, ''Phédon'', 66b, trad. M. Dixsaut, op. cit., p. 251</ref>. L'allégorie de la caverne dans la ''République'' illustre dramatiquement cette dévalorisation du sensible : les prisonniers enchaînés qui contemplent les ombres sur la paroi représentent l'humanité ordinaire, prisonnière des apparences sensibles<ref>Platon, ''République'', VII, 514a-517c</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible. Certes, la science porte sur l'universel et les causes, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê''). Comme Aristote l'affirme dans le célèbre chapitre final des ''Seconds Analytiques'' : « C'est donc évidemment par induction que nous devons connaître les principes premiers, car c'est aussi de cette façon que la sensation produit en nous l'universel »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242</ref>. Toute connaissance commence donc par la sensation, et l'intellect ne possède rien qui ne soit d'abord passé par les sens<ref>Aristote, ''De l'Âme'', III, 8, 432a3-10</ref>. Cette différence d'attitude se manifeste particulièrement dans leurs travaux scientifiques. Platon construit des modèles mathématiques abstraits (comme dans le ''Timée'') sans se soucier outre mesure de leur adéquation aux observations empiriques. Aristote consacre au contraire une part immense de son œuvre à l'observation minutieuse des phénomènes naturels, notamment dans ses traités biologiques. Il reproche d'ailleurs aux Platoniciens de « négliger les faits » au profit de raisonnements abstraits : « Ceux qui, habitués aux raisonnements dialectiques, négligent les faits, après n'avoir considéré qu'un petit nombre de faits, légifèrent trop rapidement »<ref>Aristote, ''De la Génération et de la Corruption'', I, 2, 316a5-14, trad. C. Mugler, Paris, Les Belles Lettres, 1966, p. 6</ref>. ==== Conclusion : rupture dans la continuité ==== La relation entre Aristote et Platon illustre parfaitement cette formule célèbre, attribuée à Aristote bien qu'elle ne se trouve pas littéralement dans ses œuvres : « Platon m'est cher, mais la vérité m'est plus chère encore »<ref>Cette formule résume l'esprit du passage d'Aristote, ''Éthique à Nicomaque'', I, 6, 1096a11-17, traduit librement en latin par l'adage ''Amicus Plato, sed magis amica veritas''</ref>. Aristote rejette fondamentalement plusieurs thèses centrales du platonisme : la séparation des Idées, la participation comme mode de relation entre sensible et intelligible, la dévalorisation du monde sensible et de l'individu concret, l'autonomie ontologique de l'universel. Ces rejets ne sont pas de simples corrections de détail, mais impliquent une réorientation complète de la métaphysique. Pourtant, Aristote conserve et approfondit certaines intuitions fondamentales de Platon : la primauté de la forme sur la matière, la finalité dans la nature, l'exigence d'expliquer par les causes, la nécessité de définir l'universel pour fonder la science. Il estime avoir sauvé ce qu'il y a de vrai dans le platonisme tout en éliminant les erreurs métaphysiques qui en compromettaient la validité. Cette attitude n'est pas contradictoire. En ancrant la forme dans le monde sensible et en faisant de l'individu concret la substance première, Aristote pense avoir rendu compte de la structure rationnelle et intelligible du réel sans recourir à un dualisme métaphysique intenable. La forme n'est plus un modèle transcendant que les choses imiteraient imparfaitement, mais le principe immanent qui les structure et les fait être ce qu'elles sont. La rupture est donc profonde, mais elle s'opère dans la continuité d'un même questionnement sur l'être, l'essence, la connaissance et le Bien. En ce sens, l'aristotélisme peut être compris comme une naturalisation du platonisme : la forme descend du ciel des Idées pour s'incarner dans les choses mêmes, le Bien n'est plus au-delà de l'essence mais se réalise dans l'accomplissement de la nature propre de chaque être, et la philosophie, tout en restant science de l'universel, reconnaît que seuls existent les individus concrets dans lesquels cet universel se réalise. Cette tension créatrice entre continuité et rupture explique pourquoi la tradition philosophique ultérieure n'a jamais pu trancher définitivement entre platonisme et aristotélisme, mais a constamment oscillé entre ces deux pôles, cherchant tantôt à les concilier (comme les néoplatoniciens et Thomas d'Aquin), tantôt à radicaliser leur opposition (comme les nominalistes médiévaux ou les empiristes modernes). La querelle entre Platon et Aristote demeure ainsi l'une des plus fécondes de l'histoire de la métaphysique occidentale. == Première partie : L'Organon ou les outils de la pensée == === Chapitre I : Les Catégories – Les genres suprêmes de l'être === ==== La classification première de la réalité ==== Au commencement de son investigation philosophique, Aristote pose une question fondamentale : comment classer et ordonner la multiplicité des choses que nous rencontrons dans le monde ? Sa réponse prend la forme d'une doctrine des catégories (''katêgoriai''), terme qui signifie littéralement « prédicats » ou « attributions ». Ces catégories constituent les genres suprêmes de l'être, c'est-à-dire les classes les plus générales sous lesquelles tout ce qui existe peut être rangé<ref>Aristote, ''Catégories'', 4, 1b25-2a4, dans ''Œuvres complètes'', dir. P. Pellegrin, Flammarion, Paris, 2014</ref>. Dans le traité des ''Catégories'', Aristote présente une liste canonique de dix catégories qui détermine l'ensemble des modes selon lesquels l'être se dit. « Chacun des termes qui sont dits sans aucune combinaison », écrit-il, « indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') »<ref>Aristote, ''Catégories'', 4, 1b25-27, trad. R. Bodéüs, Les Belles Lettres, Paris, 2001</ref>. Cette énumération mérite qu'on s'y arrête. La substance, par exemple, désigne ce qu'est un être : un homme, un cheval. La quantité exprime l'extension : long de deux coudées, de trois coudées. La qualité caractérise la nature : blanc, instruit. La relation établit un rapport : double, moitié, plus grand. Le lieu situe dans l'espace : au Lycée, sur la place. Le temps inscrit dans la durée : hier, l'an dernier. La position indique l'attitude : être couché, être assis. La possession marque l'avoir : être chaussé, être armé. L'action et la passion expriment l'agir et le pâtir : couper ou être coupé, brûler ou être brûlé<ref>Aristote, ''Catégories'', 4, 1b25-2a10, dans P. Pellegrin dir., ''Dictionnaire Aristote'', Ellipses, Paris, 2007, p. 176-178</ref>. ==== La primauté ontologique de la substance ==== Parmi ces dix catégories, l'une occupe une place privilégiée : la substance. Aristote affirme sans ambages que « la substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d'un certain sujet et n'est pas dans un certain sujet ; par exemple tel homme ou tel cheval »<ref>Aristote, ''Catégories'', 5, 2a11-14, trad. R. Bodéüs, op. cit.</ref>. Cette définition capitale établit la substance première (''prôtê ousia'') comme le fondement de toute réalité. Pourquoi cette primauté ? Parce que toutes les autres catégories présupposent l'existence de la substance. On ne peut concevoir une couleur sans un corps coloré, une grandeur sans quelque chose de grand, une action sans un agent. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances », explique le Stagirite<ref>Aristote, ''Catégories'', 5, 2a34-2b6</ref>. Si les substances premières n'existaient pas, il serait impossible que quoi que ce soit d'autre existe. La substance est donc le substrat ultime (''hypokeimenon'') : ce dont tout se dit mais qui n'est dit de rien d'autre<ref>Aristote, ''Métaphysique'', Z, 3, 1028b36-37, trad. J. Tricot, Vrin, Paris, 1953</ref>. ==== Substance première et substance seconde ==== Aristote introduit cependant une distinction cruciale au sein même de la notion de substance. À côté de la substance première, il reconnaît l'existence de substances secondes (''deuterai ousiai''). « Se disent par ailleurs une seconde sorte de substances, les espèces auxquelles appartiennent les substances dites au sens premier — celles-là, et aussi les genres de ces espèces »<ref>Aristote, ''Catégories'', 5, 2a14-17</ref>. La substance première désigne l'individu concret, singulier, unique : cet homme-ci (par exemple Socrate), ce cheval-là (par exemple Bucéphale). Elle possède une double caractéristique négative : elle n'est ni dite d'un sujet, ni dans un sujet. Socrate n'est attribué à rien d'autre — on ne dit pas qu'autre chose « est Socrate » — et il n'existe pas dans un autre être comme une propriété. Les substances premières sont des individus numériquement uns (''arithmôi hen''), des « ceci » (''tode ti'') déterminés et séparés<ref>J. Brun, ''Aristote et le Lycée'', PUF, « Que sais-je ? », Paris, 1961, p. 95-96</ref>. Les substances secondes, en revanche, sont les espèces et les genres auxquels appartiennent les substances premières. L'homme (espèce) et l'animal (genre) sont des substances secondes parce qu'ils se disent des substances premières : Socrate est un homme, l'homme est un animal. Aristote précise qu'« parmi les substances secondes, l'espèce est plus substance que le genre, car elle est plus proche de la substance première »<ref>Aristote, ''Catégories'', 5, 2b7-8</ref>. Si l'on veut rendre compte de ce qu'est Socrate, on sera plus précis en disant que c'est un homme plutôt qu'un animal. Cette hiérarchie révèle une structure ontologique fondamentale : les substances premières sont pré supposées comme sujets par toutes les autres réalités, et ce que les substances premières sont par rapport à tout le reste, les espèces le sont par rapport aux genres<ref>Aristote, ''Catégories'', 5, 2b15-22</ref>. Seules les espèces et les genres méritent d'être appelés substances secondes, car eux seuls, parmi tous les prédicats, indiquent la substance première de manière essentielle<ref>S. Bassu, ''Aristote'', Ellipses, Paris, 2016, p. 62-63</ref>. ==== Les propriétés caractéristiques de la substance ==== Aristote dégage plusieurs propriétés topiques qui permettent d'identifier la substance et de la distinguer des accidents. Premièrement, toute substance n'est pas dans un sujet. Cette caractéristique sépare radicalement la substance des qualités, quantités et relations qui, elles, existent nécessairement dans un substrat<ref>Aristote, ''Catégories'', 5, 3a7-21</ref>. Deuxièmement, la substance et ses différences se disent de façon synonyme (''sunônuma''). Tout ce qui est attribué à partir d'une substance l'est avec le même nom et la même définition : quand on dit de Socrate qu'il est un homme et de l'homme qu'il est un animal, le terme « est » conserve le même sens fondamental<ref>Aristote, ''Catégories'', 5, 3a33-3b9</ref>. Troisièmement, toute substance « indique un certain ceci » (''tode ti''). Les substances premières désignent indiscutablement quelque chose d'individuel et de numériquement un. Les substances secondes, bien que leur forme grammaticale suggère qu'elles indiquent également un « ceci », désignent en réalité plutôt « une certaine sorte d'objet » (''poion ti'') : l'homme n'est pas un individu unique mais une espèce comprenant une multiplicité de sujets<ref>Aristote, ''Catégories'', 5, 3b10-21, dans F. Stirn, ''Aristote'', Armand Colin, Paris, 1999, p. 91-95</ref>. Quatrièmement, la substance n'admet pas le plus ou le moins. Un homme n'est pas « plus homme » qu'un autre, ni plus homme à un moment qu'à un autre. Cette propriété distingue la substance de la qualité : un corps peut être plus ou moins blanc, mais Socrate ne peut être plus ou moins Socrate<ref>Aristote, ''Catégories'', 5, 3b33-4a9</ref>. Enfin, et c'est là « ce que l'on considère surtout comme propre à la substance », celle-ci est capable de recevoir les contraires tout en restant la même et numériquement une. Un même homme, restant identique à lui-même, devient tantôt pâle tantôt bronzé, tantôt chaud tantôt froid, tantôt bon tantôt mauvais. Aucune autre catégorie ne possède cette capacité remarquable de demeurer identique tout en subissant des modifications contraires<ref>Aristote, ''Catégories'', 5, 4a10-21</ref>. ==== Les catégories et la structure du langage ==== Cette doctrine des catégories révèle un lien profond entre l'ontologie et le langage. Les catégories ne sont pas seulement des divisions de l'être, mais aussi des types de prédication. Comme l'explique Aristote, « l'être se dit en autant de sens qu'il y a de catégories »<ref>Aristote, ''Métaphysique'', Δ, 7, 1017a22-24</ref>. Dire que « Socrate est un homme » (substance), que « Socrate est grand » (quantité), que « Socrate est sage » (qualité), ou que « Socrate est au Lycée » (lieu), ce sont autant de manières différentes d'attribuer l'être. Cette correspondance entre langage et réalité n'est cependant pas fortuite. Les catégories ne découlent pas d'une analyse arbitraire du discours, mais reflètent la structure même du réel. Elles constituent les « genres de l'être » (''ta genê tou ontos''), c'est-à-dire les divisions fondamentales selon lesquelles la réalité s'ordonne<ref>R. Bodéüs, Introduction aux ''Catégories'', Les Belles Lettres, Paris, 2001, p. CXVIII-CXXV</ref>. Aristote fonde ainsi une ontologie catégoriale qui demeurera pendant des siècles la référence de la pensée occidentale. ==== L'unité problématique de l'être ==== La doctrine des catégories soulève néanmoins une difficulté majeure : si l'être se dit en plusieurs sens irréductibles, comment préserver l'unité de son concept ? Comment parler de « l'être en tant qu'être » s'il n'y a pas un sens unique mais dix sens différents de l'être ? Aristote ne dissimule pas cette aporie. L'être n'est pas un genre au sens propre, car un genre possède une définition unique qui s'applique uniformément à toutes ses espèces<ref>Aristote, ''Métaphysique'', B, 3, 998b22</ref>. La solution aristotélicienne consiste à reconnaître que l'être est dit selon une pluralité ordonnée. Bien que l'être n'ait pas un sens univoque, ses différentes acceptions ne sont pas non plus purement équivoques. Elles se rapportent toutes à un terme premier : la substance. « L'être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée », affirme Aristote dans un passage capital de la ''Métaphysique''<ref>Aristote, ''Métaphysique'', Γ, 2, 1003a33-b10</ref>. De même que tout ce qui est « sain » se rapporte à la santé — tel aliment la produit, tel exercice la conserve, telle couleur l'indique — de même tout ce qui « est » se rapporte à la substance. C'est ce que la tradition appellera l'analogie de l'être : une unité relative, fondée sur une référence commune, qui préserve la diversité des sens tout en maintenant leur cohérence<ref>P. Aubenque, ''Le problème de l'être chez Aristote'', PUF, Paris, 1962, p. 178-195</ref>. Ainsi, les dix catégories ne forment pas une liste hétéroclite mais un système hiérarchisé dont la substance constitue le centre. Cette architecture conceptuelle permet à Aristote d'affirmer simultanément la multiplicité des sens de l'être et l'unité de la science qui l'étudie : la philosophie première ou métaphysique, science de l'être en tant qu'être<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a20-32, dans C. Cerami dir., ''Génération et substance : Aristote et Averroès'', De Gruyter, Berlin, 2015, p. 167-172</ref>. === Chapitre II : Le ''De interpretatione'' – Le jugement et la proposition === Le ''De interpretatione'' (''Peri hermeneias'') constitue le deuxième traité de l'Organon aristotélicien et offre une analyse minutieuse de la proposition comme lieu privilégié de la vérité et de la fausseté. Aristote y examine la structure du discours déclaratif, les conditions de possibilité du jugement et les rapports entre langage, pensée et réalité. Cette œuvre, d'une densité conceptuelle remarquable, pose les fondements de la logique propositionnelle et s'attache à déterminer comment le ''logos'' peut manifester l'être<ref>Aristote, ''De l'interprétation'', 1, 16a3-8, trad. J. Tricot, Paris, Vrin, 1969, p. 77</ref>. ==== Le langage comme système symbolique ==== Aristote ouvre son traité par une réflexion sur le statut du langage qui marque une rupture décisive avec les conceptions sophistiques. Les sons émis par la voix (''ta en tè phonè'') sont, écrit-il, les symboles (''symbola'') des affections de l'âme (''ta en tè psychè pathèmata''), et les mots écrits sont à leur tour les symboles des mots prononcés<ref>Aristote, ''De l'interprétation'', 1, 16a3-8</ref>. Cette conception stratifiée du signe linguistique établit trois niveaux distincts : les choses (''pragmata''), les affections ou états de l'âme, et les signes vocaux ou écrits. Cette théorie sémiotique, qui sera reprise et développée par la scolastique médiévale, présente plusieurs caractéristiques essentielles. D'abord, elle affirme le caractère conventionnel (''kata synthèkèn'') du rapport entre le signifiant linguistique et le signifié mental : « De même que l'écriture n'est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes, alors que les états de l'âme dont ces expressions sont immédiatement les signes sont identiques chez tous, comme sont identiques aussi les choses dont ces états sont les images »<ref>''Ibid.'', 16a5-8</ref>. La diversité des langues manifeste ainsi le caractère artificiel du lien entre ''phone'' et ''pathèma'', tandis que l'universalité des états mentaux et leur rapport de ressemblance (''homoiômata'') avec les choses garantit la possibilité d'une communication véridique. Cette analyse permet à Aristote de réfuter la position sophistique, particulièrement celle de Cratyle, selon laquelle les noms seraient naturellement justes. Contre l'idée d'une adhérence immédiate entre le mot et la chose, Aristote introduit une médiation nécessaire : celle de la pensée. Le langage ne manifeste pas directement l'être, mais signifie d'abord les concepts par lesquels nous appréhendons l'être<ref>Voir Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962, p. 100-110</ref>. ==== Les éléments du discours déclaratif : nom et verbe ==== Avant d'examiner la proposition proprement dite, Aristote analyse ses constituants élémentaires. Le nom (''onoma'') est défini comme « un son vocal possédant une signification conventionnelle, sans référence au temps, et dont aucune partie, prise isolément, n'est significative par elle-même »<ref>Aristote, ''De l'interprétation'', 2, 16a19-21</ref>. Cette définition insiste sur quatre caractères : la nature sonore (''phonè''), la signification conventionnelle (''kata synthèkèn''), l'atemporalité, et l'absence de signification des parties considérées isolément. Ce dernier point vaut pour les noms simples ; dans les noms composés comme « Callippos », les parties (''kallos'', « beauté », et ''hippos'', « cheval ») ne contribuent pas à la signification du tout<ref>''Ibid.'', 16a21-29</ref>. Aristote précise que « rien n'est par nature un nom, mais seulement quand il devient symbole »<ref>''Ibid.'', 16a27-28</ref>. Cette conventionnalité radicale distingue le langage humain des cris inarticulés des animaux : même lorsque ceux-ci signifient quelque chose (par exemple la douleur), ils ne constituent pas des noms car ils n'impliquent pas la médiation d'une institution symbolique. Le nom renvoie donc à une réalité doublement humaine : comme production vocale conventionnelle et comme instrument de la vie sociale et politique. Aristote mentionne également les noms indéfinis (''aoriston onoma''), comme « non-homme », qui ne sont pas véritablement des noms car ils peuvent s'appliquer indifféremment à tout ce qui n'est pas homme, sans détermination positive<ref>''Ibid.'', 2, 16a30-32</ref>. Cette analyse des termes privatifs ou négatifs anticipe les difficultés ultérieures concernant le statut logique de la négation. Le verbe (''rhèma'') se distingue du nom par deux caractères spécifiques : « Le verbe est ce qui ajoute à sa propre signification celle du temps ; aucune de ses parties n'est significative prise séparément, et il indique toujours quelque chose d'affirmé de quelque chose d'autre »<ref>''Ibid.'', 3, 16b6-8</ref>. La première caractéristique, la consignification du temps (''prosèmainei chronon''), fait du verbe l'élément qui ancre le discours dans la temporalité et permet de distinguer le présent, le passé et le futur. Mais c'est la seconde caractéristique qui importe le plus du point de vue logique : le verbe signifie toujours « quelque chose dit au sujet de quelque chose d'autre », c'est-à-dire qu'il introduit essentiellement une relation prédicative. Cependant, Aristote ajoute une précision capitale : les verbes « dits par eux-mêmes » (''kath' hauta legomena''), c'est-à-dire pris isolément sans sujet explicite, « sont des noms et signifient quelque chose », mais « ils ne signifient pas encore si la chose est ou n'est pas »<ref>''Ibid.'', 16b19-22</ref>. Ainsi, le verbe « court » ou « marche », prononcé seul, arrête certes la pensée de l'auditeur et produit un sens, mais il ne constitue pas encore un jugement, il n'affirme ni ne nie rien. Cette observation conduit à la question cruciale du rôle de la copule « être ». Le verbe « être » occupe une position singulière dans l'analyse aristotélicienne. Pris en lui-même, « être ou ne pas être n'est pas un signe de la chose réelle, pas même si tu dis 'étant' tout court ; car en soi, ce n'est rien, mais il consignifie une certaine composition qu'on ne peut concevoir sans les composants »<ref>''Ibid.'', 3, 16b22-25</ref>. Cette remarque énigmatique a suscité d'innombrables commentaires. Elle suggère que le verbe « être », dans sa fonction copulative, ne possède pas de contenu sémantique autonome, mais signifie l'acte même de liaison ou de synthèse (''synthesis'') entre le sujet et le prédicat. Ce n'est donc ni un nom, ni vraiment un verbe au sens plein, mais le marqueur linguistique de l'opération judicative elle-même<ref>Voir Octave Hamelin, ''Le système d'Aristote'', Paris, Vrin, 1920, p. 159-160</ref>. ==== La proposition déclarative (''logos apophantikos'') ==== Tout discours (''logos'') n'est pas une proposition. La prière (''euchè''), par exemple, est bien un discours, mais elle n'est ni vraie ni fausse, et son étude relève plutôt de la rhétorique ou de la poétique<ref>Aristote, ''De l'interprétation'', 4, 17a2-7</ref>. Aristote définit la proposition déclarative (''logos apophantikos'') comme « le discours en lequel réside le vrai ou le faux »<ref>''Ibid.'', 17a2-3</ref>. Ce n'est donc pas n'importe quel énoncé, mais celui qui possède une valeur de vérité, celui qui « manifeste » (''apophainein'') un état de choses et peut être confronté à la réalité. La proposition élémentaire se divise en affirmation (''kataphasis'') et négation (''apophasis''). L'affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos''), tandis que la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'')<ref>''Ibid.'', 5, 17a25-26</ref>. Cette structure binaire – affirmer ou nier un prédicat d'un sujet – constitue la forme canonique du jugement aristotélicien. Toute proposition déclarative se ramène ultimement à la formule « S est P » (affirmation) ou « S n'est pas P » (négation). Aristote insiste sur le fait que l'affirmation et la négation concernent nécessairement la liaison ou la séparation d'un sujet et d'un prédicat. Une proposition n'est pas une simple juxtaposition de mots, mais suppose une ''synthesis'' (dans l'affirmation) ou une ''diairesis'' (dans la négation). C'est précisément cette opération de composition ou de division qui rend possible la vérité ou la fausseté. Comme Aristote l'expliquera dans la ''Métaphysique'', « dire que ce qui est est et que ce qui n'est pas n'est pas, c'est le vrai ; dire que ce qui est n'est pas ou que ce qui n'est pas est, c'est le faux »<ref>Aristote, ''Métaphysique'', Γ (IV), 7, 1011b26-27</ref>. Cette définition de la vérité comme adéquation (ou conformité) marque un tournant décisif dans l'histoire de la philosophie. Elle établit que la vérité ne réside ni dans les choses elles-mêmes, ni dans la pensée isolée, mais dans le jugement en tant qu'il assemble ou sépare des déterminations conformément à ce qui est assemblé ou séparé dans la réalité. La vérité est donc toujours relative à une opération prédicative : elle suppose la dualité du sujet et du prédicat, et l'acte qui les relie ou les disjoint. ==== Quantité et qualité des propositions ==== Aristote distingue les propositions selon leur quantité et leur qualité. Du point de vue de la quantité, les propositions sont universelles (''katholou''), particulières (''en merei''), singulières (portant sur un individu) ou indéterminées (''aoristoi'')<ref>Aristote, ''De l'interprétation'', 7, 17a38-17b12</ref>. Une proposition universelle affirme ou nie quelque chose de « tout » son sujet (''pan'', ''oudens'') : « Tout homme est blanc », « Nul homme n'est blanc ». Une proposition particulière affirme ou nie quelque chose de « quelque » sujet : « Quelque homme est blanc », « Quelque homme n'est pas blanc ». Les propositions indéterminées sont celles qui ne comportent aucune marque de quantité : « L'homme est blanc », « L'homme n'est pas blanc ». Du point de vue de la qualité, les propositions sont affirmatives ou négatives. En croisant ces deux critères, on obtient quatre formes fondamentales de propositions : l'universelle affirmative (A), l'universelle négative (E), la particulière affirmative (I), et la particulière négative (O) – désignations qui ne sont pas aristotéliciennes mais scolastiques, tirées des voyelles des mots latins ''Affirmo'' et ''nEgO''. Cette classification quantitative revêt une importance considérable pour la théorie du syllogisme développée dans les ''Premiers Analytiques''. Elle permet notamment de définir les relations d'opposition entre propositions : contradiction, contrariété, subcontrariété et subalternation. Deux propositions sont contradictoires lorsqu'elles diffèrent à la fois en quantité et en qualité : « Tout homme est juste » et « Quelque homme n'est pas juste ». Elles sont contraires lorsqu'elles sont toutes deux universelles mais de qualité opposée : « Tout homme est juste » et « Nul homme n'est juste »<ref>''Ibid.'', 7, 17b16-26</ref>. ==== Le problème des futurs contingents ==== Le chapitre 9 du ''De interpretatione'' soulève l'une des questions les plus débattues de l'histoire de la logique et de la métaphysique : celle du statut des propositions portant sur les futurs contingents. Aristote se demande si le principe de bivalence – selon lequel toute proposition est soit vraie, soit fausse – s'applique aux propositions concernant des événements futurs qui ne sont ni nécessaires ni impossibles. Le problème se formule ainsi : « Il y aura demain une bataille navale » et « Il n'y aura pas demain une bataille navale » sont deux propositions contradictoires. D'après le principe du tiers exclu, l'une doit être vraie et l'autre fausse. Mais si l'une est dès maintenant vraie (par exemple la première), alors il est nécessaire qu'il y ait demain une bataille navale, car « il n'est pas possible que ce qui a été dit de vrai se produise autrement »<ref>Aristote, ''De l'interprétation'', 9, 18b9-16</ref>. On aboutit ainsi à un fatalisme logique : tout ce qui arrivera devait nécessairement arriver, et la contingence est abolie. La solution d'Aristote est subtile. Il maintient que, pour les propositions portant sur le présent et le passé, le principe de bivalence s'applique sans restriction : de deux contradictoires, l'une est nécessairement vraie et l'autre fausse. Mais pour les futurs contingents, il faut modifier cette règle : « Il est nécessaire que l'affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie »<ref>''Ibid.'', 19a36-39</ref>. Autrement dit, il est nécessaire que l'une des deux propositions soit vraie et l'autre fausse, mais il n'est pas nécessaire que ce soit celle-ci plutôt que celle-là. La disjonction est nécessaire, mais chacun des disjoints reste contingent. Cette distinction entre nécessité « divisée » et nécessité « composée » (pour reprendre la terminologie scolastique) préserve à la fois le principe logique fondamental et la réalité de la contingence dans le monde. « Les discours sont vrais de la même manière que les choses », écrit Aristote<ref>''Ibid.'', 9, 19a33</ref> : si les événements futurs sont contingents, les propositions qui les concernent ne peuvent avoir dès maintenant une vérité ou une fausseté déterminée. Cette doctrine a suscité des controverses innombrables, de l'Antiquité (les Stoïciens) au Moyen Âge (les discussions sur la prescience divine) jusqu'à la logique contemporaine (la logique modale et les logiques plurivalentes). ==== Les propositions modales ==== Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales, c'est-à-dire celles qui n'affirment pas simplement que quelque chose est ou n'est pas, mais qu'il est possible, impossible, contingent ou nécessaire que quelque chose soit<ref>Aristote, ''De l'interprétation'', 12-13, 21a34-23a26</ref>. Aristote distingue quatre modalités fondamentales : le possible (''dynaton'', ''endechomenon''), l'impossible (''adynaton''), le contingent (également ''endechomenon'' dans un sens plus restreint) et le nécessaire (''anankaion''). L'analyse des rapports entre ces modalités pose des difficultés considérables. Aristote établit que « Il est possible que S soit P » ne se convertit pas comme une proposition assertorique : de « Il est possible que tout B soit A », on ne peut pas conclure « Il est possible que tout A soit B ». En revanche, la proposition « Il est possible que S soit P » implique « Il est possible que S ne soit pas P », car la possibilité véritable suppose l'indétermination : ce qui peut être peut aussi ne pas être<ref>''Ibid.'', 13, 22a14-23</ref>. Le nécessaire, au contraire, exclut la possibilité opposée : si « Il est nécessaire que S soit P », alors il est impossible que S ne soit pas P. Aristote définit le nécessaire comme « ce qui ne peut pas ne pas être » (''to mè endechomenon mè einai'')<ref>''Ibid.'', 12, 21b35-36</ref>. Cette définition sera reprise par toute la tradition scolastique et restera au centre des débats modaux jusqu'à Leibniz et au-delà. Les propositions modales jouent un rôle essentiel dans la théorie aristotélicienne de la science exposée dans les ''Seconds Analytiques'' : la science porte sur le nécessaire, non sur le contingent. Seul ce qui est toujours ou le plus souvent peut faire l'objet d'une démonstration rigoureuse. L'accident pur, ce qui arrive parfois mais pas régulièrement, échappe à la connaissance scientifique<ref>Aristote, ''Seconds Analytiques'', I, 30, 87b19-27</ref>. ==== L'unité et la multiplicité des propositions ==== Le chapitre 11 examine la question de savoir ce qui fait l'unité d'une proposition. Aristote distingue les propositions véritablement unes de celles qui ne sont unes qu'en apparence. Une proposition est une si elle affirme ou nie « une seule chose d'une seule chose » (''hen kata henos'')<ref>Aristote, ''De l'interprétation'', 11, 20b12-13</ref>. Mais cette unité peut être entendue de deux manières : ou bien le prédicat constitue véritablement une unité (par exemple « animal bipède » dans « L'homme est un animal bipède »), ou bien on relie par accident plusieurs prédicats à un même sujet. La difficulté est de déterminer dans quels cas plusieurs prédicats forment véritablement une unité. « Homme », « blanc » et « musicien » peuvent certes être attribués ensemble à Socrate (« Socrate est un homme blanc et musicien »), mais ils ne forment pas une essence unique. En revanche, « animal » et « bipède » constituent ensemble la définition de l'homme et forment donc une unité substantielle<ref>''Ibid.'', 11, 20b31-21a7</ref>. Cette distinction anticipe l'analyse des différents types de prédication (essentielle, propre, accidentelle) développée dans les ''Topiques'' et les ''Seconds Analytiques''. Cette réflexion sur l'unité de la proposition révèle la préoccupation constante d'Aristote : garantir que le discours ne se perde pas dans une multiplicité infinie et indéterminée, mais conserve une structure rationnelle permettant la connaissance. Le langage doit être régulé par les articulations mêmes de l'être : les genres, les espèces, les accidents par soi, etc. C'est seulement à cette condition que le ''logos apophantikos'' peut manifester véritablement ce qui est. ==== Portée philosophique du ''De interpretatione'' ==== L'importance du ''De interpretatione'' dépasse largement le cadre d'un traité de logique formelle. Aristote y pose les bases d'une ontologie du jugement qui dominera toute la philosophie occidentale jusqu'à Kant et au-delà. En établissant que la vérité réside dans la composition et la division opérées par l'intellect, et non dans les choses elles-mêmes ni dans les concepts isolés, Aristote fait du jugement le lieu privilégié de la manifestation de l'être. Cette doctrine a plusieurs implications majeures. D'abord, elle implique que la vérité est toujours relationnelle : elle suppose un rapport entre au moins deux termes (sujet et prédicat), et entre la pensée et la réalité. Il n'y a pas de vérité absolue et simple, mais seulement des vérités de composition. Ensuite, elle établit que l'erreur est possible : là où il y a composition, il peut y avoir fausse composition. L'erreur naît précisément de l'écart possible entre la liaison que nous posons dans le jugement et la liaison réelle dans les choses<ref>Aristote, ''Métaphysique'', Θ (IX), 10, 1051b1-9</ref>. Enfin, le ''De interpretatione'' pose la question des limites du langage déclaratif. En distinguant le ''logos apophantikos'' des autres formes de discours (prière, commandement, souhait), Aristote délimite le domaine propre de la logique et de la science : celui des énoncés susceptibles d'être vrais ou faux. Mais cette délimitation implique aussi une reconnaissance : il existe des usages légitimes du langage qui échappent à la juridiction de la logique. Cette reconnaissance ouvre un espace pour la rhétorique, la poétique et, plus généralement, pour toutes les formes de discours qui ne visent pas la vérité théorique mais d'autres fins – persuader, émouvoir, prescrire, célébrer. Le ''De interpretatione'' demeure ainsi une œuvre fondatrice, non seulement pour la logique et la philosophie du langage, mais pour toute réflexion sur les rapports entre pensée, langage et réalité. Sa richesse conceptuelle et les difficultés qu'il soulève continuent de nourrir les débats contemporains en philosophie analytique, en linguistique et en logique formelle. === Chapitre III : Les Analytiques – La science démonstrative === Les deux traités des ''Analytiques'' – ''Premiers Analytiques'' (''Analytica priora'') et ''Seconds Analytiques'' (''Analytica posteriora'') – constituent le cœur de l'édifice logique aristotélicien et exposent la théorie de la science démonstrative. Tandis que les ''Premiers Analytiques'' s'attachent à la forme du syllogisme en général, indépendamment de la vérité des prémisses, les ''Seconds Analytiques'' traitent du syllogisme scientifique ou démonstratif (''apodeixis''), dont les prémisses doivent être vraies, premières et causales<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-16</ref>. Cette distinction fondamentale marque la différence entre la logique formelle et l'épistémologie : les ''Premiers Analytiques'' étudient la validité formelle des raisonnements, les ''Seconds Analytiques'' examinent les conditions de la connaissance scientifique<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', 2e éd., Oxford, Clarendon Press, 1993, p. xviii-xix</ref>. ==== Le syllogisme : structure et figures ==== Le syllogisme (''syllogismos'') est défini par Aristote comme « un discours dans lequel, certaines choses étant posées, quelque chose d'autre que ces données en résulte nécessairement par le seul fait de ces données »<ref>Aristote, ''Premiers Analytiques'', I, 1, 24 b 18-20</ref>. Cette définition insiste sur trois caractères essentiels : la pluralité des prémisses (au moins deux), la nécessité de la conclusion, et le fait que cette nécessité découle uniquement de la position des prémisses, sans recours à aucune autre donnée. Le syllogisme est ainsi la forme canonique du raisonnement déductif, celui qui permet de passer de propositions données à une conclusion qui en découle avec rigueur<ref>David Bronstein, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016, p. 31-32</ref>. La structure minimale du syllogisme comporte trois termes : le grand extrême ou majeur (''to mega akron''), le petit extrême ou mineur (''to mikron akron''), et le moyen terme (''to meson'') qui assure la liaison entre les deux extrêmes sans apparaître dans la conclusion<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 32-36</ref>. Ces trois termes entrent dans deux prémisses – la majeure et la mineure – pour produire une conclusion. Par exemple : « Tout homme est mortel » (majeure), « Or Socrate est un homme » (mineure), « Donc Socrate est mortel » (conclusion). Le moyen terme « homme » relie le prédicat « mortel » au sujet « Socrate », mais disparaît dans la conclusion. Aristote distingue trois figures du syllogisme selon la position du moyen terme dans les prémisses. Dans la première figure, le moyen terme est sujet de la majeure et prédicat de la mineure. Dans la deuxième figure, il est prédicat dans les deux prémisses. Dans la troisième figure, il est sujet dans les deux prémisses<ref>Aristote, ''Premiers Analytiques'', I, 4-6, 25 b 26-28 b 14</ref>. La première figure est considérée comme la plus parfaite, car elle seule permet de conclure dans tous les modes (universelles affirmatives et négatives, particulières affirmatives et négatives), tandis que les deux autres figures ne produisent que des conclusions limitées : la deuxième ne donne que des conclusions négatives, la troisième que des conclusions particulières<ref>Aristote, ''Premiers Analytiques'', I, 7, 29 a 30 ; I, 14, 32 b 38-33 a 5</ref>. À l'intérieur de chaque figure, Aristote détermine les modes valables en combinant les différentes qualités (affirmative/négative) et quantités (universelle/particulière) des propositions. Dans la première figure, quatre modes sont concluants : Barbara (deux universelles affirmatives donnant une universelle affirmative), Celarent (universelle négative et universelle affirmative donnant une universelle négative), Darii et Ferio pour les particulières<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 37-26 b 34</ref>. Les syllogismes des deuxième et troisième figures, dits « imparfaits », doivent être ramenés par conversion des prémisses aux syllogismes parfaits de la première figure pour manifester leur validité. Cette réduction opère par transformation des propositions selon les lois de conversion : l'universelle négative se convertit simplement (« Nul A n'est B » devient « Nul B n'est A »), l'universelle affirmative se convertit par accident (« Tout A est B » devient « Quelque B est A »), la particulière affirmative se convertit simplement<ref>Aristote, ''Premiers Analytiques'', I, 2-3, 25 a 1-26</ref>. ==== La démonstration scientifique (''apodeixis'') ==== Si les ''Premiers Analytiques'' étudient le syllogisme en général, abstraction faite de la vérité des prémisses, les ''Seconds Analytiques'' s'attachent au syllogisme scientifique ou démonstratif. Aristote ouvre ce traité par une déclaration solennelle : « Nous estimons posséder la science d'une chose d'une manière absolue, et non pas, à la façon des Sophistes, d'une manière purement accidentelle, quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu'en outre il n'est pas possible que la chose soit autre qu'elle n'est »<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-12</ref>. La science (''epistèmè'') se définit donc triplement : elle est connaissance de la cause, certitude de l'adéquation entre la cause et l'effet, et conscience de la nécessité de cette liaison<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 90-93</ref>. La démonstration est le syllogisme qui produit la science. Elle doit partir de prémisses qui satisfont plusieurs exigences cumulatives : elles doivent être vraies (car on ne peut savoir ce qui n'est pas), premières (indémontrables, car la chaîne des démonstrations ne peut remonter à l'infini), immédiates (sans moyen terme intermédiaire), plus connues que la conclusion, antérieures à elle, et causes de celle-ci<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 20-25</ref>. Ces conditions garantissent que la conclusion ne sera pas seulement vraie et nécessaire, mais qu'elle sera sue avec certitude comme découlant de ses causes. Sans ces conditions, on peut avoir un syllogisme valide, mais non une démonstration scientifique<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 35-42</ref>. Le moyen terme joue dans la démonstration un rôle crucial : il n'est pas seulement l'élément logique qui relie les extrêmes, il est la cause (''aitia'') de l'attribution du prédicat au sujet. « Le moyen terme est la cause », écrit Aristote<ref>Aristote, ''Seconds Analytiques'', II, 2, 90 a 6</ref>. Par exemple, pour démontrer que la Lune subit des éclipses, on utilisera comme moyen terme « interposition de la Terre », qui n'est pas seulement un lien logique mais la cause physique du phénomène. Aristote distingue ainsi le syllogisme du fait (''hoti'') et le syllogisme du pourquoi (''dioti'') : le premier prouve que quelque chose est, le second pourquoi c'est<ref>Aristote, ''Seconds Analytiques'', I, 13, 78 a 22-b 13</ref>. La vraie science s'obtient par le syllogisme du pourquoi, qui exhibe la cause à travers le moyen terme<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 214-220</ref>. Aristote précise que les causes dont traite la démonstration correspondent aux quatre types de causes exposés dans la ''Physique'' : la cause formelle (l'essence), la cause matérielle (ce dont une chose est faite), la cause efficiente (ce qui produit le changement) et la cause finale (ce en vue de quoi)<ref>Aristote, ''Seconds Analytiques'', II, 11, 94 a 20-24 ; cf. ''Physique'', II, 3, 194 b 23-195 b 30</ref>. Toutefois, dans les sciences théoriques comme les mathématiques, c'est surtout la cause formelle qui intervient, car les objets mathématiques ne subissent ni génération ni corruption. Dans les sciences physiques et biologiques, en revanche, les quatre causes peuvent être invoquées selon les circonstances<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012, p. 176-180</ref>. ==== Les principes de la science : axiomes, hypothèses et définitions ==== Toute démonstration présuppose des principes (''archai'') qui, eux-mêmes, ne peuvent être démontrés. Aristote refuse vigoureusement l'idée d'une régression à l'infini dans la chaîne des démonstrations, de même qu'il rejette la démonstration circulaire où l'on prouverait A par B et B par A<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18</ref>. Il faut donc admettre l'existence de principes premiers, qui sont connus sans démonstration. Ces principes se divisent en trois catégories<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 94-99</ref>. D'abord, les axiomes (''axiômata'') ou principes communs, qui s'appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction : « Il est impossible que le même attribut appartienne et n'appartienne pas en même temps au même sujet et sous le même rapport »<ref>Aristote, ''Métaphysique'', Γ (IV), 3, 1005 b 19-20</ref>. Ce principe n'est pas démontrable, car toute démonstration le présupposerait, mais il peut être défendu par réfutation de ceux qui le nient. Le principe du tiers exclu – « De deux propositions contradictoires, l'une est nécessairement vraie et l'autre fausse » – constitue un autre axiome fondamental. Ces principes, Aristote le précise dans les ''Seconds Analytiques'', sont utilisés par toutes les sciences, mais chacune en fait l'usage que requiert son genre propre<ref>Aristote, ''Seconds Analytiques'', I, 11, 77 a 26-31</ref>. Ensuite, les hypothèses (''hypotheseis'') et les thèses (''theseis''), qui affirment l'existence ou la non-existence de certaines entités propres à chaque science. Une hypothèse suppose l'existence de l'objet d'étude (par exemple, l'arithmétique suppose l'existence de l'unité, la géométrie celle du point et de la ligne), tandis qu'une thèse affirme quelque chose sans le prouver, soit à titre de postulat contraire à l'opinion commune, soit à titre de principe accepté par l'élève<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 14-24 ; I, 10, 76 b 23-34</ref>. Ces principes délimitent le domaine d'une science : on ne peut démontrer les propriétés des triangles sans avoir d'abord posé l'existence des figures géométriques. Enfin, les définitions (''horoi'') énoncent ce qu'est une chose, son essence (''ti esti''). La définition n'est pas une démonstration, car elle ne prouve rien : elle se contente de manifester l'essence<ref>Aristote, ''Seconds Analytiques'', II, 3, 90 b 24-27</ref>. Cependant, elle entretient avec la démonstration des rapports complexes. Aristote examine longuement la question de savoir si l'on peut démontrer l'essence, et il conclut négativement : la définition et la démonstration sont deux opérations distinctes<ref>Aristote, ''Seconds Analytiques'', II, 4, 91 a 35-b 11</ref>. On ne démontre pas « ce qu'est l'homme », on le définit. Toutefois, certaines définitions peuvent découler de démonstrations : c'est le cas des définitions causales, qui expliquent pourquoi une chose a telle propriété essentielle. Par exemple, la définition du tonnerre comme « bruit dans les nuages causé par l'extinction du feu » révèle à la fois l'essence et la cause du phénomène<ref>Aristote, ''Seconds Analytiques'', II, 8, 93 b 7-14</ref>. ==== Unité et diversité des sciences ==== Un principe capital de l'épistémologie aristotélicienne est l'interdiction du passage d'un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre, c'est-à-dire par le domaine d'objets qu'elle étudie, et elle ne peut emprunter ses principes ou ses démonstrations à une autre science<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 a 38-b 2</ref>. On ne peut pas, par exemple, démontrer un théorème géométrique par des principes arithmétiques, car le nombre et la grandeur constituent deux genres différents. Cette règle garantit l'autonomie des sciences et interdit toute confusion entre les domaines du savoir<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 177-183</ref>. Aristote admet cependant trois exceptions à cette règle. D'abord, lorsque les objets d'une science tombent sous ceux d'une autre comme des espèces sous un genre commun : ainsi l'optique et la mécanique utilisent les principes de la géométrie, l'harmonique ceux de l'arithmétique<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 b 14-17</ref>. On dit alors que ces sciences sont « subordonnées » (''hypo'') aux sciences plus générales. Ensuite, les sciences peuvent partager les axiomes communs, bien que chacune ne les utilise que dans la mesure où ils s'appliquent à son genre propre. Enfin, il existe des sciences mixtes ou « moyennes » (''metaxu''), comme l'astronomie mathématique, qui appliquent les principes mathématiques aux phénomènes physiques<ref>Aristote, ''Physique'', II, 2, 194 a 7-12</ref>. Cette théorie de l'unité et de la diversité des sciences fonde l'organisation aristotélicienne du savoir. Chaque science possède une méthode adaptée à son objet : les mathématiques procèdent par démonstration nécessaire à partir de principes évidents, la physique doit tenir compte du changement et de la contingence, la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly''), l'éthique et la politique se contentent de vérités approximatives car « le bien et le juste comportent de grandes divergences et incertitudes »<ref>Aristote, ''Éthique à Nicomaque'', I, 3, 1094 b 14-16</ref>. Il n'y a donc pas de science unique et universelle, mais une pluralité de sciences régies par les principes que leur impose leur objet propre<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 173-176</ref>. ==== Le problème de la connaissance des principes : induction et intellection ==== La théorie de la démonstration soulève un problème redoutable : si toute science procède de principes indémontrables, comment connaître ces principes eux-mêmes ? Aristote refuse les deux solutions extrêmes : soit dire qu'il n'y a pas de science possible puisque les principes sont inconnaissables, soit affirmer que tout est démontrable et accepter une régression à l'infini<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18</ref>. Il faut donc admettre qu'il existe un mode de connaissance des principes distinct de la démonstration<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 259-267</ref>. Le célèbre et difficile chapitre final des ''Seconds Analytiques'' (II, 19) expose la solution d'Aristote. La connaissance des principes résulte d'un processus qui part de la sensation (''aisthèsis''), passe par la mémoire (''mnèmè''), puis par l'expérience (''empeiria''), pour aboutir à la saisie de l'universel. « De la sensation naît la mémoire, et de la mémoire fréquemment répétée d'une même chose naît l'expérience ; car des souvenirs en grand nombre constituent une seule expérience. De l'expérience, ou de tout universel qui s'est fixé dans l'âme, de l'un en dehors du multiple, de ce qui est identique en tous ces cas particuliers, provient alors le principe de l'art et de la science »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 3-9</ref>. Ce processus est appelé induction (''epagôgè''). L'induction n'est pas ici la simple énumération de cas particuliers conduisant à une généralisation hasardeuse, mais le mouvement naturel de l'âme qui, à partir d'une multiplicité sensible, dégage progressivement l'universel qui s'y trouve incarné. Aristote compare ce processus à une armée en déroute où, un soldat s'étant arrêté, un autre s'arrête auprès de lui, puis un autre, jusqu'à ce que l'ordre primitif soit rétabli : de même, à partir des sensations éparses, l'âme reconstitue l'unité de la forme universelle<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 12-14</ref>. Cette métaphore suggère que l'induction n'est pas une opération purement logique, mais un mouvement ontologique de l'âme vers l'intelligible<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 225-247</ref>. La saisie ultime des principes premiers relève d'une faculté spécifique qu'Aristote nomme intellect (''nous'') ou intuition intellectuelle. L'intellect est « la disposition par laquelle nous connaissons les principes »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 b 12</ref>. Il ne s'agit pas d'une faculté mystérieuse ou d'une illumination surnaturelle, mais de l'achèvement naturel du processus cognitif humain. Aristote affirme que nous possédons en puissance la capacité de connaître les principes, et que cette capacité s'actualise progressivement par l'exercice de la sensation et de la pensée. L'intellect est ainsi la plus haute forme de connaissance, supérieure même à la science démonstrative, car il appréhende directement et sans intermédiaire les vérités premières dont toute démonstration dépend<ref>Aristote, ''Éthique à Nicomaque'', VI, 6, 1141 a 7-8</ref>. Cette solution pose toutefois de nombreuses difficultés. Comment l'intellect peut-il être à la fois une capacité innée et le résultat d'un processus d'apprentissage ? Comment peut-il appréhender l'universel sans passer par le raisonnement ? Aristote ne répond pas clairement à ces questions, et ses successeurs – Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin – proposeront des interprétations divergentes du statut de l'intellect et de son rapport à l'expérience sensible. Ce qui demeure certain, c'est qu'Aristote refuse tout innéisme platonicien : nous ne naissons pas avec la connaissance des principes, nous l'acquérons progressivement à partir de l'expérience du monde sensible<ref>Orna Harari, ''Knowledge and Demonstration: Aristotle's Posterior Analytics'', Dordrecht, Springer, 2004, p. 26-31</ref>. ==== Les limites de la science démonstrative ==== Aristote ne prétend pas que toute connaissance relève de la démonstration. Au contraire, il délimite soigneusement le domaine de la science démonstrative et reconnaît l'existence d'autres formes légitimes de savoir. D'abord, tout ce qui relève de l'accident pur échappe à la science : ce qui arrive parfois mais pas toujours, ce qui est contingent et irrégulier, ne peut faire l'objet d'une démonstration nécessaire<ref>Aristote, ''Seconds Analytiques'', I, 30, 87 b 19-27</ref>. La science porte sur le nécessaire ou, à défaut, sur ce qui se produit « dans la plupart des cas ». Ensuite, il existe des propositions immédiates (''amesa'') qui, bien que vraies et universelles, ne peuvent être démontrées parce qu'il n'y a pas de moyen terme entre leur sujet et leur prédicat. Ces propositions constituent précisément les principes de la démonstration<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 7-8</ref>. Les axiomes, les définitions, les hypothèses d'existence ne se démontrent pas : on les saisit par intuition intellectuelle ou on les pose comme conditions de la science<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 179-182</ref>. Enfin, Aristote reconnaît que certaines formes de raisonnement, bien que n'étant pas des démonstrations au sens strict, jouent un rôle important dans la recherche scientifique. L'induction, comme on l'a vu, permet d'accéder aux principes. L'exemple (''paradeigma''), qui consiste à raisonner du particulier au particulier par l'intermédiaire d'un universel, est utile en rhétorique et en délibération politique<ref>Aristote, ''Premiers Analytiques'', II, 24, 68 b 38-69 a 19</ref>. Le raisonnement par signes (''sèmeion''), qui conclut de l'effet à la cause ou inversement, peut fournir des indications précieuses même s'il ne garantit pas la nécessité. Tous ces modes de raisonnement, bien qu'imparfaits du point de vue démonstratif, témoignent de la richesse et de la diversité de la pensée rationnelle. ==== Portée et postérité de la théorie démonstrative ==== La théorie aristotélicienne de la science démonstrative a exercé une influence considérable sur toute l'histoire de la philosophie et des sciences. Elle a fourni le modèle épistémologique dominant pendant deux millénaires, de l'Antiquité grecque à la Renaissance, en passant par la scolastique médiévale. Les mathématiques d'Euclide, avec leur méthode axiomatique-déductive, constituent l'incarnation parfaite de l'idéal aristotélicien : des définitions claires, des axiomes évidents, des démonstrations rigoureuses enchaînant les théorèmes selon un ordre nécessaire<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 3-10</ref>. Cependant, la théorie aristotélicienne a aussi fait l'objet de critiques sévères, particulièrement à partir de la révolution scientifique moderne. Descartes reproche au syllogisme de ne rien apprendre de nouveau, puisque la conclusion est déjà contenue dans les prémisses. Bacon dénonce la stérilité de la logique aristotélicienne et lui oppose sa méthode inductive fondée sur l'observation et l'expérimentation. Les sciences modernes – physique galiléenne, mécanique newtonienne, biologie darwinienne – ne se conforment pas au schéma aristotélicien : elles procèdent par hypothèses provisoires, expérimentations, inférences probabilistes, et non par démonstrations nécessaires à partir de principes évidents<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. xviii-xix</ref>. Ces critiques, pour fondées qu'elles soient, ne doivent pas faire oublier les apports décisifs d'Aristote. Il a établi les règles de la déduction valide, distingué clairement la forme et la matière du raisonnement, montré la nécessité des principes premiers et l'impossibilité d'une science unique et universelle. Sa théorie des causes et sa conception de l'explication scientifique comme connaissance du « pourquoi » restent fécondes. Surtout, il a compris que la science n'est pas un simple catalogue de faits, mais un système organisé de propositions reliées par des rapports logiques et causaux. Cette exigence de systématicité et de rigueur demeure au cœur de toute entreprise scientifique, même si les formes concrètes de la rationalité scientifique ont profondément évolué depuis Aristote<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 169-202</ref>. En définitive, les ''Analytiques'' représentent l'effort le plus abouti de l'Antiquité pour penser les conditions de la connaissance véritable. Aristote y pose les questions fondamentales de toute épistémologie : qu'est-ce que savoir ? Comment passe-t-on de l'ignorance à la science ? Quels sont les rapports entre la sensation, l'expérience et la raison ? Quelle est la nature des principes premiers ? Ces questions, loin d'être résolues une fois pour toutes, continuent de nourrir la réflexion philosophique contemporaine sur la science, ses méthodes et ses fondements. === Chapitre IV : Les ''Topiques'' – L'art de la dialectique === ==== La dialectique et les lieux communs ==== Si les ''Analytiques'' traitent de la démonstration scientifique, les ''Topiques'' concernent le raisonnement dialectique. La dialectique part de prémisses probables (''endoxa''), c'est-à-dire d'opinions généralement admises par tous, ou par les plus nombreux, ou par les sages<ref>Aristote, ''Topiques'', I, 1, 100a29-b23</ref>. Elle ne vise pas la certitude scientifique mais l'art de discuter de manière raisonnable sur toute question. Les ''topoi'' ou lieux sont des schèmes d'argumentation valables dans de multiples domaines. Par exemple, le lieu « du plus et du moins » permet d'argumenter ainsi : si ce qui est plus susceptible d'appartenir à quelque chose ne lui appartient pas, ce qui l'est moins ne lui appartiendra pas non plus<ref>Aristote, ''Topiques'', II, 10, 114b37-115a3</ref>. Aristote recense systématiquement ces lieux et les classe selon les catégories. ==== L'utilité de la dialectique ==== Aristote assigne trois usages à la dialectique. D'abord, elle sert d'entraînement intellectuel, développant la capacité d'argumenter sur n'importe quel sujet. Ensuite, elle est utile dans les rencontres avec autrui, permettant de discuter à partir d'opinions communes. Enfin, et surtout, elle sert aux sciences philosophiques elles-mêmes<ref>Aristote, ''Topiques'', I, 2, 101a25-b4</ref>. En effet, la dialectique permet d'examiner de manière critique (''peirastike'') les principes des sciences, en confrontant les opinions opposées sur un sujet. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. C'est cette méthode dialectique qu'Aristote met systématiquement en œuvre dans ses traités, commençant par recenser les opinions des prédécesseurs, examinant les difficultés, avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7</ref>. === Chapitre V : Les ''Réfutations sophistiques'' – Les paralogismes et leur réfutation === ==== Les sophismes et leurs types ==== Les ''Réfutations sophistiques'' complètent les ''Topiques'' en examinant les raisonnements fallacieux utilisés par les sophistes. Aristote distingue treize types de sophismes, dont six dépendent du langage (l'homonymie, l'amphibologie, la composition, la division, l'accentuation, la forme de l'expression) et sept sont indépendants du langage (l'accident, le passage du qualifié à l'absolu, l'ignorance de la réfutation, la pétition de principe, le faux enchaînement, la prise de l'antécédent comme conséquent, la réunion de plusieurs questions en une)<ref>Aristote, ''Réfutations sophistiques'', 4, 165b23-166b19</ref>. L'exemple du sophisme par accident est célèbre : « Coriskos est différent de Socrate / Or Socrate est un homme / Donc Coriskos est différent d'un homme ». Ce raisonnement est vicieux car il confond « être différent de Socrate » et « être différent d'un homme », alors que la première propriété appartient à Coriskos par accident, en tant qu'il se trouve que Socrate est l'homme en question<ref>Aristote, ''Réfutations sophistiques'', 5, 166b28-36</ref>. ==== La portée philosophique de la réfutation des sophismes ==== Au-delà de son utilité pratique pour déjouer les pièges argumentatifs, cette étude des sophismes a une portée philosophique profonde. Elle montre qu'il existe des règles objectives du raisonnement correct, indépendantes de l'habileté rhétorique. Contre le relativisme sophistique, qui prétendait qu'on peut également bien défendre n'importe quelle thèse et son contraire, Aristote établit qu'il y a des critères rationnels pour distinguer le vrai du faux, le raisonnement valide de l'invalide<ref>Aristote, ''Réfutations sophistiques'', 11, 171b34-172a7</ref>. Cette défense de la possibilité d'une vérité objective et d'une rationalité universelle contre le relativisme sophiste constitue l'un des enjeux majeurs de la philosophie aristotélicienne, qui se prolongera dans sa défense du principe de non-contradiction contre ceux qui, comme Héraclite selon Aristote, semblaient le nier<ref>Aristote, ''Métaphysique'', Γ, 3-4, 1005b19-1008b31</ref>. == Deuxième partie : La philosophie de la nature == === Chapitre I : La ''Physique'' – Les principes du mouvement et du changement === ==== La nature comme principe interne de mouvement ==== La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits. Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. C'est pourquoi le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27</ref>. En cela, Aristote se distingue du platonisme, qui tendait à négliger la matière et à ramener l'explication physique aux formes intelligibles séparées. ==== Les quatre causes ==== Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3</ref>. Ces quatre causes ne s'excluent pas mais se complètent. Souvent même, plusieurs causes coïncident : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération (cause finale)<ref>Aristote, ''Physique'', II, 7, 198a24-27</ref>. ==== Le mouvement et ses espèces ==== Le mouvement (''kinesis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11</ref>. Cette définition énigmatique signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité pleine et achevée d'une chose. Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement ou translation)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9</ref>. Parmi ces changements, le mouvement local est premier en nature et en dignité, car il peut exister sans les autres, tandis que les autres le présupposent<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7</ref>. ==== L'infinité du mouvement et le Premier Moteur ==== Le mouvement est-il éternel ou a-t-il commencé ? Aristote démontre qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15</ref>. Il faut donc, pour éviter une régression à l'infini des moteurs, qu'existe un Premier Moteur absolument immobile qui meut éternellement. Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19</ref>. Cette preuve physique du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique'' sur Dieu comme Pensée de la Pensée. === Chapitre II : Le ''De caelo'' – Le ciel et les éléments === ==== La cinquième essence et l'éternité du monde ==== Le traité ''Du ciel'' étudie d'abord le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aither''), distinct des quatre éléments sublunaires, qui est animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17</ref>. Cette cinquième essence ou quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution, ni altération. Le ciel est donc éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ex nihilo, donnant lieu à de subtiles tentatives de conciliation comme celles de Thomas d'Aquin. ==== La structure du cosmos ==== Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres. Chaque planète est portée par une sphère animée d'un mouvement circulaire uniforme, et l'ensemble de ces sphères forme un système dont le mouvement est communiqué par le Premier Moteur immobile situé à la périphérie de l'univers<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11</ref>. Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction ontologique entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction fondamentale sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature non éthérée des comètes. ==== Les quatre éléments et leurs mouvements naturels ==== Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent naturellement vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent naturellement vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21</ref>. Ces mouvements naturels expliquent la disposition concentrique des éléments : la terre au centre, recouverte par l'eau, puis l'air, puis le feu. Ils fondent aussi la dynamique aristotélicienne, selon laquelle chaque corps tend naturellement vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. === Chapitre III : Le ''De generatione et corruptione'' – Génération, corruption et transformation === ==== Les deux espèces de génération ==== La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir parce qu'il serait passage du non-être à l'être, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels. La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7</ref>. ==== L'action et la passion – Le contact et le mélange ==== Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement, considéré tantôt du point de vue de l'agent, tantôt de celui du patient<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19</ref>. Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes indivisibles : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange mais juxtaposition<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire. === Chapitre IV : Les ''Météorologiques'' – Les phénomènes du monde sublunaire === ==== Le programme de la science naturelle ==== Les ''Météorologiques'' s'insèrent dans le vaste programme de la physique aristotélicienne. Après avoir traité des principes du mouvement dans la ''Physique'', de la structure de l'univers dans le ''De caelo'', et des transformations des éléments dans le ''De generatione'', Aristote étudie maintenant les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5</ref>. Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : non seulement les phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi les comètes, la Voie Lactée, les tremblements de terre, la mer et ses marées, les fleuves et leurs crues, etc. ==== Les deux exhalaisons et l'explication des météores ==== Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12</ref>. Ces deux exhalaisons, s'élevant dans l'atmosphère, donnent naissance à la plupart des phénomènes météorologiques. L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34</ref>. Ces explications, souvent fausses, témoignent néanmoins d'une démarche rationnelle qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe ou au surnaturel. === Chapitre V : Le ''De anima'' – L'âme, forme du corps vivant === ==== Définition de l'âme ==== Le traité ''De l'âme'' appartient à la fois à la physique, puisque l'âme est principe de mouvement du corps vivant, et à ce que nous appellerions aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28</ref>. Cette définition signifie que l'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée qui habiterait le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable de son corps propre<ref>Aristote, ''De l'âme'', II, 1, 413a3-10</ref>. ==== Les trois âmes et leurs facultés ==== Il y a trois niveaux d'âme, correspondant aux trois types de vivants. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure les fonctions de nutrition, croissance et reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28</ref>. Ces trois âmes ne sont pas trois substances séparées dans le vivant, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence. ==== La sensation et l'intellection ==== La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le fer ou l'or dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe), qu'il perçoit infailliblement. Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure) et permet de comparer les données de différents sens<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16</ref>. L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25</ref>. Ce dernier est séparé, impassible, sans mélange avec le corps, et Aristote suggère qu'il pourrait être immortel, bien que cette thèse reste obscure et ait donné lieu à d'innombrables controverses dans la tradition commentatoriale arabe et latine. === Chapitre VI : Les ''Parva Naturalia'' – Les fonctions vitales === ==== Organisation et contenu des Petits traités d'histoire naturelle ==== Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières, considérées dans leur rapport au corps<ref>Aristote, ''De la sensation'', 1, 436a1-17</ref>. Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence, faculté de retrouver volontairement un souvenir. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique, y voyant de simples coïncidences. ==== Le cœur, principe de la vie ==== Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18</ref>. C'est dans le cœur que réside la chaleur innée, principe de toutes les opérations vitales. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34</ref>. Cette erreur anatomique, que Galien corrigera partiellement en reconnaissant au cerveau un rôle dans les sensations et les mouvements volontaires, illustre les limites de la science aristotélicienne, tributaire des moyens techniques de son époque. Elle n'enlève rien à la valeur de la démarche méthodologique d'Aristote, qui cherche à expliquer les phénomènes vitaux par des causes naturelles observables. == Troisième partie : La biologie et la connaissance du vivant == === Chapitre I : L'''Histoire des animaux'' – L'enquête empirique === ==== Méthode et organisation de l'œuvre ==== L'''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un immense travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui servira de fondement aux explications causales développées dans les autres traités biologiques. Aristote y décrit avec une précision remarquable l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats, les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles minutieuses, complétées par des témoignages de pêcheurs, chasseurs et éleveurs. C'est le premier grand ouvrage de zoologie systématique de l'histoire occidentale<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910</ref>. ==== Principes de classification ==== Aristote organise les animaux selon une classification qui prend en compte de multiples critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire (carnivores, herbivores), présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés). Contrairement à une idée reçue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10</ref>. Cette intuition d'une scala naturae, d'une échelle de la nature, influencera durablement la pensée biologique jusqu'à Lamarck et Darwin. === Chapitre II : Les ''Parties des animaux'' – La causalité finale dans le vivant === ==== Méthode de la biologie : de la description à l'explication ==== Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9</ref>. Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature, même si celle-ci n'atteint pas la dignité des réalités éternelles. Il affirme qu'« il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17</ref>. Cette célébration de la beauté et de l'ordre de la nature, même dans ses manifestations les plus humbles, exprime l'émerveillement du savant devant l'infinie diversité du vivant. ==== La priorité de la cause finale ==== Dans l'étude des vivants, la cause finale doit primer. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, non par hasard, mais parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8</ref>. Aristote critique vigoureusement le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Comment le hasard pourrait-il produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation ? La matière joue certes un rôle, par ses propriétés et ses nécessités, mais elle est toujours au service de la forme et de la fin<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9</ref>. ==== L'unité fonctionnelle de l'organisme ==== Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes, etc.<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13</ref> Cette conception systémique de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, annonce certaines perspectives de la biologie moderne, notamment l'approche fonctionnaliste. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité quasi infinie des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout. === Chapitre III : La ''Génération des animaux'' – Reproduction et hérédité === ==== Les modes de reproduction ==== Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18</ref>. Dans la génération sexuée, le mâle apporte la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21</ref>. Cette théorie, qui reflète les préjugés androcentrés de l'époque, dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. ==== L'embryogenèse et la formation des parties ==== Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13</ref>. Cette description remarquable fonde la conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature. La cause de cette différenciation progressive est la chaleur vitale contenue dans la semence, qui cuit et façonne la matière menstruelle comme le présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre et avec telles caractéristiques. ==== L'hérédité et la ressemblance ==== Pourquoi les enfants ressemblent-ils à leurs parents ? Pourquoi parfois ressemblent-ils plutôt aux grands-parents ou à des ancêtres plus lointains ? Aristote explique ces phénomènes par le plus ou moins grand degré de cuisson et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle est un peu moins parfaite, il ressemble à la mère ; si elle l'est encore moins, aux grands-parents, etc.<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14</ref> Ces explications, bien que rudimentaires et souvent erronées dans le détail, témoignent d'un effort remarquable pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine ou la magie. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre, même si les réponses devront être révisées par la science ultérieure. === Chapitre IV : Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal === ==== Le principe du mouvement volontaire ==== Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air pour se déplacer<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11</ref>. Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2</ref>. Ainsi, le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû, comme le Premier Moteur meut le ciel. ==== Les modes de locomotion ==== Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse, configurations qui rendent le vol possible<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7</ref>. Ces études, qui mêlent observations précises et raisonnements mécaniques, relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques vérifiables, sans abandonner toutefois le cadre téléologique général qui voit partout dans la nature l'action providentielle d'une finalité immanente. == Quatrième partie : La philosophie première ou métaphysique == === Chapitre I : Objet et divisions de la métaphysique === ==== La science de l'être en tant qu'être ==== La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22</ref>. Cette formulation distingue la métaphysique de toutes les sciences particulières. Celles-ci étudient une partie ou un aspect de l'être : la géométrie étudie l'être en tant que continu, la biologie l'être en tant que vivant. Seule la métaphysique considère l'être dans sa totalité et sa généralité, recherchant ce qui appartient à tout être du seul fait qu'il est. Cette science est « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle fonde toutes les autres sciences en étudiant les principes communs à toutes, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8</ref>. Elle est aussi la plus divine des sciences, car elle porte sur ce qu'il y a de plus divin, Dieu comme Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10</ref>. ==== La question de l'unité de la métaphysique ==== Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier, Dieu ? Cette apparente tension a donné lieu à deux interprétations dans l'histoire de la philosophie. Pour certains, il y aurait deux métaphysiques chez Aristote, l'une générale, l'autre spéciale, maladroitement juxtaposées. Pour d'autres, dont Thomas d'Aquin<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium</ref>, l'unité est assurée par le fait que Dieu est principe de tout être, de sorte qu'en étudiant Dieu on étudie la cause première de tout ce qui est. Une troisième solution reconnaît que l'être se dit en plusieurs sens (substance, qualité, quantité, etc.), mais que tous ces sens se rapportent à un sens premier, la substance. Et parmi les substances, la substance divine est première. Ainsi, la métaphysique étudie-t-elle l'être en étudiant ce qui est premier dans l'être : la substance, et plus particulièrement la substance immobile séparée<ref>Aristote, ''Métaphysique'', Ε, 1, 1026a23-32</ref>. ==== Les apories de la métaphysique ==== Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers. Y a-t-il une science unique de toutes les causes, ou plusieurs sciences ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées immobiles ? Les principes sont-ils universels ou particuliers ? Sont-ils en acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17</ref> Cette méthode aporétique, qui consiste à commencer par rassembler les difficultés et à examiner les arguments dans les deux sens avant de proposer une solution, est caractéristique de la démarche aristotélicienne. Elle empêche le dogmatisme et oblige à prendre en compte toute la complexité des problèmes. « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27</ref>. === Chapitre II : La substance (livres Z-H) === ==== Qu'est-ce que la substance ? ==== Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux. Aristote élimine d'abord l'universel et le genre comme candidats à la substantialité. Ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16</ref>. Cette exclusion vise clairement la théorie platonicienne des Idées, qui faisait de l'Homme en soi, universel, la véritable substance dont les hommes particuliers n'étaient que des copies. ==== La forme, substance première ==== Le substrat a plus de titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination, ce qui est absurde<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26</ref>. C'est donc la forme (''morphê'', ''eidos'') qui est substance au sens le plus propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28</ref>. ==== Le composé de matière et de forme ==== La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27</ref>. Toutefois, la forme demeure première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33</ref>. === Chapitre III : Puissance et acte (livre Θ) === ==== La distinction de la puissance et de l'acte ==== La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de résoudre les apories de Parménide et de Platon concernant le devenir et la participation. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17</ref>. Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18</ref>. ==== La priorité de l'acte sur la puissance ==== Aristote établit que l'acte est antérieur à la puissance en plusieurs sens. Dans l'ordre de la définition, car on définit la puissance par l'acte correspondant (ce qui peut voir est ce qui peut exercer l'acte de la vision). Dans l'ordre de la connaissance, car on connaît la puissance en connaissant son actualisation. Dans l'ordre de l'essence et du temps, car l'acte est la fin de la puissance<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3</ref>. Plus profondément encore, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28</ref>. Ce raisonnement fonde métaphysiquement la primauté de la théologie dans la philosophie première. === Chapitre IV : L'Un et le Multiple (livres I-K) === ==== L'un se dit en plusieurs sens ==== Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition (être et un sont convertibles)<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14</ref>. Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose. L'un n'ajoute rien à l'être, il exprime simplement son indivisibilité. ==== La pluralité et le nombre ==== La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24</ref>. Mais qu'est-ce que cette unité qui mesure ? Dans les nombres arithmétiques, c'est l'unité absolument indivisible. Dans les choses sensibles, c'est une unité relative à un genre : pour mesurer des longueurs, on prend une longueur comme unité ; pour mesurer des poids, un poids. Cette analyse du nombre et de la mesure fonde la possibilité des mathématiques et des sciences quantitatives. Elle montre aussi qu'il ne peut y avoir de science mathématique absolument universelle, puisque chaque genre de grandeur requiert sa propre unité de mesure. === Chapitre V : Le Premier Moteur immobile (livre Λ) === ==== La démonstration de l'existence du Premier Moteur ==== Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5</ref> La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4</ref>. Il doit donc exister un premier moteur qui meut sans être mû. ==== La nature du Premier Moteur ==== Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4</ref>. Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35</ref>. Cette vie divine est la plus haute qui soit, et la vie philosophique est bienheureuse dans la mesure où elle participe à cette activité contemplative. ==== Les moteurs des sphères ==== Le mouvement complexe des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres comme dans une hiérarchie, mais chacun meut directement sa sphère. Cette prolifération de dieux cosmiques, nécessaire pour sauver les phénomènes astronomiques, contredit-elle le monothéisme du Premier Moteur unique ? La tradition péripatéticienne et la scolastique médiévale tenteront de concilier l'unité divine avec la pluralité des intelligences motrices, en faisant de celles-ci des substances secondes subordonnées au Premier Moteur. === Chapitre VI : Critique de la théorie platonicienne des Idées (livres M-N) === ==== Les arguments contre les Idées séparées ==== Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, condition de toute science. Mais il lui reproche d'avoir séparé ces formes intelligibles des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8</ref>. Cette séparation est inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles (puisqu'elles sont séparées d'eux), ni à leur existence (puisqu'elles ne sont pas en eux), ni à leur devenir (puisqu'elles sont immobiles)<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9</ref>. Impossible, car elle conduit à des apories insolubles, comme l'argument du Troisième Homme : si Socrate ressemble à l'Homme en soi, il faut une troisième Idée pour fonder cette ressemblance, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8</ref>. ==== Le statut des êtres mathématiques ==== Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés. Il n'étudie pas des êtres qui existeraient dans un monde séparé, mais des aspects abstraits des êtres sensibles. Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17</ref>. == Cinquième partie : La philosophie pratique == === Chapitre I : L'''Éthique à Nicomaque'' – La vie bonne === ==== Le souverain bien et le bonheur ==== L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26</ref>. Mais en quoi consiste le bonheur ? Les hommes en donnent des définitions différentes : le plaisir, les honneurs, la richesse. Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18</ref>. ==== Les vertus éthiques et la doctrine du juste milieu ==== Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2</ref>. Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2</ref>. Cette doctrine du juste milieu a connu une fortune considérable, devenant l'un des principes les plus populaires de la philosophie morale. Elle exprime une sagesse pratique qui fuit les extrêmes et recherche l'équilibre, tout en reconnaissant la complexité du jugement moral qui doit tenir compte de la situation concrète. ==== L'amitié ==== Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''), vertu sociale essentielle. Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7</ref>. Seule la dernière est véritablement amitié, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité : on ne peut être ami de beaucoup, car l'amitié véritable exige une vie partagée<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15</ref>. L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4</ref>. ==== La vie contemplative ==== Le livre X couronne l'éthique en montrant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect est la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18</ref>. Certes, cette vie purement intellectuelle dépasse les forces humaines prises isolément. Mais dans la mesure où il y a en nous quelque chose de divin, l'intellect, nous devons tendre vers cette vie divine<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34</ref>. La vie selon les vertus morales est bonne et humaine, mais la vie selon l'intellect est divine. Le sage qui la mène est le plus heureux des hommes, celui que les dieux aiment le plus. === Chapitre II : Les ''Politiques'' – La cité et les constitutions === ==== L'homme, animal politique ==== Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et aux cyniques, qui prônaient l'autarcie individuelle. L'homme ne peut vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4</ref>. ==== Les formes de constitution ==== Aristote distingue six formes de constitution, selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou politeia (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie (au sens péjoratif de démagogie)<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10</ref>. Aucune de ces constitutions n'est absolument la meilleure en tout lieu et en tout temps. La meilleure constitution pour une cité donnée dépend des circonstances : étendue du territoire, richesses, mœurs des habitants, etc. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon. ==== La constitution mixte et la classe moyenne ==== La constitution la plus stable est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions. Cette théorie de la classe moyenne et de la constitution mixte influencera durablement la pensée politique occidentale, de Polybe à Montesquieu. Elle exprime un idéal de modération et d'équilibre, caractéristique de la sagesse pratique aristotélicienne. ==== L'éducation ==== Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21</ref>. Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit dans la contemplation et les arts libéraux<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13</ref>. === Chapitre III : La ''Rhétorique'' – L'art de persuader === ==== La rhétorique comme art ==== La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11</ref>. Aristote défend la rhétorique contre les attaques de Platon qui, dans le ''Gorgias'', en faisait une simple flatterie. Bien utilisée, elle est un art (''technê'') légitime et utile. Elle sert à défendre la vérité et la justice, car il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24</ref>. ==== Les trois genres rhétoriques et leurs topiques ==== Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29</ref>. Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible, recourant aux arguments sur les conséquences. Le judiciaire porte sur le juste et l'injuste, s'appuyant sur les lois et les témoignages. L'épidictique porte sur le beau et le laid moral, utilisant l'amplification<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5</ref>. ==== Les preuves rhétoriques : ethos, pathos, logos ==== Aristote distingue trois moyens de persuasion : l'ethos (le caractère de l'orateur), le pathos (les émotions de l'auditoire), et le logos (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13</ref>. L'ethos persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le pathos persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie, etc.), leurs causes et leurs manifestations. Le logos persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5</ref>. Cette analyse des moyens de persuasion fonde la rhétorique comme discipline rationnelle et systématique, loin de l'empirisme des sophistes. Elle restera la base de l'enseignement rhétorique jusqu'à l'époque moderne. === Chapitre IV : La ''Potique'' – La création artistique === ==== La mimêsis et la catharsis ==== La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5</ref>. C'est pourquoi la poésie est plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier. La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28</ref>. Cette doctrine de la catharsis, qui répond à l'accusation platonicienne selon laquelle la tragédie corrompt l'âme en excitant les passions, est demeurée énigmatique. Peut-être Aristote veut-il dire que la tragédie, en permettant de ressentir ces émotions dans un cadre fictif, les évacue ou les modère, préparant ainsi le spectateur à mieux les gérer dans la vie réelle. ==== La structure de la tragédie ==== Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance<ref>Aristote, ''Poétique'', 11, 1452a15-32</ref>. Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion, parce que son crime procède de l'ignorance et non de la méchanceté. Ces analyses ont profondément influencé la théorie littéraire occidentale, de la Renaissance (avec la redécouverte de la ''Poétique'' et son influence sur le théâtre classique français) jusqu'à nos jours. == Conclusion : L'héritage d'Aristote == === La transmission et l'influence historique === L'influence d'Aristote sur l'histoire de la pensée occidentale et orientale est sans égale. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, souvent en tentant de les harmoniser avec le platonisme. Au IXe siècle, les philosophes arabes traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et surtout Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui influencera en retour l'Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin. Elles révolutionnent l'université médiévale. Albert le Grand (1200-1280) et surtout Thomas d'Aquin (1225-1274) christianisent Aristote, montrant la compatibilité de sa philosophie avec la foi chrétienne. Le thomisme devient la philosophie officielle de l'Église catholique. Mais cette domination scolastique d'Aristote provoque aussi, à la Renaissance et à l'époque moderne, un puissant mouvement de rejet. La science moderne, de Galilée à Newton, se construit explicitement contre la physique aristotélicienne. === La pertinence contemporaine d'Aristote === Après trois siècles d'éclipse relative, le XXe siècle voit un remarquable renouveau de l'intérêt pour Aristote. En éthique, l'éthique des vertus revient au premier plan après la domination du kantisme et de l'utilitarisme, grâce aux travaux d'Anscombe, MacIntyre, Nussbaum. En philosophie de l'esprit, on redécouvre la pertinence du hylémorphisme aristotélicien face aux apories du dualisme cartésien et du matérialisme réductionniste. En métaphysique, Aristote inspire un renouveau de l'ontologie réaliste, attentive aux structures catégorielles de la réalité. En philosophie de la biologie, sa téléologie immanente et sa conception de l'organisme comme totalité fonctionnelle retrouvent une actualité face aux limites du mécanisme et du réductionnisme génétique. Plus largement, Aristote demeure une référence incontournable pour quiconque s'interroge sur les grandes questions philosophiques : qu'est-ce que l'être ? qu'est-ce que la connaissance ? comment vivre bien ? quelle est la meilleure constitution politique ? Son œuvre, par sa richesse, sa rigueur et son ampleur encyclopédique, continue de nourrir la réflexion philosophique contemporaine. == Notes et références == {{references}} == Bibliographie == '''Éditions de référence :''' * Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014 * Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870 '''Études générales :''' * Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962 * Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995 * Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923) * Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990 '''Études spécialisées :''' * Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992 * Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003 * David Ross, ''Aristotle'', London, Methuen, 1923 {{Autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Aristote}} 9gbtgjdbe1238ddxl44fsrw43t7e2mj 764928 764917 2026-04-25T06:58:43Z PandaMystique 119061 764928 wikitext text/x-wiki {{DicoPhilo|Aristote}} == Introduction générale : Aristote, le philosophe universel == === Vie et contexte historique === ==== Origines familiales et contexte macédonien ==== Aristote naquit en 384 av. J.-C. à Stagire<ref>Stagire, l'actuelle Stavro, était une colonie grecque de la Chalcidique de Thrace, située sur la côte septentrionale de la mer Égée, à proximité de la Macédoine. Voir Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923), p. 103-104.</ref>, petite cité de la Chalcidique en Macédoine, d'où son surnom de Stagirite<ref>Ce patronyme sera employé tout au long de l'Antiquité pour le désigner. Cf. Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', Göteborg, Almqvist & Wiksell, 1957, p. 253-257.</ref>. Son père, Nicomaque, était médecin et appartenait à la prestigieuse corporation des Asclépiadés, dont les membres prétendaient descendre du dieu de la médecine, Asclépios<ref>Les Asclépiadés formaient une famille sacerdotale de médecins héritiers d'une longue tradition hippocratique. Voir Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 1, trad. sous la dir. de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, 1999, p. 573.</ref>. Nicomaque exerçait la fonction de médecin personnel et ami (''philos'') du roi Amyntas III de Macédoine<ref>Cette position à la cour macédonienne conférait à la famille d'Aristote un statut privilégié et des relations influentes avec la maison royale. Voir Jean Brun, ''Aristote et le Lycée'', Paris, PUF, « Que sais-je ? », 1961, p. 7-8.</ref><ref>Diogène Laërce, ''Vies'', V, 1, op. cit., p. 573.</ref>. Sa mère, Phæstias (ou Phaestis), originaire de Chalcis en Eubée, était sage-femme<ref>Certaines sources antiques indiquent qu'elle descendait d'une famille chalcidienne de notables. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 259.</ref>. La famille d'Aristote s'inscrivait ainsi dans un milieu cultivé, marqué à la fois par la pratique médicale rationnelle et par des ascendances ioniennes<ref>Ces origines ioniennes expliqueraient en partie son goût pour l'investigation scientifique de la nature (''physis''), caractéristique des premiers Physiciens d'Ionie. Voir Werner Jaeger, ''Aristote'', op. cit., p. 105-106.</ref><ref>Ernest Barker, ''The Politics of Aristotle'', Oxford, Clarendon Press, 1946, Introduction, p. XI.</ref>. Aristote devint orphelin à un âge précoce, perdant son père alors qu'il était encore enfant<ref>Sa mère mourut également jeune, laissant Aristote orphelin de ses deux parents avant ses dix-sept ans. Voir Werner Jaeger, ''Aristote'', op. cit., p. 104.</ref>. Il fut dès lors élevé par Proxène d'Atarnée, un ami de sa famille, qui était originaire d'Atarnée en Mysie<ref>Atarnée était une cité située en Asie Mineure, en Troade. Diogène Laërce, ''Vies'', V, 3, op. cit., p. 574.</ref>. En reconnaissance, Aristote adoptera plus tard Nicanor, le fils de Proxène, et lui destinera même sa propre fille Pythias par son testament<ref>Le testament d'Aristote, conservé par Diogène Laërce (V, 11-16), témoigne de ces liens familiaux durables. Voir l'édition dans Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014, p. 2597-2600.</ref><ref>Ces nouvelles attaches familiales constitueront les premiers rapports qu'Aristote entretiendra avec la région d'Atarnée, où il rencontrera plus tard Hermias, le futur tyran du lieu. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. ==== Formation à l'Académie de Platon (367-347 av. J.-C.) ==== À l'âge de dix-sept ans, en 367-366 av. J.-C., Aristote se rend à Athènes, qui demeure alors, malgré son déclin politique et économique après les Guerres du Péloponnèse, le principal foyer intellectuel et culturel du monde grec<ref>Sous l'archontat de Polyzélos (selon Denys d'Halicarnasse) ou de Nausigénès (selon d'autres sources). Apollodore d'Athènes, cité par Diogène Laërce, V, 9, op. cit., p. 577.</ref>. Il entre à l'Académie de Platon, l'école philosophique fondée par Platon en 387 av. J.-C. après son retour de Sicile<ref>L'Académie tirait son nom du gymnase d'Académos, situé dans un faubourg d'Athènes. Voir Harold Cherniss, ''The Riddle of the Early Academy'', Berkeley, University of California Press, 1945, p. 1-72.</ref>. Cette institution, véritable prototype des universités futures, dispensait un enseignement encyclopédique en mathématiques, astronomie, musique, dialectique, politique et philosophie<ref>Léon Robin, ''Aristote'', Paris, PUF, 1944, p. 3.</ref>. Aristote y demeura vingt ans, jusqu'à la mort de Platon en 348-347 av. J.-C.<ref>Apollodore d'Athènes, cité par Diogène Laërce (V, 9-10), fournit cette chronologie précise. Voir Diogène Laërce, ''Vies'', op. cit., p. 577-578.</ref>. Très rapidement, le jeune Aristote se distingua par son intelligence exceptionnelle et son ardeur à l'étude. Platon lui-même l'aurait surnommé le Liseur (''anagnôstês'') ou encore l'Intelligence de l'école (''ho nous tês scholês'')<ref>Ces surnoms témoignent de la reconnaissance par le Maître des dons hors du commun de son élève. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 325-327.</ref><ref>''Vita Marciana'', dans Valentin Rose, ''Aristoteles Pseudepigraphus'', Leipzig, Teubner, 1863, p. 428 ; Jean Philopon, dans Proclus, ''De aeternitate mundi'', VI, 27, éd. Hugo Rabe, Leipzig, Teubner, 1899, p. 145.</ref>. Contrairement à une légende tenace, probablement issue des polémiques ultérieures entre épicuriens et péripatéticiens, Aristote ne rompit jamais avec Platon de son vivant<ref>Les récits de Diogène Laërce évoquant une rupture violente sont aujourd'hui considérés comme des médisances sans fondement historique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 113-128.</ref>. Plusieurs éléments confirment au contraire la profonde amitié et le respect mutuel qui les unirent jusqu'à la fin. Aristote composa une élégie en l'honneur de son ami Eudème de Chypre, où il célèbre magnifiquement Platon comme le maître qui ne saurait jamais être loué comme il le mériterait par des hommes méchants<ref>Fragment 623 (Rose), conservé par Olympiodore. Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886, p. 42-43.</ref>. Dans l'''Éthique à Nicomaque'', Aristote écrit ces mots célèbres : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096 a 12-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44.</ref><ref>Cette phrase a été traduite en latin par l'adage ''Amicus Plato, sed magis amica veritas'' : « ami de Platon, mais plus encore ami de la vérité ». Voir Ammonius, ''In Categorias'', éd. Busse, Berlin, Reimer, 1895, p. 79.</ref>. Aristote participa activement à l'enseignement de l'Académie. On lui attribue notamment la charge du cours de rhétorique, qu'il aurait inauguré, selon certains témoignages, par cette formule provocatrice : « Il serait honteux de se taire et de laisser parler Isocrate »<ref>Cette boutade visait Isocrate, le rival de Platon en matière d'enseignement rhétorique. Voir Werner Jaeger, ''Aristote'', op. cit., p. 180-182.</ref><ref>Philodème, ''Volumina rhetorica'', II, 36, 3-5, éd. Siegfried Sudhaus, Leipzig, Teubner, 1892-1896, vol. II, p. 50 ; Cicéron, ''De Oratore'', III, 35, 141 ; Quintilien, ''Institutio oratoria'', III, 1, 14.</ref>. Cette période fut également celle de ses premières publications, sous forme de dialogues à la manière platonicienne, dont la plupart sont aujourd'hui perdus<ref>Cicéron loua plus tard la beauté littéraire de ces dialogues, parlant d'un ''flumen orationis aureum'' : « un fleuve d'or de paroles ». Cicéron, ''Academica priora'', II, 38, 119.</ref>. ==== Voyages et maturation (348-335 av. J.-C.) ==== À la mort de Platon en 347, c'est le neveu du Maître, Speusippe, qui prend la direction de l'Académie. Aristote, qui peut-être avait espéré cette succession, quitte alors Athènes. Il se rend à Atarnée et Assos, en Troade (Asie Mineure), auprès de son ami Hermias, ancien condisciple de l'Académie devenu tyran d'Atarnée<ref>Hermias avait été esclave, puis affranchi, avant de devenir maître d'Atarnée et d'Assos. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 272-277.</ref>. Aristote y séjourne pendant trois ans (347-345), accompagné probablement de Xénocrate, autre disciple de Platon<ref>Strabon, ''Géographie'', XIII, 1, 57, trad. F. Lasserre, Paris, Les Belles Lettres, 1981, p. 84-85.</ref>. Il y fonde une sorte de succursale de l'Académie et poursuit ses recherches philosophiques et biologiques<ref>C'est durant ce séjour qu'Aristote aurait entrepris d'importantes observations sur la faune marine de la côte d'Asie Mineure, dont témoignent l'''Histoire des Animaux'' et d'autres traités zoologiques. Voir David M. Balme, « The Place of Biology in Aristotle's Philosophy », dans Allan Gotthelf & James G. Lennox (éd.), ''Philosophical Issues in Aristotle's Biology'', Cambridge, Cambridge University Press, 1987, p. 9-20.</ref>. Hermias, pris dans les luttes entre la Macédoine et la Perse, fut capturé en 341 av. J.-C. par trahison sur ordre d'Artaxerxès III, le roi de Perse, torturé et finalement exécuté<ref>Malgré les tortures, Hermias refusa de trahir ses liens avec Philippe II de Macédoine. Voir Werner Jaeger, ''Aristote'', op. cit., p. 138-142.</ref><ref>Diodore de Sicile, ''Bibliothèque historique'', XVI, 52, trad. P. Goukowsky, Paris, Les Belles Lettres, 1976, p. 164-165.</ref>. Aristote, profondément affecté par cette mort héroïque, composa un célèbre Hymne à la Vertu en son honneur et fit ériger une statue à Delphes portant une épigramme à sa mémoire<ref>Fragments 624 et 625 (Rose), conservés par Diogène Laërce (V, 7-8) et Athénée (''Deipnosophistes'', XV, 696 a-c). Voir Valentin Rose, ''Aristotelis qui ferebantur librorum fragmenta'', op. cit., p. 43-44.</ref>. Il épousa également Pythias, nièce ou fille adoptive d'Hermias, dont il aura une fille du même nom<ref>Dans son testament, Aristote prescrit que ses cendres soient mêlées à celles de Pythias, témoignant de l'attachement profond qu'il lui porta. Diogène Laërce, ''Vies'', V, 16, op. cit., p. 582.</ref>. Après la mort d'Hermias, Aristote quitte Assos pour se rendre à Mytilène, sur l'île de Lesbos, en 345-344 av. J.-C. Il y poursuit pendant deux à trois ans ses observations biologiques et zoologiques, notamment sur les lagunes de Pyrrha<ref>De nombreuses observations précises de l'''Histoire des Animaux'' se rapportent à la faune de Lesbos. Voir Pierre Louis, « Introduction », dans Aristote, ''Histoire des Animaux'', tome I, Paris, Les Belles Lettres, 1964, p. XIV-XVIII.</ref>. ==== Précepteur d'Alexandre le Grand (343-336 av. J.-C.) ==== En 343-342 av. J.-C., Philippe II de Macédoine, qui avait connu Aristote dans sa jeunesse grâce à Nicomaque, appelle le philosophe à la cour de Pella pour devenir le précepteur de son fils, le jeune prince Alexandre, alors âgé de treize ans<ref>Le choix d'Aristote par Philippe s'explique à la fois par leurs relations antérieures et par la réputation encyclopédique qu'avait acquise le philosophe. Voir Werner Jaeger, ''Aristote'', op. cit., p. 145-148.</ref><ref>Plutarque, ''Vie d'Alexandre'', 7-8, trad. R. Flacelière & É. Chambry, Paris, Les Belles Lettres, 1975, p. 33-34.</ref>. Aristote enseigne au prince pendant deux ou trois ans, probablement à Miéza, ville où Philippe avait installé son fils<ref>Miéza était située à l'ouest de Pella, dans un environnement champêtre propice aux études. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 15-16.</ref>. L'enseignement donné à Alexandre portait essentiellement sur la politique, l'éthique, la poésie et les lettres grecques<ref>Aristote aurait fait connaître à Alexandre une édition annotée de l'''Iliade'' d'Homère, que le conquérant emportera dans toutes ses expéditions. Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref><ref>Plutarque rapporte qu'Alexandre disait aimer Aristote autant que son père car, disait-il, « si je dois la vie à l'un, je dois à l'autre de savoir bien vivre ». Plutarque, ''Vie d'Alexandre'', 8, op. cit., p. 34.</ref>. Aristote composa sans doute à cette époque un traité ''Sur la Royauté'' (''Peri basileias''), aujourd'hui perdu, pour l'édification du jeune prince<ref>Ce traité devait exposer la conception aristotélicienne du bon gouvernement monarchique. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', Louvain, Éditions universitaires, 1951, p. 157-158.</ref>. Toutefois, si les relations entre le maître et l'élève furent marquées par une affection réciproque, Alexandre ne suivit que fort peu les conseils de son précepteur. Alors qu'Aristote prêchait la modération et la distinction entre Grecs et Barbares<ref>Aristote considérait les Barbares comme naturellement faits pour être gouvernés par les Grecs. Aristote, ''Politique'', I, 2, 1252 b 5-9, trad. J. Aubonnet, Paris, Les Belles Lettres, 1960, p. 10-11.</ref>, Alexandre adopta une politique d'intégration des peuples conquis et de fusion entre Grecs et Orientaux, allant jusqu'à adopter certains usages perses et prétendre à une origine divine<ref>Ces orientations politiques d'Alexandre furent en contradiction complète avec la pensée politique d'Aristote. Voir Werner Jaeger, ''Aristote'', op. cit., p. 148-152.</ref>. En 335 av. J.-C., lorsque Alexandre part pour la conquête de l'Asie, Aristote propose son neveu Callisthène pour l'accompagner comme conseiller et historiographe<ref>Callisthène, fils de Damastos et neveu d'Aristote, avait collaboré avec le philosophe pour l'établissement de la liste des vainqueurs aux Jeux Pythiques de Delphes. Voir Felix Jacoby, ''Die Fragmente der griechischen Historiker'', Berlin, Weidmann, 1923-1958, 124 F 1.</ref>. Mais Callisthène, refusant d'adopter la proskynèse (prosternation devant le roi) exigée par Alexandre, encourut sa disgrâce et fut exécuté vers 327 av. J.-C., probablement sous l'accusation d'avoir participé à une conjuration<ref>Diogène Laërce (V, 5) et Plutarque (''Vie d'Alexandre'', 55) rapportent cette fin tragique. Voir Diogène Laërce, ''Vies'', op. cit., p. 575-576 ; Plutarque, ''Vie d'Alexandre'', op. cit., p. 81-83.</ref>. ==== Fondation du Lycée et enseignement à Athènes (335-323 av. J.-C.) ==== En 335-334 av. J.-C., après la défaite définitive d'Athènes face à la Macédoine à Chéronée (338 av. J.-C.) et l'affermissement de l'hégémonie macédonienne sur la Grèce, Aristote retourne à Athènes. Il y fonde sa propre école, le Lycée (''Lykeion''), ainsi nommé parce que situé près du temple d'Apollon Lycien<ref>Le Lycée était un gymnase entouré de jardins et de promenoirs couverts (''peripatoi''), d'où le nom d'« école péripatéticienne » donné aux disciples d'Aristote. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 21-24.</ref><ref>Le site archéologique du Lycée fut découvert fortuitement en 1996 lors de travaux au centre d'Athènes et ouvert au public en 2014. Voir Effi Lygouri, « The Lyceum of Aristotle in Athens », dans ''Acta Musei Nationalis Pragae. Series A – Historia'', 60, 1-2, 2006, p. 47-52.</ref>. Aristote y enseigne pendant douze ou treize ans, de 335 à 323 av. J.-C., période d'intense activité intellectuelle, où il poursuit ses cours, dirige des recherches collectives et rédige la plupart de ses traités systématiques (''pragmateiai'') qui nous sont parvenus<ref>Ces traités, dits « acroamatiques » ou « ésotériques », étaient destinés à l'enseignement interne, par opposition aux dialogues « exotériques » écrits pour un large public. Voir Paul Moraux, ''Les listes anciennes des ouvrages d'Aristote'', op. cit., p. 3-85.</ref>. Son enseignement se déployait, selon les témoignages antiques, selon deux modalités : le matin, il dispensait des leçons approfondies sur la philosophie, la physique et la métaphysique, réservées aux initiés (enseignement acroamatique ou ésotérique) ; l'après-midi, il donnait des cours plus accessibles de rhétorique et de dialectique, ouverts à un public plus large (enseignement exotérique)<ref>Aulu-Gelle, ''Nuits attiques'', XX, 5, trad. R. Marache, Paris, Les Belles Lettres, 1978, tome IV, p. 185-186.</ref>. Aristote professait en se promenant (''peripatein'') avec ses disciples dans les allées du gymnase, d'où le nom d'école péripatéticienne donné à son école<ref>Diogène Laërce, ''Vies'', V, 2, op. cit., p. 574.</ref>. Il constitua au Lycée une vaste bibliothèque, la première grande bibliothèque privée du monde grec, et des collections d'histoire naturelle (animaux, plantes, minéraux, cartes géographiques)<ref>Alexandre aurait aidé financièrement son ancien maître en lui envoyant d'Asie des spécimens zoologiques et botaniques. Pline l'Ancien, ''Histoire naturelle'', VIII, 17, trad. A. Ernout, Paris, Les Belles Lettres, 1952, p. 23.</ref>. Il entreprit également avec ses collaborateurs la rédaction monumentale des 158 Constitutions (''Politeiai'') des cités grecques et barbares, dont seule la ''Constitution d'Athènes'' nous est parvenue<ref>Cette œuvre colossale de recherche historique et politique fut probablement un travail collectif sous la direction d'Aristote. Voir Mortimer Chambers, « Aristotle's Forms of Democracy », dans ''Transactions and Proceedings of the American Philological Association'', 92, 1961, p. 20-36.</ref>. ==== Exil et mort (323-322 av. J.-C.) ==== À la mort d'Alexandre le Grand, survenue à Babylone en juin 323 av. J.-C., une violente réaction antimacédonienne éclate à Athènes, dirigée par le parti nationaliste de Démosthène et d'Hypéride<ref>Cette réaction avait été préparée pendant la captivité de Démosthène et éclata au grand jour à la nouvelle de la mort d'Alexandre. Voir Werner Jaeger, ''Aristote'', op. cit., p. 387-390.</ref>. Aristote, en tant que métèque (étranger domicilié) proche de la Macédoine, se trouve menacé<ref>En tant que métèque, Aristote n'avait jamais eu le droit de cité athénien ni le droit de participer à la vie publique. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 32-33.</ref>. Un certain Démophile, peut-être prêtre d'Éleusis, l'accuse d'impiété (''asebeia''), lui reprochant d'avoir composé l'Hymne à la Vertu en l'honneur d'Hermias, honneur normalement réservé aux dieux<ref>Cette accusation d'impiété rappelait évidemment le procès de Socrate en 399 av. J.-C. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 346-350.</ref><ref>Diogène Laërce, ''Vies'', V, 5-6, op. cit., p. 575-576.</ref>. Sans attendre le jugement qui le condamnerait certainement, Aristote quitte précipitamment Athènes et se réfugie à Chalcis, en Eubée, ville natale de sa mère, où il possédait des biens hérités par elle<ref>En partant, Aristote aurait déclaré, selon Aulu-Gelle, vouloir « empêcher les Athéniens de commettre un second crime contre la philosophie », allusion évidente au procès de Socrate. Aulu-Gelle, ''Nuits attiques'', III, 3, 10, op. cit., tome I, p. 151.</ref>. Il confie la direction du Lycée à Théophraste d'Érèse, son plus fidèle disciple et collaborateur<ref>Théophraste dirigera le Lycée pendant trente-cinq ans, jusqu'en 288-287 av. J.-C., poursuivant l'œuvre encyclopédique de son maître. Voir Diogène Laërce, ''Vies'', V, 36-57, op. cit., p. 590-601.</ref>. Aristote meurt à Chalcis en 322 av. J.-C., à l'âge de soixante-deux ans, très probablement des suites de la maladie d'estomac chronique dont il avait souffert toute sa vie<ref>La légende d'un suicide par absorption de ciguë, rapportée par certaines sources tardives, est rejetée par les historiens modernes. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 350-355.</ref><ref>Son testament, conservé intégralement par Diogène Laërce (V, 11-16), témoigne de sa sollicitude envers tous les membres de sa maisonnée, esclaves compris, et prescrit que ses cendres soient mêlées à celles de sa première épouse Pythias. Voir Diogène Laërce, ''Vies'', op. cit., p. 579-582.</ref>. Ses cendres furent inhumées à Stagire, sa ville natale, et les citoyens de Stagire érigèrent en son honneur un monument funéraire (l'''Aristoteleion'') qui devint un lieu de rassemblement civique<ref>Les habitants de Stagire instituèrent également des fêtes annuelles en l'honneur de leur illustre concitoyen. Voir Ingemar Düring, ''Aristotle in the Ancient Biographical Tradition'', op. cit., p. 355-358.</ref>. Aristote laissait deux enfants : Pythias, née de son premier mariage avec Pythias, destinée à épouser Nicanor, le fils adoptif du philosophe, et Nicomaque, né de son second mariage avec Herpyllis d'Assos, qui lui donna également une fille<ref>Nicomaque mourut jeune, mais c'est à lui que fut dédiée l'''Éthique à Nicomaque'', peut-être publiée après sa mort par Nicomaque lui-même ou par un disciple. Voir Jean Brun, ''Aristote et le Lycée'', op. cit., p. 35-36.</ref><ref>Dans son testament, Aristote témoigne d'une grande reconnaissance envers Herpyllis, la mère de Nicomaque, lui assurant des moyens d'existence confortables et la recommandant aux bons soins de ses amis. Diogène Laërce, ''Vies'', V, 12-13, op. cit., p. 580.</ref>. === L'œuvre aristotélicienne : constitution et transmission === La question de la constitution et de la transmission de l'œuvre d'Aristote représente l'un des problèmes les plus complexes de l'histoire de la philosophie antique. Notre accès actuel à la pensée du Stagirite est le résultat d'un long processus historique marqué par des péripéties qui ont profondément affecté la forme sous laquelle nous lisons aujourd'hui ses écrits. ==== La double nature de l'œuvre aristotélicienne ==== L'œuvre d'Aristote se composait à l'origine de deux types d'écrits bien distincts, qui correspondent à deux publics différents et à deux modes d'exposition philosophique. D'une part, les '''écrits exotériques''' (ἐξωτερικοὶ λόγοι), destinés au grand public et composés sous forme de dialogues à la manière platonicienne entre 360 et 345 av. J.-C.<ref>Voir Aristote, ''Œuvres'', éd. Firmin-Didot, Paris, 1854-1869 ; cf. aussi Diogène Laërce, ''Vies et doctrines des philosophes illustres'', V, 22-27</ref>. Ces dialogues de jeunesse, dont Cicéron vantait les qualités littéraires en qualifiant le style d'Aristote de « fleuve d'or » (''flumen aureum'')<ref>Cicéron, ''Academica'', II, 38, 119</ref>, comprenaient notamment le ''Gryllos ou De la rhétorique'' (361 av. J.-C.), l'''Eudème ou De l'âme'' (354 av. J.-C.) sur l'immortalité de l'âme, le ''Protreptique'' (353 av. J.-C.) et le traité ''Sur la philosophie'' (348-345 av. J.-C.)<ref>Fragments rassemblés dans V. Rose, ''Aristotelis qui ferebantur librorum fragmenta'', Leipzig, Teubner, 1886</ref>. Ces œuvres, mieux connues durant l'Antiquité que les traités techniques, ne nous sont malheureusement parvenues que sous forme de fragments épars. D'autre part, les '''écrits acroamatiques''' ou '''ésotériques''' (ἀκροαματικοί, ἐσωτερικοί), réservés aux disciples avancés du Lycée et destinés à un usage interne à l'école<ref>Sur cette distinction, voir Aulu-Gelle, ''Nuits attiques'', XX, 5 ; Plutarque, ''Vie d'Alexandre'', 7</ref>. Ces textes, qui constituent l'essentiel du corpus aristotélicien tel que nous le connaissons aujourd'hui, prenaient probablement la forme de notes de cours, de résumés ou de mémoires de recherche élaborés par Aristote et ses collaborateurs au sein du Lyce. La différence entre ces deux catégories ne portait pas tant sur les questions traitées que sur la forme et les procédés d'argumentation et d'exposition<ref>Simplicius, ''In Physica'', CAG IX, p. 8, 15-23</ref>. ==== Le sort de la bibliothèque d'Aristote ==== L'histoire de la transmission des œuvres d'Aristote est intimement liée au destin de sa bibliothèque personnelle, qui contenait ses propres écrits ainsi que ceux de son école. À sa mort en 322 av. J.-C., Aristote légua sa bibliothèque à son successeur à la tête du Lycée, Théophraste d'Érèse<ref>Diogène Laërce, ''Vies'', V, 51-52</ref>. Selon le récit de Strabon, à la mort de Théophraste vers 288 av. J.-C., la bibliothèque fut léguée à '''Nélée de Scepsis''', fils de Coriscos et disciple d'Aristote et de Théophraste<ref>Strabon, ''Géographie'', XIII, 1, 54 (608-609 C) ; voir aussi Plutarque, ''Sylla'', 26, 1-3</ref>. Nélée, en quittant Athènes pour retourner dans sa cité natale de Scepsis en Troade, emporta avec lui les manuscrits autographes d'Aristote et de Théophraste. Ses descendants, gens peu instruits selon Strabon, auraient caché ces livres dans une cave pour éviter qu'ils ne soient confisqués par les rois Attalides de Pergame, qui cherchaient à enrichir leur célèbre bibliothèque<ref>Strabon, ''Géographie'', XIII, 1, 54 : « Lorsqu'ils vinrent à savoir quelle ardeur mettaient les Attalides, auxquels leur ville obéissait, à assembler des livres pour la bibliothèque de Pergame, ils cachèrent les leurs sous terre, dans une cave, où ils furent gâtés par l'humidité et par les vers »</ref>. Les ouvrages restèrent ainsi enfouis pendant près de deux siècles, dans des conditions qui endommagèrent gravement les manuscrits. Ce n'est qu'au début du Ier siècle av. J.-C. que ces textes furent redécouverts et achetés par '''Apellicon de Téos''', un riche bibliophile athénien<ref>Athénée, ''Deipnosophistes'', V, 214d = Posidonios, FGrHist 87 F 36</ref>. Apellicon, davantage amateur de livres (φιλόβιβλος) que véritable philosophe, entreprit de restaurer les manuscrits endommagés. Cependant, en tentant de combler les lacunes et de reconstituer les passages illisibles, il commit de nombreuses erreurs qui altérèrent le texte original<ref>Strabon, ''Géographie'', XIII, 1, 54 : « Apellicon était un amoureux des livres plutôt qu'un philosophe ; c'est pourquoi, en cherchant à réparer les dégâts, il fit de nouvelles copies en comblant mal les lacunes, et publia les livres pleins d'erreurs »</ref>. ==== Le transfert à Rome et l'édition d'Andronicos ==== En 86 av. J.-C., lors de la prise d'Athènes par les troupes romaines, le général '''Sylla''' s'empara de la bibliothèque d'Apellicon et la fit transporter à Rome<ref>Plutarque, ''Sylla'', 26, 2 ; Strabon, ''Géographie'', XIII, 1, 54</ref>. À Rome, ces manuscrits furent confiés au grammairien '''Tyrannion d'Amisos''', qui en fit des copies et commença un travail préliminaire d'organisation<ref>Strabon, ''Géographie'', XIII, 1, 54 ; Cicéron, ''Lettres à Atticus'', IV, 10, 1</ref>. C'est finalement '''Andronicos de Rhodes''', onzième scholarque du Lycée et philosophe péripatéticien actif vers 60 av. J.-C., qui établit la première édition systématique des œuvres d'Aristote et de Théophraste<ref>Porphyre, ''Vie de Plotin'', 24 : « Andronicos divisa les œuvres d'Aristote et de Théophraste en traités, rassemblant les matériaux connexes au même endroit » ; voir aussi David l'Arménien, ''Prolégomènes'', CAG XVIII, 2, p. 32-33</ref>. Andronicos ne se contenta pas de publier les textes : il les organisa selon un ordre thématique qui n'était probablement pas celui d'Aristote lui-même, en regroupant les traités par affinité de contenu. C'est ainsi que naquit la division traditionnelle du corpus en écrits logiques (réunis plus tard sous le titre d''''Organon'''), physiques, biologiques, métaphysiques, éthiques et politiques<ref>Voir Simplicius, ''In Categorias'', CAG VIII, p. 4, 28-5, 4 ; Alexandre d'Aphrodise, ''In Metaphysica'', CAG I, p. 171, 5-8</ref>. C'est également à Andronicos que l'on doit le titre de '''Métaphysique''' (τὰ μετὰ τὰ φυσικά), qui signifie littéralement « ce qui vient après les [livres] physiques », titre qu'il donna à un ensemble de quatorze livres qu'il plaça après les traités de physique dans son édition<ref>Voir Métaphysique, éd. W.D. Ross, Oxford, Clarendon Press, 1924, vol. I, p. XXXII-XLIII ; bien que le terme apparaisse déjà chez Théophraste, c'est l'édition d'Andronicos qui l'a consacré</ref>. Aristote lui-même n'utilisait jamais ce terme, préférant parler de « philosophie première » (πρώτη φιλοσοφία) ou de « science théologique » (θεολογική)<ref>Aristote, ''Métaphysique'', E (VI), 1, 1026a19-23 ; K (XI), 7, 1064b1-3</ref>. ==== Les conséquences pour notre accès au texte ==== Cette histoire mouvementée a eu des conséquences majeures pour notre connaissance de la pensée d'Aristote. D'abord, la perte quasi-totale des écrits exotériques nous prive d'un pan entier de son œuvre, celui qui était le mieux connu dans l'Antiquité et qui témoignait probablement d'une phase plus platonicienne de sa pensée. Ensuite, l'état fragmentaire et endommagé des manuscrits retrouvés, aggravé par les restaurations maladroites d'Apellicon, a introduit de nombreuses corruptions dans le texte. Enfin, l'organisation systématique imposée par Andronicos, bien qu'elle ait permis la préservation et la diffusion de l'œuvre, ne correspond probablement pas à l'ordre de composition ni à l'organisation originelle voulue par Aristote. Il faut également noter que contrairement à la légende propagée par certaines sources antiques, les œuvres d'Aristote n'étaient pas totalement inconnues entre la mort de Théophraste et leur « redécouverte » au Ier siècle av. J.-C. Des témoignages indiquent que certains textes circulaient et étaient étudiés, notamment à Alexandrie<ref>Athénée, ''Deipnosophistes'', I, 3a-b, affirme que Ptolémée II Philadelphe aurait acheté de Nélée les livres d'Aristote et de Théophraste pour la bibliothèque d'Alexandrie, contredisant ainsi Strabon</ref>. Les philosophes hellénistiques, notamment les stoïciens et les épicuriens, connaissaient et discutaient certaines thèses aristotéliciennes, ce qui suppose un accès au moins partiel à ses écrits<ref>Voir P. Moraux, ''Der Aristotelismus bei den Griechen'', vol. I, Berlin-New York, De Gruyter, 1973, p. 3-31</ref>. Le texte d'Aristote tel que nous le connaissons aujourd'hui est donc le produit d'une longue chaîne de transmission qui a commencé avec l'édition d'Andronicos et s'est poursuivie à travers les commentateurs néoplatoniciens de l'Antiquité tardive (Alexandre d'Aphrodise, Simplicius, Philopon), la tradition arabe médiévale (Al-Fârâbî, Avicenne, Averroès), puis la redécouverte occidentale à partir du XIIIe siècle grâce aux traductions latines<ref>Pour l'histoire de la transmission médiévale, voir F.E. Peters, ''Aristoteles Arabus'', Leiden, Brill, 1968 ; L. Minio-Paluello, ''Opuscula. The Latin Aristotle'', Amsterdam, Hakkert, 1972</ref>. Chaque étape de cette transmission a laissé sa marque sur le texte et son interprétation, faisant de l'œuvre aristotélicienne un palimpseste dont il est parfois difficile de retrouver la strate originelle. === Aristote et Platon : continuité et rupture === La relation intellectuelle entre Aristote et Platon demeure l'une des questions les plus débattues de l'histoire de la philosophie. Deux traditions interprétatives se sont longtemps affrontées. Les commentateurs néoplatoniciens, de Porphyre à Simplicius, insistaient sur l'harmonie fondamentale entre les deux philosophes<ref>Simplicius, ''In Categorias'', CAG VIII, éd. K. Kalbfleisch, Berlin, Reimer, 1907, p. 7, 23-32</ref>. À l'inverse, la tradition occidentale, depuis la Renaissance, a mis l'accent sur leurs divergences profondes, au point que le poète anglais Samuel Taylor Coleridge affirmait : « Tout homme est né aristotélicien ou platonicien »<ref>Samuel Taylor Coleridge, ''Table Talk'', 2 juillet 1830, dans ''The Table Talk and Omniana of Samuel Taylor Coleridge'', Londres, Oxford University Press, 1917, p. 90</ref>. La vérité se situe entre ces deux extrêmes. Si Aristote s'oppose à Platon sur des questions ontologiques fondamentales, il demeure profondément tributaire de l'héritage platonicien et socratique. Comme il l'écrit lui-même dans un passage célèbre de l'''Éthique à Nicomaque'' : « Une recherche de ce genre est rendue difficile du fait que ce sont des amis qui ont introduit la doctrine des Idées. Mais on admettra peut-être qu'il est préférable, et c'est aussi pour nous une obligation, si nous voulons du moins sauvegarder la vérité, de sacrifier même nos sentiments personnels, surtout quand on est philosophe : vérité et amitié nous sont chères l'une et l'autre, mais c'est pour nous un devoir sacré d'accorder la préférence à la vérité »<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1096a11-17, trad. J. Tricot, Paris, Vrin, 1959, p. 44</ref>. ==== La critique aristotélicienne des Idées platoniciennes ==== ===== Le rejet de la séparation (''chôrismos'') ===== L'un des points de rupture les plus décisifs entre Aristote et Platon concerne le statut ontologique des Idées ou Formes (''eidos''). Pour Platon, les Idées constituent un monde intelligible séparé (''chôristos'') du monde sensible. Elles sont immuables, éternelles, et possèdent une existence autonome et transcendante. Les choses sensibles ne sont que des copies imparfaites qui participent (''methexis'') aux Idées ou les imitent (''mimêsis'')<ref>Platon, ''Phédon'', 74a-75d, 100c-102a ; ''République'', VI, 509d-511e, trad. É. Chambry, Paris, Les Belles Lettres, 1932-1934</ref>. Dans le ''Phédon'', Platon affirme ainsi que « rien d'autre ne rend belle une chose que la présence ou la communion (on ne sait comment elle se fait) avec le Beau en soi »<ref>Platon, ''Phédon'', 100d, trad. M. Dixsaut, Paris, Flammarion, 1991, p. 315</ref>. Aristote refuse catégoriquement cette séparation des Idées. Dans la ''Métaphysique'', il consacre plusieurs chapitres à une critique systématique et parfois virulente de la théorie platonicienne<ref>Aristote, ''Métaphysique'', A, 6, 987a29-988a17 ; A, 9, 990a34-993a10 ; M, 4-5, 1078b7-1080a11 ; N, 2, 1088b35-1090a2</ref>. Ses objections portent sur trois points principaux. Premièrement, l'inutilité explicative des Idées séparées. Aristote soutient que les Idées ne peuvent rendre compte ni de l'existence ni du devenir des choses sensibles. Comme il l'écrit avec ironie : « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est prononcer des mots vides et faire des métaphores poétiques »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22, trad. J. Tricot, Paris, Vrin, 1953, t. I, p. 61</ref>. Les Idées platoniciennes, étant immobiles et éternelles, ne peuvent expliquer le mouvement et le changement que nous observons constamment dans le monde sensible. Platon n'a pas identifié la cause efficiente (''archê tês kinêseôs''), c'est-à-dire le principe qui déclenche effectivement le changement<ref>Aristote, ''Métaphysique'', A, 9, 992a24-29</ref>. Deuxièmement, l'argument du « Troisième Homme ». Aristote reprend ici une objection déjà formulée dans le ''Parménide'' de Platon lui-même<ref>Platon, ''Parménide'', 132a-b</ref>. Si l'on postule une Idée séparée de l'Homme pour expliquer ce que plusieurs hommes ont en commun, alors on doit également postuler une troisième Idée pour expliquer ce que l'Idée de l'Homme et les hommes particuliers ont en commun, et ainsi de suite à l'infini<ref>Aristote, ''Métaphysique'', A, 9, 990b15-17 ; Z, 13, 1039a2-3 ; ''De la Sophistique'', 22, 178b36-179a10</ref>. Cette régression infinie montre l'absurdité de poser des Idées séparées comme principes explicatifs. Troisièmement, le dédoublement inutile du monde. Postuler un monde intelligible d'Idées séparées revient à « doubler les difficultés » sans les résoudre<ref>Aristote, ''Métaphysique'', A, 9, 990b1-4</ref>. Au lieu d'expliquer le monde sensible, on crée un second monde qui requiert lui-même une explication. Aristote estime que c'est là une violation du principe d'économie ontologique : « Les Platoniciens font exister autant de substances séparées qu'il y a de choses naturelles, comme si quelqu'un, voulant compter des objets, estimait qu'il ne le pourrait pas quand ils sont en petit nombre, et croyait y parvenir en les multipliant »<ref>Aristote, ''Métaphysique'', A, 9, 990b4-8, trad. J. Tricot, op. cit., p. 60</ref>. ===== L'hylémorphisme aristotélicien ===== Face à la théorie platonicienne de la participation, Aristote propose une solution originale : la théorie hylémorphique. Selon cette conception, les êtres sensibles ne sont pas des copies imparfaites d'Idées transcendantes, mais des composés (''sunolon'') de matière (''hulê'') et de forme (''morphê'' ou ''eidos'')<ref>Aristote, ''Métaphysique'', Z, 3, 1029a1-7 ; H, 1-3, 1042a24-1043b23 ; ''Physique'', II, 1-2, 192b8-194a12</ref>. La forme aristotélicienne n'est pas séparée des choses sensibles : elle est immanente à la matière qu'elle informe. Par exemple, la forme du cheval n'existe pas dans un monde intelligible séparé, mais uniquement dans les chevaux individuels concrets. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence (''to ti ên einai'', littéralement « ce qu'était le fait d'être »)<ref>Aristote, ''Métaphysique'', Z, 4-6, 1029b13-1031b14 ; Z, 7, 1032b1-2</ref>. Comme l'explique Aristote : « Par forme, j'entends l'essence de chaque chose et sa substance première »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372</ref>. Cette conception hylémorphique permet à Aristote de résoudre plusieurs problèmes que posait la théorie platonicienne. D'abord, elle explique le devenir : la génération d'une substance est le passage de la puissance (''dunamis'') à l'acte (''energeia''), l'actualisation d'une forme dans une matière. La matière possède en puissance la forme qui s'actualisera en elle, et ce passage s'effectue grâce à une cause efficiente qui possède déjà cette forme en acte<ref>Aristote, ''Métaphysique'', Θ, 6-8, 1048a25-1050b6 ; ''Physique'', III, 1, 201a10-11</ref>. Ensuite, elle sauvegarde l'individualité des substances premières. Pour Aristote, les véritables réalités sont les individus concrets (''tode ti'', « ceci particulier »), comme « cet homme-ci » ou « ce cheval-ci »<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 13, 1038b23-1039a3</ref>. La forme n'existe que dans les individus qu'elle informe, et non dans un monde séparé. Enfin, elle unifie forme et finalité. La forme est à la fois cause formelle et cause finale, car elle est ce vers quoi tend le développement naturel de la chose. « La nature, en tant que génération, est un chemin vers la nature » au sens de forme achevée<ref>Aristote, ''Physique'', II, 1, 193b12-13 ; II, 7, 198a24-27</ref>. Dans la génération d'un chêne à partir d'un gland, la forme du chêne est à la fois le principe structurant qui guide le développement et la fin vers laquelle tend ce processus. ==== La critique de la participation et de l'imitation ==== ===== L'ambiguïté conceptuelle de la participation ===== Platon utilise principalement deux concepts pour expliquer la relation entre les choses sensibles et les Idées : la participation (''methexis'') et l'imitation (''mimêsis''). Aristote critique vivement ces notions, les considérant comme métaphoriques et vides de sens explicatif<ref>Aristote, ''Métaphysique'', A, 9, 991a20-22 ; M, 5, 1079b24-26</ref>. La notion de participation pose en effet de redoutables problèmes conceptuels. Platon lui-même les a identifiés dans le ''Parménide'', dialogue où le vieux Parménide soumet le jeune Socrate à un interrogatoire serré sur la théorie des Idées<ref>Platon, ''Parménide'', 130e-134e</ref>. Comment une chose participe-t-elle d'une Idée ? Si l'Idée tout entière est présente en chaque chose qui y participe, alors l'Idée, qui est une, se trouve séparée d'elle-même. Mais si c'est seulement une partie de l'Idée qui est présente en chaque chose, alors l'Idée se divise, ce qui contredit son unité et son indivisibilité<ref>Platon, ''Parménide'', 131a-e</ref>. Aristote estime que Platon n'a jamais résolu ces difficultés et s'est contenté d'images poétiques. « Dire que les Idées sont des paradigmes et que les autres choses y participent, c'est ne rien dire, car participer, qu'est-ce que c'est ? »<ref>Aristote, ''Métaphysique'', A, 9, 991a20-21</ref>. Pour Aristote, la participation n'est qu'un nom différent pour désigner le même problème : « Ce que les Pythagoriciens appelaient "imitation", les Platoniciens l'ont appelé "participation", mais tous se bornent à changer le nom sans expliquer ce que peut bien être cette participation ou cette imitation des Idées »<ref>Aristote, ''Métaphysique'', A, 6, 987b10-13, trad. J. Tricot, op. cit., t. I, p. 49</ref>. ===== La ressemblance par la forme immanente ===== Pour Aristote, la ressemblance entre les individus d'une même espèce ne s'explique pas par la participation à une Idée transcendante, mais par la possession d'une même forme immanente. Cette forme se transmet dans la génération naturelle : « L'homme engendre l'homme » (''anthrôpos anthrôpon genna''), c'est-à-dire qu'un être possédant déjà la forme humaine en acte produit un autre être possédant cette même forme<ref>Aristote, ''Métaphysique'', Z, 7, 1032a25 ; Z, 8, 1033b32-1034a2 ; Λ, 3, 1070a8</ref>. Dans la génération, trois facteurs interviennent : la matière (fournie par la femelle), la forme (transmise par le mâle) et la privation (l'absence initiale de la forme dans la matière)<ref>Aristote, ''Physique'', I, 7, 190b10-191a7 ; ''De la Génération des Animaux'', I, 20-21, 729a9-730a32</ref>. Le géniteur, possédant la forme en acte, la transmet à la matière fournie par la génitrice, qui la possédait seulement en puissance. Ainsi, la ressemblance entre père et fils s'explique par la transmission d'une même forme immanente, sans qu'il soit besoin de recourir à une Idée séparée de l'Homme. La forme n'est donc pas un modèle extérieur que les choses imiteraient, mais un principe immanent de structuration et de développement qui se perpétue de génération en génération. Comme l'écrit Aristote : « La forme et la définition sont identiques dans les choses qui naissent les unes des autres »<ref>Aristote, ''Métaphysique'', Z, 8, 1034a5-8, trad. J. Tricot, op. cit., t. I, p. 385</ref>. ==== Substance, essence et ''ousia'' ==== ===== Les sens multiples de l'''ousia'' ===== Le terme grec ''ousia'', traduit en latin par ''substantia'' ou ''essentia'', possède des significations profondément différentes chez Platon et Aristote, bien que les deux philosophes l'utilisent pour désigner ce qui est véritablement réel. Chez Platon, l’''ousia'' désigne principalement l'Idée, la réalité véritable qui possède une existence stable, immuable et éternelle, par opposition aux choses sensibles qui sont en perpétuel devenir et ne possèdent qu'une existence dérivée et illusoire<ref>Platon, ''Phédon'', 78c-d ; ''République'', V, 477a-478e ; VI, 484b-486d</ref>. Dans le ''Phédon'', Socrate affirme que « chaque chose qui est en soi, l'ousia, est toujours identique à elle-même de la même manière »<ref>Platon, ''Phédon'', 78d, trad. M. Dixsaut, op. cit., p. 293</ref>. L'''ousia'' platonicienne est donc séparée du monde sensible et accessible uniquement par l'intellect pur. Chez Aristote, l'''ousia'' a plusieurs sens, mais désigne avant tout la substance première, c'est-à-dire l'individu concret qui existe réellement et par lui-même : « cet homme-ci », « ce cheval-ci »<ref>Aristote, ''Catégories'', 5, 2a11-19 ; ''Métaphysique'', Z, 3, 1028b33-1029a7</ref>. Dans les ''Catégories'', Aristote définit la substance première comme « ce qui n'est ni affirmé d'un sujet ni dans un sujet, par exemple, l'homme individuel ou le cheval individuel »<ref>Aristote, ''Catégories'', 5, 2a11-13, trad. F. Ildefonse & J. Lallot, Paris, Seuil, 2002, p. 15</ref>. L'''ousia'' aristotélicienne se caractérise par trois traits fondamentaux : # Elle n'est pas dans un sujet : elle ne se dit pas d'autre chose mais existe par elle-même # Elle est séparée (''chôriston'') : elle peut exister indépendamment des accidents qui l'affectent # Elle est déterminée (''tode ti'') : elle est un « ceci particulier », un individu identifiable<ref>Aristote, ''Métaphysique'', Z, 3, 1029a27-28 ; Δ, 8, 1017b23-26</ref> ===== Substance première et substance seconde ===== Aristote distingue, dans les ''Catégories'', entre substance première et substance seconde. La substance première est l'individu concret (Socrate, Bucéphale), tandis que la substance seconde est l'espèce ou le genre auquel appartient cet individu (l'homme, l'animal)<ref>Aristote, ''Catégories'', 5, 2a11-19, 2b7-29</ref>. Les substances secondes sont dites substances uniquement parce qu'elles sont prédiquées des substances premières et révèlent ce qu'elles sont essentiellement. Cette distinction marque une rupture ontologique majeure avec Platon. Pour ce dernier, l'universel (l'Idée) est la réalité première et véritable, tandis que l'individu sensible n'est qu'une ombre ou une copie imparfaite. Pour Aristote, c'est exactement l'inverse : l'individu est la substance première, et l'universel n'existe que dans les individus ou dans l'esprit qui les pense. Comme Aristote le formule catégoriquement dans la ''Métaphysique'' : « Aucun universel n'est une substance »<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; Z, 16, 1040b23-1041a5 ; M, 10, 1086b14-1087a25</ref>. Cette thèse a des conséquences considérables. Si seuls les individus existent véritablement, alors la science, qui porte sur l'universel, ne porte pas directement sur ce qui existe, mais sur les formes universelles abstraites à partir des individus. Aristote résout cette tension en distinguant l'ordre de l'être (où l'individu est premier) et l'ordre de la connaissance (où l'universel est premier)<ref>Aristote, ''Métaphysique'', Z, 3, 1029b3-12 ; ''Seconds Analytiques'', I, 2, 71b33-72a5</ref>. ===== La forme comme substance ===== Dans la ''Métaphysique'', Aristote développe une conception plus complexe où la forme (''eidos'') apparaît comme le meilleur candidat au titre de substance. Cette évolution s'explique par le fait qu'Aristote cherche à identifier ce qui, dans le composé hylémorphique, mérite le plus le nom de substance<ref>Aristote, ''Métaphysique'', Z, 3, 1028b33-1029a7 ; Z, 7, 1032b1-2 ; Z, 17, 1041b7-9</ref>. Cependant, cette forme n'est pas l'Idée platonicienne. Elle s'en distingue sur trois points essentiels : # Elle est immanente aux choses, non séparée. La forme du cheval n'existe que dans les chevaux individuels # Elle est le principe d'unité du composé matière-forme. Elle fait que le composé est un être et non une simple agrégation # Elle est l'actualité (''energeia'') de la chose, son essence en acte, par opposition à la matière qui est en puissance<ref>Aristote, ''Métaphysique'', H, 2, 1042b9-11 ; Θ, 8, 1050a15-16</ref> La forme aristotélicienne s'apparente davantage à la définition essentielle de la chose (''logos tês ousias'') qu'à une entité séparée existant par elle-même. Elle est « ce qui est signifié par la définition »<ref>Aristote, ''Métaphysique'', Z, 4, 1029b19-20 ; Z, 10, 1035b31-1036a12</ref>. Ainsi, la forme de l'homme est ce que définit la définition « animal rationnel mortel », et cette forme existe uniquement dans les hommes individuels qui la réalisent. ==== Éléments de continuité entre Platon et Aristote ==== ===== La primauté de la forme sur la matière ===== Malgré leurs divergences ontologiques fondamentales, Platon et Aristote partagent une conviction commune : la forme (ou l'Idée) est supérieure à la matière dans l'ordre de l'intelligibilité, de la réalité et de la perfection. Pour Platon, seules les Idées sont pleinement réelles (''ontôs onta'') et pleinement connaissables (''epistêta''), tandis que la matière, le réceptacle (''chôra'') du ''Timée'', est principe d'indétermination, de multiplicité et d'altération. Elle n'est ni intelligible ni perceptible, mais saisissable seulement par un « raisonnement bâtard »<ref>Platon, ''Timée'', 49a-52d ; 51a-52a</ref>. C'est elle qui explique pourquoi les choses sensibles sont changeantes, multiples et imparfaites. Pour Aristote également, la matière pure, prise en elle-même et abstraction faite de toute forme, est indéterminée (''aoriston'') et inconnaissable. « La matière en soi est inconnaissable »<ref>Aristote, ''Métaphysique'', Z, 10, 1036a8-9 ; cf. Z, 3, 1029a20-26</ref>. Seule la forme rend la chose intelligible et définissable. C'est elle qui fait qu'une chose est ce qu'elle est et qui la rend connaissable par la science. Comme l'écrit Aristote : « Ce que nous appelons la forme ou la substance, c'est ce dont l'énoncé est une définition »<ref>Aristote, ''Métaphysique'', Z, 7, 1032b1-2, trad. J. Tricot, op. cit., t. I, p. 372</ref>. Cette primauté de la forme se manifeste aussi dans le fait que, pour les deux philosophes, la perfection d'une chose consiste dans l'actualisation complète de sa forme, et que les déficiences s'expliquent par la résistance ou les limitations de la matière. Chez Platon, les choses sensibles sont imparfaites parce qu'elles ne peuvent réaliser parfaitement les Idées à cause de leur nature matérielle. Chez Aristote, les monstres et les anomalies s'expliquent par le fait que la matière ne se laisse pas toujours informer conformément à la forme spécifique<ref>Aristote, ''De la Génération des Animaux'', IV, 3, 767b5-15 ; 768b15-25</ref>. ===== La finalité dans la nature ===== Platon et Aristote partagent une vision téléologique de la nature, c'est-à-dire l'idée que les processus naturels sont orientés vers des fins et que le monde possède une structure rationnelle et ordonnée. Dans le ''Timée'', Platon présente le cosmos comme l'œuvre d'un Démiurge divin qui organise la matière chaotique en ayant les yeux fixés sur les Idées éternelles. Le Démiurge, « voulant que toutes choses soient bonnes et que rien ne soit mauvais dans la mesure du possible », façonne le monde sensible à l'image du monde intelligible<ref>Platon, ''Timée'', 28a-30c ; 29d-30a</ref>. Cette orientation vers le Bien confère au cosmos sa structure rationnelle et harmonieuse. Aristote reprend cette conception finaliste, mais l'intériorise et la naturalise. La nature elle-même agit en vue d'une fin (''hê phusis heneka tou poiei''), sans qu'il soit besoin de postuler un Démiurge extérieur ou des Idées transcendantes<ref>Aristote, ''Physique'', II, 8, 198b10-199a8 ; ''Des Parties des Animaux'', I, 1, 639b14-640a9</ref>. Chaque être naturel tend vers sa forme achevée comme vers sa fin naturelle : le gland tend à devenir chêne, l'enfant tend à devenir adulte. Comme l'écrit Aristote : « La nature ne fait rien en vain, et de toutes choses elle fait toujours la meilleure possible dans chaque genre »<ref>Aristote, ''Du Ciel'', II, 5, 288a2-3 ; cf. ''Des Parties des Animaux'', III, 1, 661b23-24</ref>. Dans les deux cas, la finalité garantit l'intelligibilité du monde naturel et permet de le comprendre non comme un chaos de mouvements aléatoires, mais comme un ordre structuré où chaque chose a sa place et sa raison d'être. La forme est à la fois modèle et fin du développement naturel. ===== La connaissance par les causes ===== Platon et Aristote s'accordent sur le fait que la véritable connaissance scientifique (''epistêmê'') consiste à connaître les causes (''aitiai'') des choses et non simplement à constater leur existence. Dans le ''Phédon'', Socrate raconte sa déception face aux philosophes de la nature présocratiques. Lorsqu'il apprit qu'Anaxagore posait l'Intelligence (''Nous'') comme principe du cosmos, il espéra trouver enfin des explications véritablement causales. Mais Anaxagore se contentait d'invoquer des causes mécaniques (l'air, l'éther, l'eau) sans jamais expliquer pourquoi l'Intelligence avait disposé chaque chose de la meilleure manière possible. Pour Socrate-Platon, une véritable explication doit remonter au Bien, cause finale de toute chose<ref>Platon, ''Phédon'', 96a-99d ; 97b-99c</ref>. Aristote approuve cette exigence et la systématise dans sa doctrine des quatre causes. Toute science véritable doit expliquer non seulement que quelque chose est (''hoti''), mais aussi pourquoi il est (''dioti''). Elle doit identifier la cause matérielle (ce dont une chose est faite), la cause formelle (ce qu'elle est essentiellement), la cause efficiente (ce qui l'a produite) et la cause finale (ce en vue de quoi elle existe)<ref>Aristote, ''Physique'', II, 3, 194b16-195b30 ; ''Seconds Analytiques'', I, 13, 78a22-b4 ; ''Métaphysique'', A, 3, 983a24-b6</ref>. Cependant, Aristote reproche à Platon de n'avoir effectivement utilisé que deux des quatre causes : la cause formelle (les Idées) et la cause matérielle (la matière ou le réceptacle). Platon aurait négligé la cause efficiente (le principe du mouvement) et la cause finale, ou du moins ne les aurait pas clairement distinguées de la cause formelle<ref>Aristote, ''Métaphysique'', A, 6, 988a8-17 ; A, 9, 992a24-29 ; Λ, 10, 1075b37-1076a4</ref>. C'est ce manque qui expliquerait l'incapacité du platonisme à rendre compte du devenir et du mouvement dans la nature. ===== La définition et l'universel ===== Platon et Aristote s'accordent sur le fait que la définition (''horismos'' ou ''logos'') porte sur l'universel et non sur le particulier. On ne peut définir un individu comme Socrate ou Callias, mais seulement l'espèce à laquelle il appartient (l'homme) ou le genre dont relève cette espèce (l'animal)<ref>Platon, ''Théétète'', 201c-210b ; ''Sophiste'', 218b-221c ; Aristote, ''Métaphysique'', Z, 15, 1039b27-1040a7 ; ''Seconds Analytiques'', II, 13, 97b26-98a17</ref>. Dans le ''Théétète'', Platon montre que la connaissance (''epistêmê'') ne peut être réduite à la sensation ni à l'opinion vraie, car la sensation porte sur le particulier changeant tandis que la connaissance requiert la saisie de l'universel stable. De même, dans le ''Sophiste'', la méthode de division dichotomique (''diairesis'') permet de définir une Idée en la divisant progressivement jusqu'à isoler son essence spécifique<ref>Platon, ''Sophiste'', 218b-221c ; 264c-268d</ref>. Aristote reprend cette exigence mais en tire des conclusions opposées. Pour Platon, le fait que la définition porte sur l'universel prouve que seul l'universel (l'Idée) est pleinement connaissable et réel. Pour Aristote, cela montre que la connaissance scientifique porte certes sur l'universel, mais que la réalité réside dans le particulier. La définition exprime la forme universelle (l'homme est un animal rationnel), mais cette forme n'existe qu'instanciée dans des individus concrets (Socrate, Callias, Platon)<ref>Aristote, ''Métaphysique'', Z, 13, 1038b8-16 ; Z, 15, 1039b27-1040a7 ; M, 10, 1086b14-1087a25</ref>. Ainsi, Aristote opère une distinction fondamentale entre l'ordre de l'être (où le particulier est premier) et l'ordre de la connaissance (où l'universel est premier). Cette distinction lui permet de concilier le réalisme (seuls les individus existent) avec l'exigence de scientificité (la science porte sur l'universel). ==== La dialectique et la méthode philosophique ==== ===== L'héritage socratique commun ===== Platon et Aristote sont tous deux héritiers de la méthode dialectique inaugurée par Socrate. Cette méthode consiste à progresser vers la vérité par l'examen critique des opinions (''doxai'') et par le dialogue argumenté qui met à l'épreuve les thèses avancées<ref>Platon, ''République'', VII, 533c-534e ; ''Sophiste'', 253b-254b ; Aristote, ''Topiques'', I, 1-2, 100a18-101b4</ref>. Dans les dialogues platoniciens, Socrate procède systématiquement par questions et réponses (''elenchus''), examinant les opinions de ses interlocuteurs pour en montrer les contradictions internes et les conduire progressivement vers la vérité. Cette méthode suppose que la vérité n'est pas simplement transmise du maître à l'élève, mais découverte par l'âme elle-même à travers un processus d'examen rationnel<ref>Platon, ''Ménon'', 81a-86c ; ''Théétète'', 148e-151d</ref>. Aristote conserve cette approche dialectique dans ses traités. Il commence presque toujours par recenser les opinions des prédécesseurs (''doxographia''), puis examine les difficultés (''aporiai'') que soulève le sujet, avant de proposer sa propre solution. Cette méthode apparaît clairement dans l'''Éthique à Nicomaque'' : « Comme pour les autres sujets, il faut, après avoir exposé les phénomènes et d'abord parcouru les difficultés, démontrer, si possible, la vérité de toutes les opinions relatives à ces affections de l'âme, ou du moins du plus grand nombre et des plus autorisées »<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7, trad. J. Tricot, op. cit., p. 317</ref>. Cependant, la portée de la dialectique diffère chez les deux philosophes. Pour Platon, la dialectique est la méthode suprême de la philosophie, celle qui permet de s'élever jusqu'à la contemplation des Idées et du Bien. Le dialecticien est le véritable philosophe<ref>Platon, ''République'', VII, 532a-535a ; 537c-539d</ref>. Pour Aristote, la dialectique est un outil préparatoire utile, notamment pour examiner les opinions reçues et identifier les apories, mais elle ne constitue pas une science à proprement parler, car elle ne démontre rien de façon apodictique<ref>Aristote, ''Topiques'', I, 2, 101a25-b4 ; ''Métaphysique'', Γ, 2, 1004b17-26 ; B, 1, 995a24-b4</ref>. La véritable science procède par démonstration à partir de principes premiers nécessaires et vrais. ===== Le rôle de l'expérience sensible ===== Un point de divergence majeur concerne le rôle de l'expérience sensible (''aisthêsis'') dans la connaissance. Pour Platon, les sens nous trompent et nous maintiennent dans l'ignorance (''agnoia'') ou au mieux dans l'opinion (''doxa''). La véritable connaissance (''epistêmê'') requiert de se détourner du sensible pour se tourner vers l'intelligible pur, accessible uniquement par l'intellect (''nous''). Dans le ''Phédon'', Socrate affirme que « tant que nous aurons notre corps et que notre âme sera pétrie avec cette chose mauvaise, jamais nous ne posséderons en suffisance l'objet de notre désir. Or, cet objet, nous l'avons dit, c'est le vrai »<ref>Platon, ''Phédon'', 66b, trad. M. Dixsaut, op. cit., p. 251</ref>. L'allégorie de la caverne dans la ''République'' illustre dramatiquement cette dévalorisation du sensible : les prisonniers enchaînés qui contemplent les ombres sur la paroi représentent l'humanité ordinaire, prisonnière des apparences sensibles<ref>Platon, ''République'', VII, 514a-517c</ref>. Aristote accorde au contraire une place fondamentale à l'expérience sensible. Certes, la science porte sur l'universel et les causes, mais cet universel est abstrait à partir des données sensibles par un processus d'induction (''epagôgê''). Comme Aristote l'affirme dans le célèbre chapitre final des ''Seconds Analytiques'' : « C'est donc évidemment par induction que nous devons connaître les principes premiers, car c'est aussi de cette façon que la sensation produit en nous l'universel »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100b3-5, trad. J. Tricot, Paris, Vrin, 1947, p. 242</ref>. Toute connaissance commence donc par la sensation, et l'intellect ne possède rien qui ne soit d'abord passé par les sens<ref>Aristote, ''De l'Âme'', III, 8, 432a3-10</ref>. Cette différence d'attitude se manifeste particulièrement dans leurs travaux scientifiques. Platon construit des modèles mathématiques abstraits (comme dans le ''Timée'') sans se soucier outre mesure de leur adéquation aux observations empiriques. Aristote consacre au contraire une part immense de son œuvre à l'observation minutieuse des phénomènes naturels, notamment dans ses traités biologiques. Il reproche d'ailleurs aux Platoniciens de « négliger les faits » au profit de raisonnements abstraits : « Ceux qui, habitués aux raisonnements dialectiques, négligent les faits, après n'avoir considéré qu'un petit nombre de faits, légifèrent trop rapidement »<ref>Aristote, ''De la Génération et de la Corruption'', I, 2, 316a5-14, trad. C. Mugler, Paris, Les Belles Lettres, 1966, p. 6</ref>. ==== Conclusion : rupture dans la continuité ==== La relation entre Aristote et Platon illustre parfaitement cette formule célèbre, attribuée à Aristote bien qu'elle ne se trouve pas littéralement dans ses œuvres : « Platon m'est cher, mais la vérité m'est plus chère encore »<ref>Cette formule résume l'esprit du passage d'Aristote, ''Éthique à Nicomaque'', I, 6, 1096a11-17, traduit librement en latin par l'adage ''Amicus Plato, sed magis amica veritas''</ref>. Aristote rejette fondamentalement plusieurs thèses centrales du platonisme : la séparation des Idées, la participation comme mode de relation entre sensible et intelligible, la dévalorisation du monde sensible et de l'individu concret, l'autonomie ontologique de l'universel. Ces rejets ne sont pas de simples corrections de détail, mais impliquent une réorientation complète de la métaphysique. Pourtant, Aristote conserve et approfondit certaines intuitions fondamentales de Platon : la primauté de la forme sur la matière, la finalité dans la nature, l'exigence d'expliquer par les causes, la nécessité de définir l'universel pour fonder la science. Il estime avoir sauvé ce qu'il y a de vrai dans le platonisme tout en éliminant les erreurs métaphysiques qui en compromettaient la validité. Cette attitude n'est pas contradictoire. En ancrant la forme dans le monde sensible et en faisant de l'individu concret la substance première, Aristote pense avoir rendu compte de la structure rationnelle et intelligible du réel sans recourir à un dualisme métaphysique intenable. La forme n'est plus un modèle transcendant que les choses imiteraient imparfaitement, mais le principe immanent qui les structure et les fait être ce qu'elles sont. La rupture est donc profonde, mais elle s'opère dans la continuité d'un même questionnement sur l'être, l'essence, la connaissance et le Bien. En ce sens, l'aristotélisme peut être compris comme une naturalisation du platonisme : la forme descend du ciel des Idées pour s'incarner dans les choses mêmes, le Bien n'est plus au-delà de l'essence mais se réalise dans l'accomplissement de la nature propre de chaque être, et la philosophie, tout en restant science de l'universel, reconnaît que seuls existent les individus concrets dans lesquels cet universel se réalise. Cette tension créatrice entre continuité et rupture explique pourquoi la tradition philosophique ultérieure n'a jamais pu trancher définitivement entre platonisme et aristotélisme, mais a constamment oscillé entre ces deux pôles, cherchant tantôt à les concilier (comme les néoplatoniciens et Thomas d'Aquin), tantôt à radicaliser leur opposition (comme les nominalistes médiévaux ou les empiristes modernes). La querelle entre Platon et Aristote demeure ainsi l'une des plus fécondes de l'histoire de la métaphysique occidentale. == Première partie : L'Organon ou les outils de la pensée == === Chapitre I : Les Catégories – Les genres suprêmes de l'être === ==== La classification première de la réalité ==== Au commencement de son investigation philosophique, Aristote pose une question fondamentale : comment classer et ordonner la multiplicité des choses que nous rencontrons dans le monde ? Sa réponse prend la forme d'une doctrine des catégories (''katêgoriai''), terme qui signifie littéralement « prédicats » ou « attributions ». Ces catégories constituent les genres suprêmes de l'être, c'est-à-dire les classes les plus générales sous lesquelles tout ce qui existe peut être rangé<ref>Aristote, ''Catégories'', 4, 1b25-2a4, dans ''Œuvres complètes'', dir. P. Pellegrin, Flammarion, Paris, 2014</ref>. Dans le traité des ''Catégories'', Aristote présente une liste canonique de dix catégories qui détermine l'ensemble des modes selon lesquels l'être se dit. « Chacun des termes qui sont dits sans aucune combinaison », écrit-il, « indique soit une substance (''ousia''), soit une certaine quantité (''poson''), soit une certaine qualité (''poion''), soit un rapport à quelque chose (''pros ti''), soit quelque part (''pou''), soit un certain moment (''pote''), soit être dans une position (''keisthai''), soit posséder (''echein''), soit faire (''poiein''), soit subir (''paschein'') »<ref>Aristote, ''Catégories'', 4, 1b25-27, trad. R. Bodéüs, Les Belles Lettres, Paris, 2001</ref>. Cette énumération mérite qu'on s'y arrête. La substance, par exemple, désigne ce qu'est un être : un homme, un cheval. La quantité exprime l'extension : long de deux coudées, de trois coudées. La qualité caractérise la nature : blanc, instruit. La relation établit un rapport : double, moitié, plus grand. Le lieu situe dans l'espace : au Lycée, sur la place. Le temps inscrit dans la durée : hier, l'an dernier. La position indique l'attitude : être couché, être assis. La possession marque l'avoir : être chaussé, être armé. L'action et la passion expriment l'agir et le pâtir : couper ou être coupé, brûler ou être brûlé<ref>Aristote, ''Catégories'', 4, 1b25-2a10, dans P. Pellegrin dir., ''Dictionnaire Aristote'', Ellipses, Paris, 2007, p. 176-178</ref>. ==== La primauté ontologique de la substance ==== Parmi ces dix catégories, l'une occupe une place privilégiée : la substance. Aristote affirme sans ambages que « la substance est ce qui se dit proprement, premièrement et avant tout ; ce qui à la fois ne se dit pas d'un certain sujet et n'est pas dans un certain sujet ; par exemple tel homme ou tel cheval »<ref>Aristote, ''Catégories'', 5, 2a11-14, trad. R. Bodéüs, op. cit.</ref>. Cette définition capitale établit la substance première (''prôtê ousia'') comme le fondement de toute réalité. Pourquoi cette primauté ? Parce que toutes les autres catégories présupposent l'existence de la substance. On ne peut concevoir une couleur sans un corps coloré, une grandeur sans quelque chose de grand, une action sans un agent. « Tous les autres termes, ou bien se disent de sujets qui sont les substances premières, ou bien sont dans des sujets qui sont ces mêmes substances », explique le Stagirite<ref>Aristote, ''Catégories'', 5, 2a34-2b6</ref>. Si les substances premières n'existaient pas, il serait impossible que quoi que ce soit d'autre existe. La substance est donc le substrat ultime (''hypokeimenon'') : ce dont tout se dit mais qui n'est dit de rien d'autre<ref>Aristote, ''Métaphysique'', Z, 3, 1028b36-37, trad. J. Tricot, Vrin, Paris, 1953</ref>. ==== Substance première et substance seconde ==== Aristote introduit cependant une distinction cruciale au sein même de la notion de substance. À côté de la substance première, il reconnaît l'existence de substances secondes (''deuterai ousiai''). « Se disent par ailleurs une seconde sorte de substances, les espèces auxquelles appartiennent les substances dites au sens premier — celles-là, et aussi les genres de ces espèces »<ref>Aristote, ''Catégories'', 5, 2a14-17</ref>. La substance première désigne l'individu concret, singulier, unique : cet homme-ci (par exemple Socrate), ce cheval-là (par exemple Bucéphale). Elle possède une double caractéristique négative : elle n'est ni dite d'un sujet, ni dans un sujet. Socrate n'est attribué à rien d'autre — on ne dit pas qu'autre chose « est Socrate » — et il n'existe pas dans un autre être comme une propriété. Les substances premières sont des individus numériquement uns (''arithmôi hen''), des « ceci » (''tode ti'') déterminés et séparés<ref>J. Brun, ''Aristote et le Lycée'', PUF, « Que sais-je ? », Paris, 1961, p. 95-96</ref>. Les substances secondes, en revanche, sont les espèces et les genres auxquels appartiennent les substances premières. L'homme (espèce) et l'animal (genre) sont des substances secondes parce qu'ils se disent des substances premières : Socrate est un homme, l'homme est un animal. Aristote précise qu'« parmi les substances secondes, l'espèce est plus substance que le genre, car elle est plus proche de la substance première »<ref>Aristote, ''Catégories'', 5, 2b7-8</ref>. Si l'on veut rendre compte de ce qu'est Socrate, on sera plus précis en disant que c'est un homme plutôt qu'un animal. Cette hiérarchie révèle une structure ontologique fondamentale : les substances premières sont pré supposées comme sujets par toutes les autres réalités, et ce que les substances premières sont par rapport à tout le reste, les espèces le sont par rapport aux genres<ref>Aristote, ''Catégories'', 5, 2b15-22</ref>. Seules les espèces et les genres méritent d'être appelés substances secondes, car eux seuls, parmi tous les prédicats, indiquent la substance première de manière essentielle<ref>S. Bassu, ''Aristote'', Ellipses, Paris, 2016, p. 62-63</ref>. ==== Les propriétés caractéristiques de la substance ==== Aristote dégage plusieurs propriétés topiques qui permettent d'identifier la substance et de la distinguer des accidents. Premièrement, toute substance n'est pas dans un sujet. Cette caractéristique sépare radicalement la substance des qualités, quantités et relations qui, elles, existent nécessairement dans un substrat<ref>Aristote, ''Catégories'', 5, 3a7-21</ref>. Deuxièmement, la substance et ses différences se disent de façon synonyme (''sunônuma''). Tout ce qui est attribué à partir d'une substance l'est avec le même nom et la même définition : quand on dit de Socrate qu'il est un homme et de l'homme qu'il est un animal, le terme « est » conserve le même sens fondamental<ref>Aristote, ''Catégories'', 5, 3a33-3b9</ref>. Troisièmement, toute substance « indique un certain ceci » (''tode ti''). Les substances premières désignent indiscutablement quelque chose d'individuel et de numériquement un. Les substances secondes, bien que leur forme grammaticale suggère qu'elles indiquent également un « ceci », désignent en réalité plutôt « une certaine sorte d'objet » (''poion ti'') : l'homme n'est pas un individu unique mais une espèce comprenant une multiplicité de sujets<ref>Aristote, ''Catégories'', 5, 3b10-21, dans F. Stirn, ''Aristote'', Armand Colin, Paris, 1999, p. 91-95</ref>. Quatrièmement, la substance n'admet pas le plus ou le moins. Un homme n'est pas « plus homme » qu'un autre, ni plus homme à un moment qu'à un autre. Cette propriété distingue la substance de la qualité : un corps peut être plus ou moins blanc, mais Socrate ne peut être plus ou moins Socrate<ref>Aristote, ''Catégories'', 5, 3b33-4a9</ref>. Enfin, et c'est là « ce que l'on considère surtout comme propre à la substance », celle-ci est capable de recevoir les contraires tout en restant la même et numériquement une. Un même homme, restant identique à lui-même, devient tantôt pâle tantôt bronzé, tantôt chaud tantôt froid, tantôt bon tantôt mauvais. Aucune autre catégorie ne possède cette capacité remarquable de demeurer identique tout en subissant des modifications contraires<ref>Aristote, ''Catégories'', 5, 4a10-21</ref>. ==== Les catégories et la structure du langage ==== Cette doctrine des catégories révèle un lien profond entre l'ontologie et le langage. Les catégories ne sont pas seulement des divisions de l'être, mais aussi des types de prédication. Comme l'explique Aristote, « l'être se dit en autant de sens qu'il y a de catégories »<ref>Aristote, ''Métaphysique'', Δ, 7, 1017a22-24</ref>. Dire que « Socrate est un homme » (substance), que « Socrate est grand » (quantité), que « Socrate est sage » (qualité), ou que « Socrate est au Lycée » (lieu), ce sont autant de manières différentes d'attribuer l'être. Cette correspondance entre langage et réalité n'est cependant pas fortuite. Les catégories ne découlent pas d'une analyse arbitraire du discours, mais reflètent la structure même du réel. Elles constituent les « genres de l'être » (''ta genê tou ontos''), c'est-à-dire les divisions fondamentales selon lesquelles la réalité s'ordonne<ref>R. Bodéüs, Introduction aux ''Catégories'', Les Belles Lettres, Paris, 2001, p. CXVIII-CXXV</ref>. Aristote fonde ainsi une ontologie catégoriale qui demeurera pendant des siècles la référence de la pensée occidentale. ==== L'unité problématique de l'être ==== La doctrine des catégories soulève néanmoins une difficulté majeure : si l'être se dit en plusieurs sens irréductibles, comment préserver l'unité de son concept ? Comment parler de « l'être en tant qu'être » s'il n'y a pas un sens unique mais dix sens différents de l'être ? Aristote ne dissimule pas cette aporie. L'être n'est pas un genre au sens propre, car un genre possède une définition unique qui s'applique uniformément à toutes ses espèces<ref>Aristote, ''Métaphysique'', B, 3, 998b22</ref>. La solution aristotélicienne consiste à reconnaître que l'être est dit selon une pluralité ordonnée. Bien que l'être n'ait pas un sens univoque, ses différentes acceptions ne sont pas non plus purement équivoques. Elles se rapportent toutes à un terme premier : la substance. « L'être se dit en multiples acceptions, mais toujours relativement à un terme unique, à une nature déterminée », affirme Aristote dans un passage capital de la ''Métaphysique''<ref>Aristote, ''Métaphysique'', Γ, 2, 1003a33-b10</ref>. De même que tout ce qui est « sain » se rapporte à la santé — tel aliment la produit, tel exercice la conserve, telle couleur l'indique — de même tout ce qui « est » se rapporte à la substance. C'est ce que la tradition appellera l'analogie de l'être : une unité relative, fondée sur une référence commune, qui préserve la diversité des sens tout en maintenant leur cohérence<ref>P. Aubenque, ''Le problème de l'être chez Aristote'', PUF, Paris, 1962, p. 178-195</ref>. Ainsi, les dix catégories ne forment pas une liste hétéroclite mais un système hiérarchisé dont la substance constitue le centre. Cette architecture conceptuelle permet à Aristote d'affirmer simultanément la multiplicité des sens de l'être et l'unité de la science qui l'étudie : la philosophie première ou métaphysique, science de l'être en tant qu'être<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a20-32, dans C. Cerami dir., ''Génération et substance : Aristote et Averroès'', De Gruyter, Berlin, 2015, p. 167-172</ref>. === Chapitre II : Le ''De interpretatione'' – Le jugement et la proposition === Le ''De interpretatione'' (''Peri hermeneias'') constitue le deuxième traité de l'Organon aristotélicien et offre une analyse minutieuse de la proposition comme lieu privilégié de la vérité et de la fausseté. Aristote y examine la structure du discours déclaratif, les conditions de possibilité du jugement et les rapports entre langage, pensée et réalité. Cette œuvre, d'une densité conceptuelle remarquable, pose les fondements de la logique propositionnelle et s'attache à déterminer comment le ''logos'' peut manifester l'être<ref>Aristote, ''De l'interprétation'', 1, 16a3-8, trad. J. Tricot, Paris, Vrin, 1969, p. 77</ref>. ==== Le langage comme système symbolique ==== Aristote ouvre son traité par une réflexion sur le statut du langage qui marque une rupture décisive avec les conceptions sophistiques. Les sons émis par la voix (''ta en tè phonè'') sont, écrit-il, les symboles (''symbola'') des affections de l'âme (''ta en tè psychè pathèmata''), et les mots écrits sont à leur tour les symboles des mots prononcés<ref>Aristote, ''De l'interprétation'', 1, 16a3-8</ref>. Cette conception stratifiée du signe linguistique établit trois niveaux distincts : les choses (''pragmata''), les affections ou états de l'âme, et les signes vocaux ou écrits. Cette théorie sémiotique, qui sera reprise et développée par la scolastique médiévale, présente plusieurs caractéristiques essentielles. D'abord, elle affirme le caractère conventionnel (''kata synthèkèn'') du rapport entre le signifiant linguistique et le signifié mental : « De même que l'écriture n'est pas la même pour tous les hommes, les mots parlés ne sont pas non plus les mêmes, alors que les états de l'âme dont ces expressions sont immédiatement les signes sont identiques chez tous, comme sont identiques aussi les choses dont ces états sont les images »<ref>''Ibid.'', 16a5-8</ref>. La diversité des langues manifeste ainsi le caractère artificiel du lien entre ''phone'' et ''pathèma'', tandis que l'universalité des états mentaux et leur rapport de ressemblance (''homoiômata'') avec les choses garantit la possibilité d'une communication véridique. Cette analyse permet à Aristote de réfuter la position sophistique, particulièrement celle de Cratyle, selon laquelle les noms seraient naturellement justes. Contre l'idée d'une adhérence immédiate entre le mot et la chose, Aristote introduit une médiation nécessaire : celle de la pensée. Le langage ne manifeste pas directement l'être, mais signifie d'abord les concepts par lesquels nous appréhendons l'être<ref>Voir Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962, p. 100-110</ref>. ==== Les éléments du discours déclaratif : nom et verbe ==== Avant d'examiner la proposition proprement dite, Aristote analyse ses constituants élémentaires. Le nom (''onoma'') est défini comme « un son vocal possédant une signification conventionnelle, sans référence au temps, et dont aucune partie, prise isolément, n'est significative par elle-même »<ref>Aristote, ''De l'interprétation'', 2, 16a19-21</ref>. Cette définition insiste sur quatre caractères : la nature sonore (''phonè''), la signification conventionnelle (''kata synthèkèn''), l'atemporalité, et l'absence de signification des parties considérées isolément. Ce dernier point vaut pour les noms simples ; dans les noms composés comme « Callippos », les parties (''kallos'', « beauté », et ''hippos'', « cheval ») ne contribuent pas à la signification du tout<ref>''Ibid.'', 16a21-29</ref>. Aristote précise que « rien n'est par nature un nom, mais seulement quand il devient symbole »<ref>''Ibid.'', 16a27-28</ref>. Cette conventionnalité radicale distingue le langage humain des cris inarticulés des animaux : même lorsque ceux-ci signifient quelque chose (par exemple la douleur), ils ne constituent pas des noms car ils n'impliquent pas la médiation d'une institution symbolique. Le nom renvoie donc à une réalité doublement humaine : comme production vocale conventionnelle et comme instrument de la vie sociale et politique. Aristote mentionne également les noms indéfinis (''aoriston onoma''), comme « non-homme », qui ne sont pas véritablement des noms car ils peuvent s'appliquer indifféremment à tout ce qui n'est pas homme, sans détermination positive<ref>''Ibid.'', 2, 16a30-32</ref>. Cette analyse des termes privatifs ou négatifs anticipe les difficultés ultérieures concernant le statut logique de la négation. Le verbe (''rhèma'') se distingue du nom par deux caractères spécifiques : « Le verbe est ce qui ajoute à sa propre signification celle du temps ; aucune de ses parties n'est significative prise séparément, et il indique toujours quelque chose d'affirmé de quelque chose d'autre »<ref>''Ibid.'', 3, 16b6-8</ref>. La première caractéristique, la consignification du temps (''prosèmainei chronon''), fait du verbe l'élément qui ancre le discours dans la temporalité et permet de distinguer le présent, le passé et le futur. Mais c'est la seconde caractéristique qui importe le plus du point de vue logique : le verbe signifie toujours « quelque chose dit au sujet de quelque chose d'autre », c'est-à-dire qu'il introduit essentiellement une relation prédicative. Cependant, Aristote ajoute une précision capitale : les verbes « dits par eux-mêmes » (''kath' hauta legomena''), c'est-à-dire pris isolément sans sujet explicite, « sont des noms et signifient quelque chose », mais « ils ne signifient pas encore si la chose est ou n'est pas »<ref>''Ibid.'', 16b19-22</ref>. Ainsi, le verbe « court » ou « marche », prononcé seul, arrête certes la pensée de l'auditeur et produit un sens, mais il ne constitue pas encore un jugement, il n'affirme ni ne nie rien. Cette observation conduit à la question cruciale du rôle de la copule « être ». Le verbe « être » occupe une position singulière dans l'analyse aristotélicienne. Pris en lui-même, « être ou ne pas être n'est pas un signe de la chose réelle, pas même si tu dis 'étant' tout court ; car en soi, ce n'est rien, mais il consignifie une certaine composition qu'on ne peut concevoir sans les composants »<ref>''Ibid.'', 3, 16b22-25</ref>. Cette remarque énigmatique a suscité d'innombrables commentaires. Elle suggère que le verbe « être », dans sa fonction copulative, ne possède pas de contenu sémantique autonome, mais signifie l'acte même de liaison ou de synthèse (''synthesis'') entre le sujet et le prédicat. Ce n'est donc ni un nom, ni vraiment un verbe au sens plein, mais le marqueur linguistique de l'opération judicative elle-même<ref>Voir Octave Hamelin, ''Le système d'Aristote'', Paris, Vrin, 1920, p. 159-160</ref>. ==== La proposition déclarative (''logos apophantikos'') ==== Tout discours (''logos'') n'est pas une proposition. La prière (''euchè''), par exemple, est bien un discours, mais elle n'est ni vraie ni fausse, et son étude relève plutôt de la rhétorique ou de la poétique<ref>Aristote, ''De l'interprétation'', 4, 17a2-7</ref>. Aristote définit la proposition déclarative (''logos apophantikos'') comme « le discours en lequel réside le vrai ou le faux »<ref>''Ibid.'', 17a2-3</ref>. Ce n'est donc pas n'importe quel énoncé, mais celui qui possède une valeur de vérité, celui qui « manifeste » (''apophainein'') un état de choses et peut être confronté à la réalité. La proposition élémentaire se divise en affirmation (''kataphasis'') et négation (''apophasis''). L'affirmation est « la déclaration de quelque chose au sujet de quelque chose » (''apophansis tinos kata tinos''), tandis que la négation est « la déclaration de quelque chose séparé de quelque chose » (''apophansis tinos apo tinos'')<ref>''Ibid.'', 5, 17a25-26</ref>. Cette structure binaire – affirmer ou nier un prédicat d'un sujet – constitue la forme canonique du jugement aristotélicien. Toute proposition déclarative se ramène ultimement à la formule « S est P » (affirmation) ou « S n'est pas P » (négation). Aristote insiste sur le fait que l'affirmation et la négation concernent nécessairement la liaison ou la séparation d'un sujet et d'un prédicat. Une proposition n'est pas une simple juxtaposition de mots, mais suppose une ''synthesis'' (dans l'affirmation) ou une ''diairesis'' (dans la négation). C'est précisément cette opération de composition ou de division qui rend possible la vérité ou la fausseté. Comme Aristote l'expliquera dans la ''Métaphysique'', « dire que ce qui est est et que ce qui n'est pas n'est pas, c'est le vrai ; dire que ce qui est n'est pas ou que ce qui n'est pas est, c'est le faux »<ref>Aristote, ''Métaphysique'', Γ (IV), 7, 1011b26-27</ref>. Cette définition de la vérité comme adéquation (ou conformité) marque un tournant décisif dans l'histoire de la philosophie. Elle établit que la vérité ne réside ni dans les choses elles-mêmes, ni dans la pensée isolée, mais dans le jugement en tant qu'il assemble ou sépare des déterminations conformément à ce qui est assemblé ou séparé dans la réalité. La vérité est donc toujours relative à une opération prédicative : elle suppose la dualité du sujet et du prédicat, et l'acte qui les relie ou les disjoint. ==== Quantité et qualité des propositions ==== Aristote distingue les propositions selon leur quantité et leur qualité. Du point de vue de la quantité, les propositions sont universelles (''katholou''), particulières (''en merei''), singulières (portant sur un individu) ou indéterminées (''aoristoi'')<ref>Aristote, ''De l'interprétation'', 7, 17a38-17b12</ref>. Une proposition universelle affirme ou nie quelque chose de « tout » son sujet (''pan'', ''oudens'') : « Tout homme est blanc », « Nul homme n'est blanc ». Une proposition particulière affirme ou nie quelque chose de « quelque » sujet : « Quelque homme est blanc », « Quelque homme n'est pas blanc ». Les propositions indéterminées sont celles qui ne comportent aucune marque de quantité : « L'homme est blanc », « L'homme n'est pas blanc ». Du point de vue de la qualité, les propositions sont affirmatives ou négatives. En croisant ces deux critères, on obtient quatre formes fondamentales de propositions : l'universelle affirmative (A), l'universelle négative (E), la particulière affirmative (I), et la particulière négative (O) – désignations qui ne sont pas aristotéliciennes mais scolastiques, tirées des voyelles des mots latins ''Affirmo'' et ''nEgO''. Cette classification quantitative revêt une importance considérable pour la théorie du syllogisme développée dans les ''Premiers Analytiques''. Elle permet notamment de définir les relations d'opposition entre propositions : contradiction, contrariété, subcontrariété et subalternation. Deux propositions sont contradictoires lorsqu'elles diffèrent à la fois en quantité et en qualité : « Tout homme est juste » et « Quelque homme n'est pas juste ». Elles sont contraires lorsqu'elles sont toutes deux universelles mais de qualité opposée : « Tout homme est juste » et « Nul homme n'est juste »<ref>''Ibid.'', 7, 17b16-26</ref>. ==== Le problème des futurs contingents ==== Le chapitre 9 du ''De interpretatione'' soulève l'une des questions les plus débattues de l'histoire de la logique et de la métaphysique : celle du statut des propositions portant sur les futurs contingents. Aristote se demande si le principe de bivalence – selon lequel toute proposition est soit vraie, soit fausse – s'applique aux propositions concernant des événements futurs qui ne sont ni nécessaires ni impossibles. Le problème se formule ainsi : « Il y aura demain une bataille navale » et « Il n'y aura pas demain une bataille navale » sont deux propositions contradictoires. D'après le principe du tiers exclu, l'une doit être vraie et l'autre fausse. Mais si l'une est dès maintenant vraie (par exemple la première), alors il est nécessaire qu'il y ait demain une bataille navale, car « il n'est pas possible que ce qui a été dit de vrai se produise autrement »<ref>Aristote, ''De l'interprétation'', 9, 18b9-16</ref>. On aboutit ainsi à un fatalisme logique : tout ce qui arrivera devait nécessairement arriver, et la contingence est abolie. La solution d'Aristote est subtile. Il maintient que, pour les propositions portant sur le présent et le passé, le principe de bivalence s'applique sans restriction : de deux contradictoires, l'une est nécessairement vraie et l'autre fausse. Mais pour les futurs contingents, il faut modifier cette règle : « Il est nécessaire que l'affirmation ou la négation soit vraie, mais non que celle-ci déterminément ou celle-là déterminément soit vraie »<ref>''Ibid.'', 19a36-39</ref>. Autrement dit, il est nécessaire que l'une des deux propositions soit vraie et l'autre fausse, mais il n'est pas nécessaire que ce soit celle-ci plutôt que celle-là. La disjonction est nécessaire, mais chacun des disjoints reste contingent. Cette distinction entre nécessité « divisée » et nécessité « composée » (pour reprendre la terminologie scolastique) préserve à la fois le principe logique fondamental et la réalité de la contingence dans le monde. « Les discours sont vrais de la même manière que les choses », écrit Aristote<ref>''Ibid.'', 9, 19a33</ref> : si les événements futurs sont contingents, les propositions qui les concernent ne peuvent avoir dès maintenant une vérité ou une fausseté déterminée. Cette doctrine a suscité des controverses innombrables, de l'Antiquité (les Stoïciens) au Moyen Âge (les discussions sur la prescience divine) jusqu'à la logique contemporaine (la logique modale et les logiques plurivalentes). ==== Les propositions modales ==== Les chapitres 12 et 13 du ''De interpretatione'' examinent les propositions modales, c'est-à-dire celles qui n'affirment pas simplement que quelque chose est ou n'est pas, mais qu'il est possible, impossible, contingent ou nécessaire que quelque chose soit<ref>Aristote, ''De l'interprétation'', 12-13, 21a34-23a26</ref>. Aristote distingue quatre modalités fondamentales : le possible (''dynaton'', ''endechomenon''), l'impossible (''adynaton''), le contingent (également ''endechomenon'' dans un sens plus restreint) et le nécessaire (''anankaion''). L'analyse des rapports entre ces modalités pose des difficultés considérables. Aristote établit que « Il est possible que S soit P » ne se convertit pas comme une proposition assertorique : de « Il est possible que tout B soit A », on ne peut pas conclure « Il est possible que tout A soit B ». En revanche, la proposition « Il est possible que S soit P » implique « Il est possible que S ne soit pas P », car la possibilité véritable suppose l'indétermination : ce qui peut être peut aussi ne pas être<ref>''Ibid.'', 13, 22a14-23</ref>. Le nécessaire, au contraire, exclut la possibilité opposée : si « Il est nécessaire que S soit P », alors il est impossible que S ne soit pas P. Aristote définit le nécessaire comme « ce qui ne peut pas ne pas être » (''to mè endechomenon mè einai'')<ref>''Ibid.'', 12, 21b35-36</ref>. Cette définition sera reprise par toute la tradition scolastique et restera au centre des débats modaux jusqu'à Leibniz et au-delà. Les propositions modales jouent un rôle essentiel dans la théorie aristotélicienne de la science exposée dans les ''Seconds Analytiques'' : la science porte sur le nécessaire, non sur le contingent. Seul ce qui est toujours ou le plus souvent peut faire l'objet d'une démonstration rigoureuse. L'accident pur, ce qui arrive parfois mais pas régulièrement, échappe à la connaissance scientifique<ref>Aristote, ''Seconds Analytiques'', I, 30, 87b19-27</ref>. ==== L'unité et la multiplicité des propositions ==== Le chapitre 11 examine la question de savoir ce qui fait l'unité d'une proposition. Aristote distingue les propositions véritablement unes de celles qui ne sont unes qu'en apparence. Une proposition est une si elle affirme ou nie « une seule chose d'une seule chose » (''hen kata henos'')<ref>Aristote, ''De l'interprétation'', 11, 20b12-13</ref>. Mais cette unité peut être entendue de deux manières : ou bien le prédicat constitue véritablement une unité (par exemple « animal bipède » dans « L'homme est un animal bipède »), ou bien on relie par accident plusieurs prédicats à un même sujet. La difficulté est de déterminer dans quels cas plusieurs prédicats forment véritablement une unité. « Homme », « blanc » et « musicien » peuvent certes être attribués ensemble à Socrate (« Socrate est un homme blanc et musicien »), mais ils ne forment pas une essence unique. En revanche, « animal » et « bipède » constituent ensemble la définition de l'homme et forment donc une unité substantielle<ref>''Ibid.'', 11, 20b31-21a7</ref>. Cette distinction anticipe l'analyse des différents types de prédication (essentielle, propre, accidentelle) développée dans les ''Topiques'' et les ''Seconds Analytiques''. Cette réflexion sur l'unité de la proposition révèle la préoccupation constante d'Aristote : garantir que le discours ne se perde pas dans une multiplicité infinie et indéterminée, mais conserve une structure rationnelle permettant la connaissance. Le langage doit être régulé par les articulations mêmes de l'être : les genres, les espèces, les accidents par soi, etc. C'est seulement à cette condition que le ''logos apophantikos'' peut manifester véritablement ce qui est. ==== Portée philosophique du ''De interpretatione'' ==== L'importance du ''De interpretatione'' dépasse largement le cadre d'un traité de logique formelle. Aristote y pose les bases d'une ontologie du jugement qui dominera toute la philosophie occidentale jusqu'à Kant et au-delà. En établissant que la vérité réside dans la composition et la division opérées par l'intellect, et non dans les choses elles-mêmes ni dans les concepts isolés, Aristote fait du jugement le lieu privilégié de la manifestation de l'être. Cette doctrine a plusieurs implications majeures. D'abord, elle implique que la vérité est toujours relationnelle : elle suppose un rapport entre au moins deux termes (sujet et prédicat), et entre la pensée et la réalité. Il n'y a pas de vérité absolue et simple, mais seulement des vérités de composition. Ensuite, elle établit que l'erreur est possible : là où il y a composition, il peut y avoir fausse composition. L'erreur naît précisément de l'écart possible entre la liaison que nous posons dans le jugement et la liaison réelle dans les choses<ref>Aristote, ''Métaphysique'', Θ (IX), 10, 1051b1-9</ref>. Enfin, le ''De interpretatione'' pose la question des limites du langage déclaratif. En distinguant le ''logos apophantikos'' des autres formes de discours (prière, commandement, souhait), Aristote délimite le domaine propre de la logique et de la science : celui des énoncés susceptibles d'être vrais ou faux. Mais cette délimitation implique aussi une reconnaissance : il existe des usages légitimes du langage qui échappent à la juridiction de la logique. Cette reconnaissance ouvre un espace pour la rhétorique, la poétique et, plus généralement, pour toutes les formes de discours qui ne visent pas la vérité théorique mais d'autres fins – persuader, émouvoir, prescrire, célébrer. Le ''De interpretatione'' demeure ainsi une œuvre fondatrice, non seulement pour la logique et la philosophie du langage, mais pour toute réflexion sur les rapports entre pensée, langage et réalité. Sa richesse conceptuelle et les difficultés qu'il soulève continuent de nourrir les débats contemporains en philosophie analytique, en linguistique et en logique formelle. === Chapitre III : Les Analytiques – La science démonstrative === Les deux traités des ''Analytiques'' – ''Premiers Analytiques'' (''Analytica priora'') et ''Seconds Analytiques'' (''Analytica posteriora'') – constituent le cœur de l'édifice logique aristotélicien et exposent la théorie de la science démonstrative. Tandis que les ''Premiers Analytiques'' s'attachent à la forme du syllogisme en général, indépendamment de la vérité des prémisses, les ''Seconds Analytiques'' traitent du syllogisme scientifique ou démonstratif (''apodeixis''), dont les prémisses doivent être vraies, premières et causales<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-16</ref>. Cette distinction fondamentale marque la différence entre la logique formelle et l'épistémologie : les ''Premiers Analytiques'' étudient la validité formelle des raisonnements, les ''Seconds Analytiques'' examinent les conditions de la connaissance scientifique<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', 2e éd., Oxford, Clarendon Press, 1993, p. xviii-xix</ref>. ==== Le syllogisme : structure et figures ==== Le syllogisme (''syllogismos'') est défini par Aristote comme « un discours dans lequel, certaines choses étant posées, quelque chose d'autre que ces données en résulte nécessairement par le seul fait de ces données »<ref>Aristote, ''Premiers Analytiques'', I, 1, 24 b 18-20</ref>. Cette définition insiste sur trois caractères essentiels : la pluralité des prémisses (au moins deux), la nécessité de la conclusion, et le fait que cette nécessité découle uniquement de la position des prémisses, sans recours à aucune autre donnée. Le syllogisme est ainsi la forme canonique du raisonnement déductif, celui qui permet de passer de propositions données à une conclusion qui en découle avec rigueur<ref>David Bronstein, ''Aristotle on Knowledge and Learning: The Posterior Analytics'', Oxford, Oxford University Press, 2016, p. 31-32</ref>. La structure minimale du syllogisme comporte trois termes : le grand extrême ou majeur (''to mega akron''), le petit extrême ou mineur (''to mikron akron''), et le moyen terme (''to meson'') qui assure la liaison entre les deux extrêmes sans apparaître dans la conclusion<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 32-36</ref>. Ces trois termes entrent dans deux prémisses – la majeure et la mineure – pour produire une conclusion. Par exemple : « Tout homme est mortel » (majeure), « Or Socrate est un homme » (mineure), « Donc Socrate est mortel » (conclusion). Le moyen terme « homme » relie le prédicat « mortel » au sujet « Socrate », mais disparaît dans la conclusion. Aristote distingue trois figures du syllogisme selon la position du moyen terme dans les prémisses. Dans la première figure, le moyen terme est sujet de la majeure et prédicat de la mineure. Dans la deuxième figure, il est prédicat dans les deux prémisses. Dans la troisième figure, il est sujet dans les deux prémisses<ref>Aristote, ''Premiers Analytiques'', I, 4-6, 25 b 26-28 b 14</ref>. La première figure est considérée comme la plus parfaite, car elle seule permet de conclure dans tous les modes (universelles affirmatives et négatives, particulières affirmatives et négatives), tandis que les deux autres figures ne produisent que des conclusions limitées : la deuxième ne donne que des conclusions négatives, la troisième que des conclusions particulières<ref>Aristote, ''Premiers Analytiques'', I, 7, 29 a 30 ; I, 14, 32 b 38-33 a 5</ref>. À l'intérieur de chaque figure, Aristote détermine les modes valables en combinant les différentes qualités (affirmative/négative) et quantités (universelle/particulière) des propositions. Dans la première figure, quatre modes sont concluants : Barbara (deux universelles affirmatives donnant une universelle affirmative), Celarent (universelle négative et universelle affirmative donnant une universelle négative), Darii et Ferio pour les particulières<ref>Aristote, ''Premiers Analytiques'', I, 4, 25 b 37-26 b 34</ref>. Les syllogismes des deuxième et troisième figures, dits « imparfaits », doivent être ramenés par conversion des prémisses aux syllogismes parfaits de la première figure pour manifester leur validité. Cette réduction opère par transformation des propositions selon les lois de conversion : l'universelle négative se convertit simplement (« Nul A n'est B » devient « Nul B n'est A »), l'universelle affirmative se convertit par accident (« Tout A est B » devient « Quelque B est A »), la particulière affirmative se convertit simplement<ref>Aristote, ''Premiers Analytiques'', I, 2-3, 25 a 1-26</ref>. ==== La démonstration scientifique (''apodeixis'') ==== Si les ''Premiers Analytiques'' étudient le syllogisme en général, abstraction faite de la vérité des prémisses, les ''Seconds Analytiques'' s'attachent au syllogisme scientifique ou démonstratif. Aristote ouvre ce traité par une déclaration solennelle : « Nous estimons posséder la science d'une chose d'une manière absolue, et non pas, à la façon des Sophistes, d'une manière purement accidentelle, quand nous croyons que nous connaissons la cause par laquelle la chose est, que nous savons que cette cause est celle de la chose, et qu'en outre il n'est pas possible que la chose soit autre qu'elle n'est »<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 9-12</ref>. La science (''epistèmè'') se définit donc triplement : elle est connaissance de la cause, certitude de l'adéquation entre la cause et l'effet, et conscience de la nécessité de cette liaison<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 90-93</ref>. La démonstration est le syllogisme qui produit la science. Elle doit partir de prémisses qui satisfont plusieurs exigences cumulatives : elles doivent être vraies (car on ne peut savoir ce qui n'est pas), premières (indémontrables, car la chaîne des démonstrations ne peut remonter à l'infini), immédiates (sans moyen terme intermédiaire), plus connues que la conclusion, antérieures à elle, et causes de celle-ci<ref>Aristote, ''Seconds Analytiques'', I, 2, 71 b 20-25</ref>. Ces conditions garantissent que la conclusion ne sera pas seulement vraie et nécessaire, mais qu'elle sera sue avec certitude comme découlant de ses causes. Sans ces conditions, on peut avoir un syllogisme valide, mais non une démonstration scientifique<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 35-42</ref>. Le moyen terme joue dans la démonstration un rôle crucial : il n'est pas seulement l'élément logique qui relie les extrêmes, il est la cause (''aitia'') de l'attribution du prédicat au sujet. « Le moyen terme est la cause », écrit Aristote<ref>Aristote, ''Seconds Analytiques'', II, 2, 90 a 6</ref>. Par exemple, pour démontrer que la Lune subit des éclipses, on utilisera comme moyen terme « interposition de la Terre », qui n'est pas seulement un lien logique mais la cause physique du phénomène. Aristote distingue ainsi le syllogisme du fait (''hoti'') et le syllogisme du pourquoi (''dioti'') : le premier prouve que quelque chose est, le second pourquoi c'est<ref>Aristote, ''Seconds Analytiques'', I, 13, 78 a 22-b 13</ref>. La vraie science s'obtient par le syllogisme du pourquoi, qui exhibe la cause à travers le moyen terme<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 214-220</ref>. Aristote précise que les causes dont traite la démonstration correspondent aux quatre types de causes exposés dans la ''Physique'' : la cause formelle (l'essence), la cause matérielle (ce dont une chose est faite), la cause efficiente (ce qui produit le changement) et la cause finale (ce en vue de quoi)<ref>Aristote, ''Seconds Analytiques'', II, 11, 94 a 20-24 ; cf. ''Physique'', II, 3, 194 b 23-195 b 30</ref>. Toutefois, dans les sciences théoriques comme les mathématiques, c'est surtout la cause formelle qui intervient, car les objets mathématiques ne subissent ni génération ni corruption. Dans les sciences physiques et biologiques, en revanche, les quatre causes peuvent être invoquées selon les circonstances<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', Oxford, Oxford University Press, 2012, p. 176-180</ref>. ==== Les principes de la science : axiomes, hypothèses et définitions ==== Toute démonstration présuppose des principes (''archai'') qui, eux-mêmes, ne peuvent être démontrés. Aristote refuse vigoureusement l'idée d'une régression à l'infini dans la chaîne des démonstrations, de même qu'il rejette la démonstration circulaire où l'on prouverait A par B et B par A<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18</ref>. Il faut donc admettre l'existence de principes premiers, qui sont connus sans démonstration. Ces principes se divisent en trois catégories<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 94-99</ref>. D'abord, les axiomes (''axiômata'') ou principes communs, qui s'appliquent à toutes les sciences. Le plus fondamental est le principe de non-contradiction : « Il est impossible que le même attribut appartienne et n'appartienne pas en même temps au même sujet et sous le même rapport »<ref>Aristote, ''Métaphysique'', Γ (IV), 3, 1005 b 19-20</ref>. Ce principe n'est pas démontrable, car toute démonstration le présupposerait, mais il peut être défendu par réfutation de ceux qui le nient. Le principe du tiers exclu – « De deux propositions contradictoires, l'une est nécessairement vraie et l'autre fausse » – constitue un autre axiome fondamental. Ces principes, Aristote le précise dans les ''Seconds Analytiques'', sont utilisés par toutes les sciences, mais chacune en fait l'usage que requiert son genre propre<ref>Aristote, ''Seconds Analytiques'', I, 11, 77 a 26-31</ref>. Ensuite, les hypothèses (''hypotheseis'') et les thèses (''theseis''), qui affirment l'existence ou la non-existence de certaines entités propres à chaque science. Une hypothèse suppose l'existence de l'objet d'étude (par exemple, l'arithmétique suppose l'existence de l'unité, la géométrie celle du point et de la ligne), tandis qu'une thèse affirme quelque chose sans le prouver, soit à titre de postulat contraire à l'opinion commune, soit à titre de principe accepté par l'élève<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 14-24 ; I, 10, 76 b 23-34</ref>. Ces principes délimitent le domaine d'une science : on ne peut démontrer les propriétés des triangles sans avoir d'abord posé l'existence des figures géométriques. Enfin, les définitions (''horoi'') énoncent ce qu'est une chose, son essence (''ti esti''). La définition n'est pas une démonstration, car elle ne prouve rien : elle se contente de manifester l'essence<ref>Aristote, ''Seconds Analytiques'', II, 3, 90 b 24-27</ref>. Cependant, elle entretient avec la démonstration des rapports complexes. Aristote examine longuement la question de savoir si l'on peut démontrer l'essence, et il conclut négativement : la définition et la démonstration sont deux opérations distinctes<ref>Aristote, ''Seconds Analytiques'', II, 4, 91 a 35-b 11</ref>. On ne démontre pas « ce qu'est l'homme », on le définit. Toutefois, certaines définitions peuvent découler de démonstrations : c'est le cas des définitions causales, qui expliquent pourquoi une chose a telle propriété essentielle. Par exemple, la définition du tonnerre comme « bruit dans les nuages causé par l'extinction du feu » révèle à la fois l'essence et la cause du phénomène<ref>Aristote, ''Seconds Analytiques'', II, 8, 93 b 7-14</ref>. ==== Unité et diversité des sciences ==== Un principe capital de l'épistémologie aristotélicienne est l'interdiction du passage d'un genre à un autre (''metabasis eis allo genos''). Chaque science se définit par son genre propre, c'est-à-dire par le domaine d'objets qu'elle étudie, et elle ne peut emprunter ses principes ou ses démonstrations à une autre science<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 a 38-b 2</ref>. On ne peut pas, par exemple, démontrer un théorème géométrique par des principes arithmétiques, car le nombre et la grandeur constituent deux genres différents. Cette règle garantit l'autonomie des sciences et interdit toute confusion entre les domaines du savoir<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 177-183</ref>. Aristote admet cependant trois exceptions à cette règle. D'abord, lorsque les objets d'une science tombent sous ceux d'une autre comme des espèces sous un genre commun : ainsi l'optique et la mécanique utilisent les principes de la géométrie, l'harmonique ceux de l'arithmétique<ref>Aristote, ''Seconds Analytiques'', I, 7, 75 b 14-17</ref>. On dit alors que ces sciences sont « subordonnées » (''hypo'') aux sciences plus générales. Ensuite, les sciences peuvent partager les axiomes communs, bien que chacune ne les utilise que dans la mesure où ils s'appliquent à son genre propre. Enfin, il existe des sciences mixtes ou « moyennes » (''metaxu''), comme l'astronomie mathématique, qui appliquent les principes mathématiques aux phénomènes physiques<ref>Aristote, ''Physique'', II, 2, 194 a 7-12</ref>. Cette théorie de l'unité et de la diversité des sciences fonde l'organisation aristotélicienne du savoir. Chaque science possède une méthode adaptée à son objet : les mathématiques procèdent par démonstration nécessaire à partir de principes évidents, la physique doit tenir compte du changement et de la contingence, la biologie observe les régularités qui se produisent « dans la plupart des cas » (''hôs epi to poly''), l'éthique et la politique se contentent de vérités approximatives car « le bien et le juste comportent de grandes divergences et incertitudes »<ref>Aristote, ''Éthique à Nicomaque'', I, 3, 1094 b 14-16</ref>. Il n'y a donc pas de science unique et universelle, mais une pluralité de sciences régies par les principes que leur impose leur objet propre<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 173-176</ref>. ==== Le problème de la connaissance des principes : induction et intellection ==== La théorie de la démonstration soulève un problème redoutable : si toute science procède de principes indémontrables, comment connaître ces principes eux-mêmes ? Aristote refuse les deux solutions extrêmes : soit dire qu'il n'y a pas de science possible puisque les principes sont inconnaissables, soit affirmer que tout est démontrable et accepter une régression à l'infini<ref>Aristote, ''Seconds Analytiques'', I, 3, 72 b 5-18</ref>. Il faut donc admettre qu'il existe un mode de connaissance des principes distinct de la démonstration<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 259-267</ref>. Le célèbre et difficile chapitre final des ''Seconds Analytiques'' (II, 19) expose la solution d'Aristote. La connaissance des principes résulte d'un processus qui part de la sensation (''aisthèsis''), passe par la mémoire (''mnèmè''), puis par l'expérience (''empeiria''), pour aboutir à la saisie de l'universel. « De la sensation naît la mémoire, et de la mémoire fréquemment répétée d'une même chose naît l'expérience ; car des souvenirs en grand nombre constituent une seule expérience. De l'expérience, ou de tout universel qui s'est fixé dans l'âme, de l'un en dehors du multiple, de ce qui est identique en tous ces cas particuliers, provient alors le principe de l'art et de la science »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 3-9</ref>. Ce processus est appelé induction (''epagôgè''). L'induction n'est pas ici la simple énumération de cas particuliers conduisant à une généralisation hasardeuse, mais le mouvement naturel de l'âme qui, à partir d'une multiplicité sensible, dégage progressivement l'universel qui s'y trouve incarné. Aristote compare ce processus à une armée en déroute où, un soldat s'étant arrêté, un autre s'arrête auprès de lui, puis un autre, jusqu'à ce que l'ordre primitif soit rétabli : de même, à partir des sensations éparses, l'âme reconstitue l'unité de la forme universelle<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 a 12-14</ref>. Cette métaphore suggère que l'induction n'est pas une opération purement logique, mais un mouvement ontologique de l'âme vers l'intelligible<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 225-247</ref>. La saisie ultime des principes premiers relève d'une faculté spécifique qu'Aristote nomme intellect (''nous'') ou intuition intellectuelle. L'intellect est « la disposition par laquelle nous connaissons les principes »<ref>Aristote, ''Seconds Analytiques'', II, 19, 100 b 12</ref>. Il ne s'agit pas d'une faculté mystérieuse ou d'une illumination surnaturelle, mais de l'achèvement naturel du processus cognitif humain. Aristote affirme que nous possédons en puissance la capacité de connaître les principes, et que cette capacité s'actualise progressivement par l'exercice de la sensation et de la pensée. L'intellect est ainsi la plus haute forme de connaissance, supérieure même à la science démonstrative, car il appréhende directement et sans intermédiaire les vérités premières dont toute démonstration dépend<ref>Aristote, ''Éthique à Nicomaque'', VI, 6, 1141 a 7-8</ref>. Cette solution pose toutefois de nombreuses difficultés. Comment l'intellect peut-il être à la fois une capacité innée et le résultat d'un processus d'apprentissage ? Comment peut-il appréhender l'universel sans passer par le raisonnement ? Aristote ne répond pas clairement à ces questions, et ses successeurs – Alexandre d'Aphrodise, Avicenne, Averroès, Thomas d'Aquin – proposeront des interprétations divergentes du statut de l'intellect et de son rapport à l'expérience sensible. Ce qui demeure certain, c'est qu'Aristote refuse tout innéisme platonicien : nous ne naissons pas avec la connaissance des principes, nous l'acquérons progressivement à partir de l'expérience du monde sensible<ref>Orna Harari, ''Knowledge and Demonstration: Aristotle's Posterior Analytics'', Dordrecht, Springer, 2004, p. 26-31</ref>. ==== Les limites de la science démonstrative ==== Aristote ne prétend pas que toute connaissance relève de la démonstration. Au contraire, il délimite soigneusement le domaine de la science démonstrative et reconnaît l'existence d'autres formes légitimes de savoir. D'abord, tout ce qui relève de l'accident pur échappe à la science : ce qui arrive parfois mais pas toujours, ce qui est contingent et irrégulier, ne peut faire l'objet d'une démonstration nécessaire<ref>Aristote, ''Seconds Analytiques'', I, 30, 87 b 19-27</ref>. La science porte sur le nécessaire ou, à défaut, sur ce qui se produit « dans la plupart des cas ». Ensuite, il existe des propositions immédiates (''amesa'') qui, bien que vraies et universelles, ne peuvent être démontrées parce qu'il n'y a pas de moyen terme entre leur sujet et leur prédicat. Ces propositions constituent précisément les principes de la démonstration<ref>Aristote, ''Seconds Analytiques'', I, 2, 72 a 7-8</ref>. Les axiomes, les définitions, les hypothèses d'existence ne se démontrent pas : on les saisit par intuition intellectuelle ou on les pose comme conditions de la science<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. 179-182</ref>. Enfin, Aristote reconnaît que certaines formes de raisonnement, bien que n'étant pas des démonstrations au sens strict, jouent un rôle important dans la recherche scientifique. L'induction, comme on l'a vu, permet d'accéder aux principes. L'exemple (''paradeigma''), qui consiste à raisonner du particulier au particulier par l'intermédiaire d'un universel, est utile en rhétorique et en délibération politique<ref>Aristote, ''Premiers Analytiques'', II, 24, 68 b 38-69 a 19</ref>. Le raisonnement par signes (''sèmeion''), qui conclut de l'effet à la cause ou inversement, peut fournir des indications précieuses même s'il ne garantit pas la nécessité. Tous ces modes de raisonnement, bien qu'imparfaits du point de vue démonstratif, témoignent de la richesse et de la diversité de la pensée rationnelle. ==== Portée et postérité de la théorie démonstrative ==== La théorie aristotélicienne de la science démonstrative a exercé une influence considérable sur toute l'histoire de la philosophie et des sciences. Elle a fourni le modèle épistémologique dominant pendant deux millénaires, de l'Antiquité grecque à la Renaissance, en passant par la scolastique médiévale. Les mathématiques d'Euclide, avec leur méthode axiomatique-déductive, constituent l'incarnation parfaite de l'idéal aristotélicien : des définitions claires, des axiomes évidents, des démonstrations rigoureuses enchaînant les théorèmes selon un ordre nécessaire<ref>David Bronstein, ''Aristotle on Knowledge and Learning'', op. cit., p. 3-10</ref>. Cependant, la théorie aristotélicienne a aussi fait l'objet de critiques sévères, particulièrement à partir de la révolution scientifique moderne. Descartes reproche au syllogisme de ne rien apprendre de nouveau, puisque la conclusion est déjà contenue dans les prémisses. Bacon dénonce la stérilité de la logique aristotélicienne et lui oppose sa méthode inductive fondée sur l'observation et l'expérimentation. Les sciences modernes – physique galiléenne, mécanique newtonienne, biologie darwinienne – ne se conforment pas au schéma aristotélicien : elles procèdent par hypothèses provisoires, expérimentations, inférences probabilistes, et non par démonstrations nécessaires à partir de principes évidents<ref>Jonathan Barnes, ''Aristotle's Posterior Analytics'', op. cit., p. xviii-xix</ref>. Ces critiques, pour fondées qu'elles soient, ne doivent pas faire oublier les apports décisifs d'Aristote. Il a établi les règles de la déduction valide, distingué clairement la forme et la matière du raisonnement, montré la nécessité des principes premiers et l'impossibilité d'une science unique et universelle. Sa théorie des causes et sa conception de l'explication scientifique comme connaissance du « pourquoi » restent fécondes. Surtout, il a compris que la science n'est pas un simple catalogue de faits, mais un système organisé de propositions reliées par des rapports logiques et causaux. Cette exigence de systématicité et de rigueur demeure au cœur de toute entreprise scientifique, même si les formes concrètes de la rationalité scientifique ont profondément évolué depuis Aristote<ref>Christopher Shields (éd.), ''The Oxford Handbook of Aristotle'', op. cit., p. 169-202</ref>. En définitive, les ''Analytiques'' représentent l'effort le plus abouti de l'Antiquité pour penser les conditions de la connaissance véritable. Aristote y pose les questions fondamentales de toute épistémologie : qu'est-ce que savoir ? Comment passe-t-on de l'ignorance à la science ? Quels sont les rapports entre la sensation, l'expérience et la raison ? Quelle est la nature des principes premiers ? Ces questions, loin d'être résolues une fois pour toutes, continuent de nourrir la réflexion philosophique contemporaine sur la science, ses méthodes et ses fondements. === Chapitre IV : Les ''Topiques'' – L'art de la dialectique === ==== La dialectique et les lieux communs ==== Si les ''Analytiques'' traitent de la démonstration scientifique, les ''Topiques'' concernent le raisonnement dialectique. La dialectique part de prémisses probables (''endoxa''), c'est-à-dire d'opinions généralement admises par tous, ou par les plus nombreux, ou par les sages<ref>Aristote, ''Topiques'', I, 1, 100a29-b23</ref>. Elle ne vise pas la certitude scientifique mais l'art de discuter de manière raisonnable sur toute question. Les ''topoi'' ou lieux sont des schèmes d'argumentation valables dans de multiples domaines. Par exemple, le lieu « du plus et du moins » permet d'argumenter ainsi : si ce qui est plus susceptible d'appartenir à quelque chose ne lui appartient pas, ce qui l'est moins ne lui appartiendra pas non plus<ref>Aristote, ''Topiques'', II, 10, 114b37-115a3</ref>. Aristote recense systématiquement ces lieux et les classe selon les catégories. ==== L'utilité de la dialectique ==== Aristote assigne trois usages à la dialectique. D'abord, elle sert d'entraînement intellectuel, développant la capacité d'argumenter sur n'importe quel sujet. Ensuite, elle est utile dans les rencontres avec autrui, permettant de discuter à partir d'opinions communes. Enfin, et surtout, elle sert aux sciences philosophiques elles-mêmes<ref>Aristote, ''Topiques'', I, 2, 101a25-b4</ref>. En effet, la dialectique permet d'examiner de manière critique (''peirastike'') les principes des sciences, en confrontant les opinions opposées sur un sujet. Elle permet aussi de parcourir les difficultés (''aporiai'') et de dégager progressivement les principes véritables. C'est cette méthode dialectique qu'Aristote met systématiquement en œuvre dans ses traités, commençant par recenser les opinions des prédécesseurs, examinant les difficultés, avant de proposer sa propre solution<ref>Aristote, ''Éthique à Nicomaque'', VII, 1, 1145b2-7</ref>. === Chapitre V : Les ''Réfutations sophistiques'' – Les paralogismes et leur réfutation === ==== Les sophismes et leurs types ==== Les ''Réfutations sophistiques'' complètent les ''Topiques'' en examinant les raisonnements fallacieux utilisés par les sophistes. Aristote distingue treize types de sophismes, dont six dépendent du langage (l'homonymie, l'amphibologie, la composition, la division, l'accentuation, la forme de l'expression) et sept sont indépendants du langage (l'accident, le passage du qualifié à l'absolu, l'ignorance de la réfutation, la pétition de principe, le faux enchaînement, la prise de l'antécédent comme conséquent, la réunion de plusieurs questions en une)<ref>Aristote, ''Réfutations sophistiques'', 4, 165b23-166b19</ref>. L'exemple du sophisme par accident est célèbre : « Coriskos est différent de Socrate / Or Socrate est un homme / Donc Coriskos est différent d'un homme ». Ce raisonnement est vicieux car il confond « être différent de Socrate » et « être différent d'un homme », alors que la première propriété appartient à Coriskos par accident, en tant qu'il se trouve que Socrate est l'homme en question<ref>Aristote, ''Réfutations sophistiques'', 5, 166b28-36</ref>. ==== La portée philosophique de la réfutation des sophismes ==== Au-delà de son utilité pratique pour déjouer les pièges argumentatifs, cette étude des sophismes a une portée philosophique profonde. Elle montre qu'il existe des règles objectives du raisonnement correct, indépendantes de l'habileté rhétorique. Contre le relativisme sophistique, qui prétendait qu'on peut également bien défendre n'importe quelle thèse et son contraire, Aristote établit qu'il y a des critères rationnels pour distinguer le vrai du faux, le raisonnement valide de l'invalide<ref>Aristote, ''Réfutations sophistiques'', 11, 171b34-172a7</ref>. Cette défense de la possibilité d'une vérité objective et d'une rationalité universelle contre le relativisme sophiste constitue l'un des enjeux majeurs de la philosophie aristotélicienne, qui se prolongera dans sa défense du principe de non-contradiction contre ceux qui, comme Héraclite selon Aristote, semblaient le nier<ref>Aristote, ''Métaphysique'', Γ, 3-4, 1005b19-1008b31</ref>. == Deuxième partie : La philosophie de la nature == === Chapitre I : La ''Physique'' – Les principes du mouvement et du changement === ==== La nature comme principe interne de mouvement ==== La physique aristotélicienne n'est pas la physique au sens moderne, science mathématisée des phénomènes matériels. Elle est la science des êtres qui possèdent en eux-mêmes un principe de mouvement et de repos<ref>Aristote, ''Physique'', II, 1, 192b13-23</ref>. Un être naturel (''phusei on'') se distingue ainsi d'un être artificiel : une plante croît et se reproduit par sa propre nature, tandis qu'un lit, fait de bois, ne produit pas naturellement d'autres lits. Cette définition fonde l'autonomie de la nature et de son étude. Les êtres naturels ont leurs principes en eux-mêmes et ne dépendent pas de causes extérieures pour leur mouvement essentiel. C'est pourquoi le physicien doit étudier non seulement la forme des choses, mais aussi leur matière, car la matière est le principe des mouvements naturels<ref>Aristote, ''Physique'', II, 2, 194a12-27</ref>. En cela, Aristote se distingue du platonisme, qui tendait à négliger la matière et à ramener l'explication physique aux formes intelligibles séparées. ==== Les quatre causes ==== Pour comprendre pleinement un être naturel, il faut connaître ses quatre causes. La cause matérielle est ce dont une chose est faite (le bronze est la cause matérielle de la statue). La cause formelle est l'essence ou la définition de la chose (la forme de l'Hermès est la cause formelle de la statue d'Hermès). La cause efficiente est ce qui a produit la chose (le sculpteur est la cause efficiente de la statue). La cause finale est ce en vue de quoi la chose existe (la décoration du temple est la cause finale de la statue)<ref>Aristote, ''Physique'', II, 3, 194b23-195a3</ref>. Ces quatre causes ne s'excluent pas mais se complètent. Souvent même, plusieurs causes coïncident : la forme, le moteur et la fin peuvent être identiques. Dans la génération naturelle d'un homme, c'est la forme d'homme qui est à la fois dans le géniteur (cause efficiente), dans l'engendré (cause formelle), et visée comme fin du processus de génération (cause finale)<ref>Aristote, ''Physique'', II, 7, 198a24-27</ref>. ==== Le mouvement et ses espèces ==== Le mouvement (''kinesis'') ou changement est défini comme « l'actualité de ce qui est en puissance en tant que tel »<ref>Aristote, ''Physique'', III, 1, 201a10-11</ref>. Cette définition énigmatique signifie que le mouvement est l'acte d'un être qui n'est pas encore pleinement actualisé, mais en voie de l'être. C'est un acte imparfait, par opposition à l'acte parfait (''energeia'') qui est l'actualité pleine et achevée d'une chose. Aristote distingue quatre espèces de changement selon les catégories : le changement substantiel (génération et corruption), le changement qualitatif (altération), le changement quantitatif (accroissement et diminution), et le changement local (déplacement ou translation)<ref>Aristote, ''Physique'', V, 1, 225a34-225b9</ref>. Parmi ces changements, le mouvement local est premier en nature et en dignité, car il peut exister sans les autres, tandis que les autres le présupposent<ref>Aristote, ''Physique'', VIII, 7, 260a26-260b7</ref>. ==== L'infinité du mouvement et le Premier Moteur ==== Le mouvement est-il éternel ou a-t-il commencé ? Aristote démontre qu'il doit être éternel, car toute génération du mouvement supposerait un mouvement antérieur<ref>Aristote, ''Physique'', VIII, 1, 251a8-252b6</ref>. Or tout ce qui est mû est mû par autre chose<ref>Aristote, ''Physique'', VII, 1, 241b24-242a15</ref>. Il faut donc, pour éviter une régression à l'infini des moteurs, qu'existe un Premier Moteur absolument immobile qui meut éternellement. Ce Premier Moteur meut sans être mû, à la manière dont l'objet du désir meut le désirant. Il est donc cause finale plutôt qu'efficiente du mouvement éternel du ciel<ref>Aristote, ''Physique'', VIII, 6, 259b20-260a19</ref>. Cette preuve physique du Premier Moteur prépare les développements métaphysiques du livre Λ de la ''Métaphysique'' sur Dieu comme Pensée de la Pensée. === Chapitre II : Le ''De caelo'' – Le ciel et les éléments === ==== La cinquième essence et l'éternité du monde ==== Le traité ''Du ciel'' étudie d'abord le mouvement circulaire du ciel et sa substance. Aristote établit qu'il existe un cinquième élément, l'éther (''aither''), distinct des quatre éléments sublunaires, qui est animé d'un mouvement circulaire naturel et éternel<ref>Aristote, ''Du ciel'', I, 2, 269a2-269b17</ref>. Cette cinquième essence ou quintessence ne connaît ni génération ni corruption, ni accroissement ni diminution, ni altération. Le ciel est donc éternel, sans commencement ni fin. Aristote réfute les cosmogonies qui, comme celle du ''Timée'' de Platon, faisaient naître le monde dans le temps<ref>Aristote, ''Du ciel'', I, 10-12, 279b4-284a35</ref>. Cette thèse de l'éternité du monde entrera en conflit, au Moyen Âge, avec le dogme chrétien de la création ex nihilo, donnant lieu à de subtiles tentatives de conciliation comme celles de Thomas d'Aquin. ==== La structure du cosmos ==== Aristote défend une cosmologie géocentrique. La Terre, sphérique, est immobile au centre de l'univers<ref>Aristote, ''Du ciel'', II, 14, 296b6-297b21</ref>. Autour d'elle se trouvent les sphères concentriques des quatre éléments sublunaires (terre, eau, air, feu), puis les sphères célestes portant les astres. Chaque planète est portée par une sphère animée d'un mouvement circulaire uniforme, et l'ensemble de ces sphères forme un système dont le mouvement est communiqué par le Premier Moteur immobile situé à la périphérie de l'univers<ref>Aristote, ''Du ciel'', II, 12, 292a14-293a11</ref>. Cette cosmologie restera dominante jusqu'à Copernic, Kepler et Galilée. Elle repose sur la distinction ontologique entre monde supralunaire, parfait et immuable, et monde sublunaire, siège de la génération et de la corruption. Cette distinction fondamentale sera ébranlée par la découverte, au début du XVIIe siècle, des taches solaires et de la nature non éthérée des comètes. ==== Les quatre éléments et leurs mouvements naturels ==== Dans le monde sublunaire, les quatre éléments possèdent des mouvements naturels rectilignes. La terre et l'eau, éléments lourds, se dirigent naturellement vers le bas, c'est-à-dire vers le centre de l'univers. L'air et le feu, éléments légers, se dirigent naturellement vers le haut, c'est-à-dire vers la périphérie du monde sublunaire<ref>Aristote, ''Du ciel'', IV, 4, 311a15-312a21</ref>. Ces mouvements naturels expliquent la disposition concentrique des éléments : la terre au centre, recouverte par l'eau, puis l'air, puis le feu. Ils fondent aussi la dynamique aristotélicienne, selon laquelle chaque corps tend naturellement vers son lieu propre avec une vitesse proportionnelle à son poids et inversement proportionnelle à la résistance du milieu<ref>Aristote, ''Du ciel'', I, 8, 277a27-277b8</ref>. Cette physique sera critiquée par la révolution galiléenne, qui montrera que dans le vide tous les corps tombent à la même vitesse. === Chapitre III : Le ''De generatione et corruptione'' – Génération, corruption et transformation === ==== Les deux espèces de génération ==== La génération absolue (''genesis haplôs'') est le passage du non-être à l'être d'une substance : un homme naît. La génération relative (''genesis ti'') est l'altération d'une substance qui demeure : un homme devient musicien<ref>Aristote, ''De la génération et la corruption'', I, 3, 317a17-b18</ref>. Aristote cherche à éviter deux écueils : l'éléatisme de Parménide, qui niait tout devenir parce qu'il serait passage du non-être à l'être, et l'atomisme de Démocrite, qui réduisait toute génération à une simple agrégation d'atomes éternels. La solution réside dans les concepts de matière et de forme. Dans toute génération, quelque chose persiste (la matière) tandis que quelque chose advient (la forme). Dans la génération absolue, la matière première indéterminée reçoit une nouvelle forme substantielle. Dans la génération relative, la substance demeure identique tandis que ses accidents changent<ref>Aristote, ''De la génération et la corruption'', I, 4, 319b6-320a7</ref>. ==== L'action et la passion – Le contact et le mélange ==== Pour qu'il y ait génération, il faut qu'un agent agisse sur un patient. Mais l'action n'est pas séparée de la passion : ce sont deux aspects d'un même changement, considéré tantôt du point de vue de l'agent, tantôt de celui du patient<ref>Aristote, ''De la génération et la corruption'', I, 7, 323b18-324a19</ref>. Le mélange (''mixis'') se distingue de la simple juxtaposition par le fait que les composants, tout en formant un nouveau corps homogène, peuvent être restitués par analyse. Aristote critique l'atomisme qui ramène le mélange à un simple entrelacement d'atomes indivisibles : si les composants demeuraient inchangés, il n'y aurait pas véritable mélange mais juxtaposition<ref>Aristote, ''De la génération et la corruption'', I, 10, 327a30-328a5</ref>. Dans le véritable mélange, les qualités des composants s'unissent pour former une nouvelle qualité intermédiaire. === Chapitre IV : Les ''Météorologiques'' – Les phénomènes du monde sublunaire === ==== Le programme de la science naturelle ==== Les ''Météorologiques'' s'insèrent dans le vaste programme de la physique aristotélicienne. Après avoir traité des principes du mouvement dans la ''Physique'', de la structure de l'univers dans le ''De caelo'', et des transformations des éléments dans le ''De generatione'', Aristote étudie maintenant les phénomènes qui résultent de l'action du ciel sur le monde sublunaire<ref>Aristote, ''Météorologiques'', I, 1, 338a20-339a5</ref>. Le terme « météorologique » a ici un sens beaucoup plus large qu'aujourd'hui. Il désigne tous les phénomènes qui se produisent dans la région entre la surface de la terre et la sphère de la lune : non seulement les phénomènes atmosphériques (pluie, vent, tonnerre), mais aussi les comètes, la Voie Lactée, les tremblements de terre, la mer et ses marées, les fleuves et leurs crues, etc. ==== Les deux exhalaisons et l'explication des météores ==== Le principe explicatif fondamental est celui des deux exhalaisons. Le soleil, par son mouvement et sa chaleur, produit deux sortes d'évaporations terrestres : une exhalaison humide (vapeur d'eau) et une exhalaison sèche (exhalations terrestres combustibles)<ref>Aristote, ''Météorologiques'', I, 3, 340b19-341a12</ref>. Ces deux exhalaisons, s'élevant dans l'atmosphère, donnent naissance à la plupart des phénomènes météorologiques. L'exhalaison humide, refroidie dans les régions supérieures, retombe en pluie. L'exhalaison sèche, enflammée au contact de la sphère du feu, produit les phénomènes ignés : étoiles filantes, comètes, Voie Lactée<ref>Aristote, ''Météorologiques'', I, 4-8, 341b6-346a34</ref>. Ces explications, souvent fausses, témoignent néanmoins d'une démarche rationnelle qui cherche à rendre compte des phénomènes par des causes naturelles, sans recourir au mythe ou au surnaturel. === Chapitre V : Le ''De anima'' – L'âme, forme du corps vivant === ==== Définition de l'âme ==== Le traité ''De l'âme'' appartient à la fois à la physique, puisque l'âme est principe de mouvement du corps vivant, et à ce que nous appellerions aujourd'hui psychologie ou philosophie de l'esprit. Après avoir réfuté les conceptions de ses prédécesseurs, Aristote définit l'âme comme « l'entéléchie première d'un corps naturel ayant la vie en puissance »<ref>Aristote, ''De l'âme'', II, 1, 412a27-28</ref>. Cette définition signifie que l'âme est la forme du corps vivant, son acte premier, principe de toutes ses opérations vitales. Elle n'est ni une substance séparée qui habiterait le corps comme un pilote dans son navire (critique du dualisme platonicien), ni une simple harmonie ou arrangement du corps (critique du matérialisme), mais la forme substantielle indissociable de son corps propre<ref>Aristote, ''De l'âme'', II, 1, 413a3-10</ref>. ==== Les trois âmes et leurs facultés ==== Il y a trois niveaux d'âme, correspondant aux trois types de vivants. L'âme nutritive, commune à tous les vivants (plantes, animaux, hommes), assure les fonctions de nutrition, croissance et reproduction. L'âme sensitive, propre aux animaux, ajoute la sensation, le désir et le mouvement local. L'âme intellective, propre à l'homme, ajoute la pensée rationnelle<ref>Aristote, ''De l'âme'', II, 2-3, 413a20-414b28</ref>. Ces trois âmes ne sont pas trois substances séparées dans le vivant, mais trois niveaux de capacités, les supérieures incluant les inférieures. Un animal possède toutes les capacités de la plante plus les siennes propres ; l'homme possède celles de la plante et de l'animal plus l'intelligence. ==== La sensation et l'intellection ==== La sensation est la réception de la forme sensible sans la matière, comme la cire reçoit l'empreinte du sceau sans recevoir le fer ou l'or dont il est fait<ref>Aristote, ''De l'âme'', II, 12, 424a17-21</ref>. Chaque sens a son objet propre (la couleur pour la vue, le son pour l'ouïe), qu'il perçoit infailliblement. Il existe aussi un sens commun qui perçoit les sensibles communs (mouvement, repos, nombre, figure) et permet de comparer les données de différents sens<ref>Aristote, ''De l'âme'', III, 1-2, 425a13-427a16</ref>. L'intellect (''nous'') est la faculté de penser les formes intelligibles. Aristote distingue l'intellect patient, qui reçoit les formes, et l'intellect agent, qui les abstrait à partir des images sensibles<ref>Aristote, ''De l'âme'', III, 5, 430a10-25</ref>. Ce dernier est séparé, impassible, sans mélange avec le corps, et Aristote suggère qu'il pourrait être immortel, bien que cette thèse reste obscure et ait donné lieu à d'innombrables controverses dans la tradition commentatoriale arabe et latine. === Chapitre VI : Les ''Parva Naturalia'' – Les fonctions vitales === ==== Organisation et contenu des Petits traités d'histoire naturelle ==== Les ''Parva Naturalia'' regroupent un ensemble de courts traités sur diverses fonctions vitales et leurs organes. Ils complètent le ''De anima'' en étudiant non plus l'âme en général mais ses opérations particulières, considérées dans leur rapport au corps<ref>Aristote, ''De la sensation'', 1, 436a1-17</ref>. Le ''De sensu'' traite des sensibles et des organes des sens. Le ''De memoria'' examine la mémoire et la réminiscence, faculté de retrouver volontairement un souvenir. Le ''De somno'' et le ''De insomniis'' étudient le sommeil et les rêves, expliqués par les mouvements qui persistent dans les organes sensoriels après la disparition des stimuli externes<ref>Aristote, ''Du sommeil'', 2, 455a12-455b2</ref>. Le ''De divinatione'' traite de la divination dans les songes, dont Aristote nie la valeur prophétique, y voyant de simples coïncidences. ==== Le cœur, principe de la vie ==== Aristote localise le principe vital et le sens commun dans le cœur plutôt que dans le cerveau<ref>Aristote, ''Des parties des animaux'', III, 4, 666a11-18</ref>. C'est dans le cœur que réside la chaleur innée, principe de toutes les opérations vitales. Le cerveau, froid et humide, sert seulement à refroidir la chaleur excessive du cœur<ref>Aristote, ''Des parties des animaux'', II, 7, 652a24-652b34</ref>. Cette erreur anatomique, que Galien corrigera partiellement en reconnaissant au cerveau un rôle dans les sensations et les mouvements volontaires, illustre les limites de la science aristotélicienne, tributaire des moyens techniques de son époque. Elle n'enlève rien à la valeur de la démarche méthodologique d'Aristote, qui cherche à expliquer les phénomènes vitaux par des causes naturelles observables. == Troisième partie : La biologie et la connaissance du vivant == === Chapitre I : L'''Histoire des animaux'' – L'enquête empirique === ==== Méthode et organisation de l'œuvre ==== L'''Histoire des animaux'' (''Peri ta zôia historiai''), en dix livres dont trois sont probablement apocryphes, constitue un immense travail de collection et de description des faits concernant les animaux<ref>Aristote, ''Histoire des animaux'', I, 6, 491a7-14</ref>. Le terme ''historia'' signifie ici « enquête » ou « recherche », non pas histoire au sens temporel. Il s'agit d'un exposé systématique des données empiriques qui servira de fondement aux explications causales développées dans les autres traités biologiques. Aristote y décrit avec une précision remarquable l'anatomie externe et interne, le mode de reproduction, le régime alimentaire, les habitats, les comportements de plusieurs centaines d'espèces animales. Cette œuvre témoigne d'observations personnelles minutieuses, complétées par des témoignages de pêcheurs, chasseurs et éleveurs. C'est le premier grand ouvrage de zoologie systématique de l'histoire occidentale<ref>D'Arcy Wentworth Thompson, introduction à sa traduction de l'''Histoire des animaux'', Oxford, 1910</ref>. ==== Principes de classification ==== Aristote organise les animaux selon une classification qui prend en compte de multiples critères : mode de reproduction (vivipares, ovipares, larvipares), habitat (terrestres, aquatiques, aériens), régime alimentaire (carnivores, herbivores), présence ou absence de sang<ref>Aristote, ''Histoire des animaux'', I, 6, 490b7-491a6</ref>. La division fondamentale oppose les animaux sanguins (en gros, les vertébrés) et les animaux non-sanguins (les invertébrés). Contrairement à une idée reçue, Aristote ne se contente pas d'une classification dichotomique rigide. Il reconnaît que les espèces forment un continuum, avec des formes intermédiaires qui rendent difficile le tracé de frontières nettes. Ainsi, les éponges occupent-elles une position intermédiaire entre les plantes et les animaux<ref>Aristote, ''Histoire des animaux'', I, 1, 487b6-10</ref>. Cette intuition d'une scala naturae, d'une échelle de la nature, influencera durablement la pensée biologique jusqu'à Lamarck et Darwin. === Chapitre II : Les ''Parties des animaux'' – La causalité finale dans le vivant === ==== Méthode de la biologie : de la description à l'explication ==== Le traité ''Des parties des animaux'' se propose d'expliquer pourquoi les animaux possèdent telles parties avec telles configurations. Après l'''Historia'', qui répond à la question « qu'est-ce qui est ? », vient l'étude qui répond à « pourquoi est-ce ainsi ? »<ref>Aristote, ''Des parties des animaux'', I, 1, 639b7-640a9</ref>. Le livre I constitue un véritable traité de méthodologie scientifique. Aristote y défend la légitimité de l'étude de la nature, même si celle-ci n'atteint pas la dignité des réalités éternelles. Il affirme qu'« il faut étudier chaque être sans dégoût, car en chacun réside quelque chose de naturel et de beau »<ref>Aristote, ''Des parties des animaux'', I, 5, 645a15-17</ref>. Cette célébration de la beauté et de l'ordre de la nature, même dans ses manifestations les plus humbles, exprime l'émerveillement du savant devant l'infinie diversité du vivant. ==== La priorité de la cause finale ==== Dans l'étude des vivants, la cause finale doit primer. C'est en vue d'une fonction déterminée que chaque organe est configuré d'une certaine manière. Les dents de devant sont tranchantes pour couper, les molaires larges et plates pour broyer, non par hasard, mais parce que telle est leur fonction dans la nutrition<ref>Aristote, ''Des parties des animaux'', III, 1, 661b23-662a8</ref>. Aristote critique vigoureusement le mécanisme d'Empédocle et des atomistes, qui expliquaient les organes par des rencontres fortuites de particules matérielles. Comment le hasard pourrait-il produire la régularité observée dans la nature, où chaque espèce reproduit invariablement la même organisation ? La matière joue certes un rôle, par ses propriétés et ses nécessités, mais elle est toujours au service de la forme et de la fin<ref>Aristote, ''Des parties des animaux'', I, 1, 639b11-640a9</ref>. ==== L'unité fonctionnelle de l'organisme ==== Chaque animal forme une totalité organisée dont toutes les parties coopèrent en vue de la vie de l'ensemble. Les poumons existent en vue de la respiration, qui existe en vue du refroidissement du cœur, qui existe en vue de la vie de l'animal. Réciproquement, la possession de poumons impose certaines autres caractéristiques : un animal pourvu de poumons doit avoir un sang et un cœur, doit respirer, donc doit avoir des voies aériennes, etc.<ref>Aristote, ''Des parties des animaux'', III, 6, 668b33-669a13</ref> Cette conception systémique de l'organisme, où chaque partie trouve sa raison d'être dans sa contribution au tout, annonce certaines perspectives de la biologie moderne, notamment l'approche fonctionnaliste. Elle fonde aussi la possibilité d'une connaissance rationnelle du vivant : malgré la complexité quasi infinie des formes de vie, on peut les comprendre en dégageant les rapports fonctionnels entre les parties et le tout. === Chapitre III : La ''Génération des animaux'' – Reproduction et hérédité === ==== Les modes de reproduction ==== Le traité ''De la génération des animaux'' étudie la reproduction sexuée et asexuée, la formation de l'embryon, l'hérédité. Aristote distingue plusieurs modes de génération : par accouplement (la plupart des animaux), par génération spontanée (certains insectes, les anguilles qu'on croyait naître de la vase), par bourgeonnement (certaines plantes)<ref>Aristote, ''De la génération des animaux'', I, 1, 715a1-18</ref>. Dans la génération sexuée, le mâle apporte la forme et le principe du mouvement (la semence), tandis que la femelle apporte la matière (les menstrues chez les vivipares, l'œuf chez les ovipares)<ref>Aristote, ''De la génération des animaux'', I, 20, 729a9-b21</ref>. Cette théorie, qui reflète les préjugés androcentrés de l'époque, dénie à la femelle tout rôle actif dans la génération, la réduisant à fournir le substrat matériel informé par la semence mâle. ==== L'embryogenèse et la formation des parties ==== Aristote décrit avec précision le développement de l'embryon de poulet, qu'il a observé en ouvrant des œufs à différents stades d'incubation. Il voit d'abord se former le cœur, qui bat dès le troisième jour, puis progressivement les autres organes<ref>Aristote, ''Histoire des animaux'', VI, 3, 561a4-561b13</ref>. Cette description remarquable fonde la conception épigénétique de l'embryologie : l'embryon se construit progressivement, par différenciation graduelle, et non par simple croissance d'un organisme préformé miniature. La cause de cette différenciation progressive est la chaleur vitale contenue dans la semence, qui cuit et façonne la matière menstruelle comme le présure fait cailler le lait<ref>Aristote, ''De la génération des animaux'', II, 4, 739b20-740a4</ref>. Ce processus n'est pas mécanique mais finalisé : c'est en vue de telle forme déterminée (l'homme adulte, le poulet adulte) que les parties se forment dans tel ordre et avec telles caractéristiques. ==== L'hérédité et la ressemblance ==== Pourquoi les enfants ressemblent-ils à leurs parents ? Pourquoi parfois ressemblent-ils plutôt aux grands-parents ou à des ancêtres plus lointains ? Aristote explique ces phénomènes par le plus ou moins grand degré de cuisson et de maîtrise qu'exerce la semence mâle sur la matière femelle. Si la cuisson est parfaite, l'enfant ressemble au père ; si elle est un peu moins parfaite, il ressemble à la mère ; si elle l'est encore moins, aux grands-parents, etc.<ref>Aristote, ''De la génération des animaux'', IV, 3, 767b15-768a14</ref> Ces explications, bien que rudimentaires et souvent erronées dans le détail, témoignent d'un effort remarquable pour rendre compte rationnellement de phénomènes que d'autres cultures expliquaient par l'intervention divine ou la magie. Aristote pose les questions fondamentales de la biologie (qu'est-ce que la vie ? comment les formes se transmettent-elles ? pourquoi existe-t-il une telle diversité d'espèces ?) et invente des méthodes pour y répondre, même si les réponses devront être révisées par la science ultérieure. === Chapitre IV : Le ''De motu animalium'' et le ''De incessu animalium'' – Le mouvement animal === ==== Le principe du mouvement volontaire ==== Le ''De motu animalium'' examine comment les animaux se meuvent localement par eux-mêmes. Aristote établit qu'un animal ne peut se mouvoir que s'il s'appuie sur quelque chose d'immobile : de même qu'on ne peut pousser un bateau depuis l'intérieur du bateau, l'animal doit prendre appui sur le sol, l'eau ou l'air pour se déplacer<ref>Aristote, ''Du mouvement des animaux'', 2, 698b7-699a11</ref>. Le principe moteur interne est le désir, excité par la sensation ou l'imagination d'un objet désirable. Le désir entraîne un réchauffement dans la région du cœur, qui se communique aux membres et produit leur contraction ou extension<ref>Aristote, ''Du mouvement des animaux'', 10, 703a4-b2</ref>. Ainsi, le mouvement animal, bien que produit de l'intérieur, a toujours une cause finale externe : l'objet désiré qui meut sans être mû, comme le Premier Moteur meut le ciel. ==== Les modes de locomotion ==== Le ''De incessu animalium'' décrit et explique les différents modes de locomotion : marche, course, vol, nage. Aristote établit des lois générales : les animaux sanguins ne peuvent avoir plus de quatre points d'appui, car la nature ne fait rien en vain, et quatre suffisent à assurer la stabilité<ref>Aristote, ''De la marche des animaux'', 8, 708a9-708b9</ref>. Les oiseaux ont des ailes parce qu'ils ont le corps léger et la poitrine large et musculeuse, configurations qui rendent le vol possible<ref>Aristote, ''De la marche des animaux'', 10, 710a10-710b7</ref>. Ces études, qui mêlent observations précises et raisonnements mécaniques, relèvent de ce que nous appellerions aujourd'hui biomécanique. Elles montrent qu'Aristote ne se contente pas de contempler les formes vivantes, mais cherche à en expliquer le fonctionnement par des causes physiques vérifiables, sans abandonner toutefois le cadre téléologique général qui voit partout dans la nature l'action providentielle d'une finalité immanente. == Quatrième partie : La philosophie première ou métaphysique == === Chapitre I : Objet et divisions de la métaphysique === ==== La science de l'être en tant qu'être ==== La métaphysique, qu'Aristote nomme « philosophie première » ou « sagesse », est définie comme la science de l'être en tant qu'être (''on hêi on'') et de ce qui lui appartient essentiellement<ref>Aristote, ''Métaphysique'', Γ, 1, 1003a21-22</ref>. Cette formulation distingue la métaphysique de toutes les sciences particulières. Celles-ci étudient une partie ou un aspect de l'être : la géométrie étudie l'être en tant que continu, la biologie l'être en tant que vivant. Seule la métaphysique considère l'être dans sa totalité et sa généralité, recherchant ce qui appartient à tout être du seul fait qu'il est. Cette science est « première » en deux sens : elle porte sur ce qui est premier dans l'ordre de l'être (les principes et causes premiers), et elle fonde toutes les autres sciences en étudiant les principes communs à toutes, comme le principe de non-contradiction<ref>Aristote, ''Métaphysique'', Γ, 3, 1005a19-b8</ref>. Elle est aussi la plus divine des sciences, car elle porte sur ce qu'il y a de plus divin, Dieu comme Premier Moteur immobile<ref>Aristote, ''Métaphysique'', Α, 2, 983a5-10</ref>. ==== La question de l'unité de la métaphysique ==== Comment la métaphysique peut-elle être à la fois ontologie générale, étude de l'être en tant qu'être, et théologie, étude d'un être particulier, Dieu ? Cette apparente tension a donné lieu à deux interprétations dans l'histoire de la philosophie. Pour certains, il y aurait deux métaphysiques chez Aristote, l'une générale, l'autre spéciale, maladroitement juxtaposées. Pour d'autres, dont Thomas d'Aquin<ref>Thomas d'Aquin, ''In Metaphysicam Aristotelis Commentaria'', Prooemium</ref>, l'unité est assurée par le fait que Dieu est principe de tout être, de sorte qu'en étudiant Dieu on étudie la cause première de tout ce qui est. Une troisième solution reconnaît que l'être se dit en plusieurs sens (substance, qualité, quantité, etc.), mais que tous ces sens se rapportent à un sens premier, la substance. Et parmi les substances, la substance divine est première. Ainsi, la métaphysique étudie-t-elle l'être en étudiant ce qui est premier dans l'être : la substance, et plus particulièrement la substance immobile séparée<ref>Aristote, ''Métaphysique'', Ε, 1, 1026a23-32</ref>. ==== Les apories de la métaphysique ==== Le livre Β de la ''Métaphysique'' expose méthodiquement les apories, les difficultés que rencontre toute tentative de construire une science de l'être et des principes premiers. Y a-t-il une science unique de toutes les causes, ou plusieurs sciences ? La science de l'être porte-t-elle aussi sur les principes de la démonstration ? Y a-t-il seulement des substances sensibles, ou existe-t-il aussi des substances séparées immobiles ? Les principes sont-ils universels ou particuliers ? Sont-ils en acte ou en puissance ?<ref>Aristote, ''Métaphysique'', Β, 1, 995b4-996a17</ref> Cette méthode aporétique, qui consiste à commencer par rassembler les difficultés et à examiner les arguments dans les deux sens avant de proposer une solution, est caractéristique de la démarche aristotélicienne. Elle empêche le dogmatisme et oblige à prendre en compte toute la complexité des problèmes. « Il faut, pour bien rechercher, avoir auparavant développé les apories »<ref>Aristote, ''Métaphysique'', Β, 1, 995a24-27</ref>. === Chapitre II : La substance (livres Z-H) === ==== Qu'est-ce que la substance ? ==== Si l'être se dit en plusieurs sens, et si la substance est le sens premier de l'être, la question centrale de la métaphysique devient : qu'est-ce que la substance (''ousia'') ?<ref>Aristote, ''Métaphysique'', Ζ, 1, 1028a10-1028b2</ref> Quatre candidats se présentent : l'essence (''to ti ên einai''), l'universel (''to katholou''), le genre (''to genos''), et le substrat (''to hupokeimenon''). Ce dernier peut être entendu en trois sens : la matière, la forme, ou le composé des deux. Aristote élimine d'abord l'universel et le genre comme candidats à la substantialité. Ils ne peuvent être substances parce qu'ils se prédiquent de plusieurs choses, alors que la substance de chaque chose lui est propre<ref>Aristote, ''Métaphysique'', Ζ, 13, 1038b8-16</ref>. Cette exclusion vise clairement la théorie platonicienne des Idées, qui faisait de l'Homme en soi, universel, la véritable substance dont les hommes particuliers n'étaient que des copies. ==== La forme, substance première ==== Le substrat a plus de titres à être appelé substance, puisqu'il est ce dont tout le reste se dit. Mais si l'on identifiait la substance à la matière pure, support ultime de toutes les déterminations, on aboutirait au paradoxe qu'une substance pourrait exister sans aucune détermination, ce qui est absurde<ref>Aristote, ''Métaphysique'', Ζ, 3, 1029a10-26</ref>. C'est donc la forme (''morphê'', ''eidos'') qui est substance au sens le plus propre. La forme est ce qui fait qu'une chose est ce qu'elle est, son essence. Elle est aussi acte (''energeia'') par opposition à la matière qui est puissance (''dynamis''). Un morceau d'airain est en puissance une statue ; quand le sculpteur lui a donné la forme de l'Hermès, il est en acte une statue. La forme actualise la matière et lui confère l'être déterminé<ref>Aristote, ''Métaphysique'', Η, 2, 1042b9-1043a28</ref>. ==== Le composé de matière et de forme ==== La substance concrète, l'individu réel, n'est ni la matière seule ni la forme seule, mais leur composé (''synolon''). Callias n'est ni simplement de la chair et des os, ni simplement la forme de l'homme, mais cet homme-ci composé de cette chair-ci et de ces os-ci structurés selon la forme humaine<ref>Aristote, ''Métaphysique'', Ζ, 10, 1035b14-27</ref>. Toutefois, la forme demeure première en un sens, car c'est elle qui confère l'unité au composé. Sans la forme, la matière ne serait qu'un amas d'éléments disparates. C'est l'âme, forme du corps vivant, qui fait que ce corps est un organisme uni et non un simple agrégat. Dans l'ordre de la connaissance aussi, c'est par la forme qu'on définit et connaît la substance : on définit l'homme par sa forme (animal rationnel), non par sa matière (chair et os)<ref>Aristote, ''Métaphysique'', Ζ, 11, 1037a21-33</ref>. === Chapitre III : Puissance et acte (livre Θ) === ==== La distinction de la puissance et de l'acte ==== La distinction entre puissance (''dynamis'') et acte (''energeia'', ''entelecheia'') est l'une des contributions majeures d'Aristote à la philosophie. Elle permet de résoudre les apories de Parménide et de Platon concernant le devenir et la participation. Comment une chose peut-elle devenir ce qu'elle n'est pas ? En étant en puissance ce qu'elle devient en acte. Le bronze n'est pas une statue, mais il est en puissance une statue, de sorte qu'il peut le devenir sans passer du non-être à l'être<ref>Aristote, ''Métaphysique'', Θ, 6, 1048a30-1048b17</ref>. Une chose en puissance n'a pas encore telle propriété, mais elle a la capacité de l'acquérir. La capacité n'est ni l'absence pure (le bronze ne peut pas devenir homme), ni la présence actuelle (ce qui est actuellement chaud n'a plus la capacité de le devenir). Elle est un mode d'être intermédiaire<ref>Aristote, ''Métaphysique'', Θ, 7, 1049a1-18</ref>. ==== La priorité de l'acte sur la puissance ==== Aristote établit que l'acte est antérieur à la puissance en plusieurs sens. Dans l'ordre de la définition, car on définit la puissance par l'acte correspondant (ce qui peut voir est ce qui peut exercer l'acte de la vision). Dans l'ordre de la connaissance, car on connaît la puissance en connaissant son actualisation. Dans l'ordre de l'essence et du temps, car l'acte est la fin de la puissance<ref>Aristote, ''Métaphysique'', Θ, 8, 1049b10-1050a3</ref>. Plus profondément encore, ce qui est éternellement en acte est antérieur à ce qui peut être tantôt en acte, tantôt en puissance. Or les substances divines sont éternellement en acte, tandis que les substances sensibles passent de la puissance à l'acte et de l'acte à la puissance. Les substances immobiles éternelles sont donc absolument premières<ref>Aristote, ''Métaphysique'', Θ, 8, 1050b6-28</ref>. Ce raisonnement fonde métaphysiquement la primauté de la théologie dans la philosophie première. === Chapitre IV : L'Un et le Multiple (livres I-K) === ==== L'un se dit en plusieurs sens ==== Parallèlement à l'être, l'un aussi se dit en plusieurs sens. Il y a l'un par accident (le musicien et l'homme sont un quand le musicien est homme). Il y a l'un par soi, qui se divise en un par continuité (une route), un par indivisibilité en espèce (tout homme est un par l'espèce), un par le concept et la définition (être et un sont convertibles)<ref>Aristote, ''Métaphysique'', Ι, 1, 1052a15-1052b14</ref>. Les pythagoriciens et Platon avaient fait de l'Un un principe suprême, antérieur même à l'être. Aristote critique cette position : l'un n'est pas une substance séparée, mais une propriété convertible avec l'être<ref>Aristote, ''Métaphysique'', Ι, 2, 1053b16-1054a13</ref>. Dire qu'une chose est et dire qu'elle est une, c'est la même chose. L'un n'ajoute rien à l'être, il exprime simplement son indivisibilité. ==== La pluralité et le nombre ==== La pluralité s'oppose à l'un comme le divisible à l'indivisible. Le nombre est une pluralité mesurée par l'un<ref>Aristote, ''Métaphysique'', Ι, 1, 1053a18-24</ref>. Mais qu'est-ce que cette unité qui mesure ? Dans les nombres arithmétiques, c'est l'unité absolument indivisible. Dans les choses sensibles, c'est une unité relative à un genre : pour mesurer des longueurs, on prend une longueur comme unité ; pour mesurer des poids, un poids. Cette analyse du nombre et de la mesure fonde la possibilité des mathématiques et des sciences quantitatives. Elle montre aussi qu'il ne peut y avoir de science mathématique absolument universelle, puisque chaque genre de grandeur requiert sa propre unité de mesure. === Chapitre V : Le Premier Moteur immobile (livre Λ) === ==== La démonstration de l'existence du Premier Moteur ==== Le livre Λ de la ''Métaphysique'' constitue le sommet de la philosophie première aristotélicienne. Après avoir établi que les substances sont premières parmi les êtres, Aristote examine quelles substances existent. Il y a évidemment les substances sensibles, soumises au changement. Mais existe-t-il aussi une substance éternelle immobile ?<ref>Aristote, ''Métaphysique'', Λ, 6, 1071b3-5</ref> La démonstration procède à partir du mouvement. Il existe du mouvement, cela est manifeste. Or tout ce qui est mû est mû par autre chose. Ou bien il y a un premier moteur immobile, ou bien la série des moteurs remonte à l'infini. Mais une série infinie de causes ne peut rien expliquer, car en l'absence d'un premier il n'y aurait ni intermédiaire ni dernier<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a19-1072b4</ref>. Il doit donc exister un premier moteur qui meut sans être mû. ==== La nature du Premier Moteur ==== Ce Premier Moteur est substance, acte pur, éternel, sans parties, sans grandeur. Il meut comme objet de désir et d'intellection : l'intellect désire le bien et se meut vers lui. Le Premier Moteur, étant le bien suprême et l'intelligible suprême, attire vers lui le premier ciel qui l'imite par son mouvement circulaire éternel<ref>Aristote, ''Métaphysique'', Λ, 7, 1072a23-1072b4</ref>. Quelle est la vie de ce Premier Moteur ? Il est Pensée, mais que pense-t-il ? Il doit penser ce qu'il y a de plus excellent, donc lui-même. Il est donc Pensée de la Pensée (''noêsis noêseôs noêsis''), intellection qui se pense elle-même dans une contemplation éternellement bienheureuse<ref>Aristote, ''Métaphysique'', Λ, 9, 1074b33-35</ref>. Cette vie divine est la plus haute qui soit, et la vie philosophique est bienheureuse dans la mesure où elle participe à cette activité contemplative. ==== Les moteurs des sphères ==== Le mouvement complexe des astres requiert, outre le Premier Moteur qui meut la sphère des fixes, une pluralité de moteurs immobiles pour les sphères des planètes. Aristote, se fondant sur l'astronomie d'Eudoxe et de Callippe, compte cinquante-cinq sphères, donc cinquante-cinq moteurs<ref>Aristote, ''Métaphysique'', Λ, 8, 1073a14-1074b14</ref>. Ces moteurs ne sont pas subordonnés les uns aux autres comme dans une hiérarchie, mais chacun meut directement sa sphère. Cette prolifération de dieux cosmiques, nécessaire pour sauver les phénomènes astronomiques, contredit-elle le monothéisme du Premier Moteur unique ? La tradition péripatéticienne et la scolastique médiévale tenteront de concilier l'unité divine avec la pluralité des intelligences motrices, en faisant de celles-ci des substances secondes subordonnées au Premier Moteur. === Chapitre VI : Critique de la théorie platonicienne des Idées (livres M-N) === ==== Les arguments contre les Idées séparées ==== Les livres M et N de la ''Métaphysique'' reprennent et développent la critique de la théorie platonicienne des Idées, déjà amorcée dans le livre A. Aristote reconnaît à Platon le mérite d'avoir affirmé l'existence de réalités intelligibles éternelles, condition de toute science. Mais il lui reproche d'avoir séparé ces formes intelligibles des choses sensibles et d'en avoir fait des substances subsistant par elles-mêmes<ref>Aristote, ''Métaphysique'', Μ, 4-5, 1078b7-1080a8</ref>. Cette séparation est inutile et impossible. Inutile, car les Idées ne servent ni à la connaissance des sensibles (puisqu'elles sont séparées d'eux), ni à leur existence (puisqu'elles ne sont pas en eux), ni à leur devenir (puisqu'elles sont immobiles)<ref>Aristote, ''Métaphysique'', Α, 9, 991a8-991b9</ref>. Impossible, car elle conduit à des apories insolubles, comme l'argument du Troisième Homme : si Socrate ressemble à l'Homme en soi, il faut une troisième Idée pour fonder cette ressemblance, et ainsi à l'infini<ref>Aristote, ''Métaphysique'', Α, 9, 990b17-991a8</ref>. ==== Le statut des êtres mathématiques ==== Platon situait les êtres mathématiques (nombres, figures) dans un plan intermédiaire entre les Idées et les sensibles. Aristote refuse cette ontologie tripartite. Les objets mathématiques n'existent pas séparément, mais par abstraction<ref>Aristote, ''Métaphysique'', Μ, 3, 1078a21-31</ref>. Le mathématicien considère les sensibles non en tant que sensibles mais en tant que continus ou quantifiés, faisant abstraction de leurs autres propriétés. Il n'étudie pas des êtres qui existeraient dans un monde séparé, mais des aspects abstraits des êtres sensibles. Cette solution préserve l'objectivité des mathématiques sans multiplier les êtres. Les vérités mathématiques sont nécessaires et universelles parce qu'elles portent sur des propriétés que les choses sensibles possèdent nécessairement, même si ces propriétés ne sont jamais réalisées dans les sensibles avec la perfection qu'étudie le mathématicien<ref>Aristote, ''Métaphysique'', Μ, 2, 1077a9-1077b17</ref>. == Cinquième partie : La philosophie pratique == === Chapitre I : L'''Éthique à Nicomaque'' – La vie bonne === ==== Le souverain bien et le bonheur ==== L'''Éthique à Nicomaque'' s'ouvre sur l'affirmation que toute action et toute recherche vise un bien. Parmi les biens, il y en a un qui est visé pour lui-même et en vue duquel tous les autres sont poursuivis : c'est le souverain bien, que tous appellent bonheur (''eudaimonia'')<ref>Aristote, ''Éthique à Nicomaque'', I, 4, 1095a14-26</ref>. Mais en quoi consiste le bonheur ? Les hommes en donnent des définitions différentes : le plaisir, les honneurs, la richesse. Pour déterminer le bonheur véritable, Aristote recourt à la notion de fonction (''ergon'') : le bien pour chaque être réside dans l'accomplissement de sa fonction propre. La fonction propre de l'homme est l'activité de l'âme rationnelle selon l'excellence. Le bonheur est donc « une activité de l'âme selon la vertu parfaite, dans une vie complète »<ref>Aristote, ''Éthique à Nicomaque'', I, 7, 1098a16-18</ref>. ==== Les vertus éthiques et la doctrine du juste milieu ==== Aristote distingue les vertus intellectuelles (sagesse théorique, prudence) des vertus éthiques ou morales (courage, tempérance, justice). Les vertus morales sont des dispositions acquises par l'habitude à choisir le juste milieu entre deux extrêmes vicieux<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1106b36-1107a2</ref>. Ainsi, le courage est le juste milieu entre la lâcheté (défaut de crainte) et la témérité (excès d'audace). La tempérance est le milieu entre l'insensibilité et l'intempérance. La libéralité est le milieu entre l'avarice et la prodigalité<ref>Aristote, ''Éthique à Nicomaque'', II, 7, 1107a33-1108b10</ref>. Ce milieu n'est pas arithmétique mais relatif à nous : il dépend des circonstances et de l'agent. Toute l'œuvre de la vertu consiste à trouver ce milieu, guidée par la droite raison (''orthos logos'') qu'incarne la prudence<ref>Aristote, ''Éthique à Nicomaque'', II, 6, 1107a1-2</ref>. Cette doctrine du juste milieu a connu une fortune considérable, devenant l'un des principes les plus populaires de la philosophie morale. Elle exprime une sagesse pratique qui fuit les extrêmes et recherche l'équilibre, tout en reconnaissant la complexité du jugement moral qui doit tenir compte de la situation concrète. ==== L'amitié ==== Les livres VIII et IX de l'''Éthique à Nicomaque'' traitent de l'amitié (''philia''), vertu sociale essentielle. Aristote distingue trois espèces d'amitié : l'amitié utile, fondée sur l'intérêt réciproque ; l'amitié agréable, fondée sur le plaisir ; et l'amitié parfaite, celle des hommes vertueux qui s'aiment pour eux-mêmes<ref>Aristote, ''Éthique à Nicomaque'', VIII, 3, 1156a6-1156b7</ref>. Seule la dernière est véritablement amitié, car elle est durable et réciproque. Les deux premières sont instables, car elles cessent quand cesse l'utilité ou le plaisir. L'amitié parfaite requiert du temps et de l'intimité : on ne peut être ami de beaucoup, car l'amitié véritable exige une vie partagée<ref>Aristote, ''Éthique à Nicomaque'', VIII, 6, 1158a10-15</ref>. L'amitié n'est pas seulement agréable, elle est nécessaire à la vie bonne. L'homme est un animal politique qui ne peut s'accomplir dans l'isolement. L'ami est un autre soi-même : en conversant avec lui, en partageant ses joies et ses peines, nous nous connaissons et nous accomplissons nous-mêmes<ref>Aristote, ''Éthique à Nicomaque'', IX, 9, 1169b16-1170a4</ref>. ==== La vie contemplative ==== Le livre X couronne l'éthique en montrant que le bonheur suprême réside dans la vie contemplative. L'activité théorétique de l'intellect est la plus haute et la plus autosuffisante. Elle nous apparente aux dieux, qui passent l'éternité dans la contemplation<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177a12-18</ref>. Certes, cette vie purement intellectuelle dépasse les forces humaines prises isolément. Mais dans la mesure où il y a en nous quelque chose de divin, l'intellect, nous devons tendre vers cette vie divine<ref>Aristote, ''Éthique à Nicomaque'', X, 7, 1177b30-34</ref>. La vie selon les vertus morales est bonne et humaine, mais la vie selon l'intellect est divine. Le sage qui la mène est le plus heureux des hommes, celui que les dieux aiment le plus. === Chapitre II : Les ''Politiques'' – La cité et les constitutions === ==== L'homme, animal politique ==== Les ''Politiques'' commencent par affirmer que la cité (''polis'') existe par nature et que l'homme est par nature un animal politique<ref>Aristote, ''Politiques'', I, 2, 1252b27-1253a3</ref>. Cette affirmation s'oppose à la fois aux sophistes, qui faisaient de la société une convention artificielle, et aux cyniques, qui prônaient l'autarcie individuelle. L'homme ne peut vivre ni bien vivre en dehors de la cité, car il a besoin des autres pour satisfaire ses besoins matériels et pour actualiser sa nature rationnelle et morale. La cité n'est pas une simple alliance défensive ou commerciale, mais une communauté de vie bonne, ayant pour fin le bonheur de ses membres<ref>Aristote, ''Politiques'', III, 9, 1280b39-1281a4</ref>. ==== Les formes de constitution ==== Aristote distingue six formes de constitution, selon deux critères : le nombre de gouvernants (un seul, quelques-uns, la multitude) et la fin poursuivie (l'intérêt commun ou l'intérêt privé des gouvernants). Les formes droites sont la royauté (gouvernement d'un seul pour le bien commun), l'aristocratie (gouvernement de quelques-uns pour le bien commun), et la république ou politeia (gouvernement de la multitude pour le bien commun). Les formes déviées sont la tyrannie, l'oligarchie et la démocratie (au sens péjoratif de démagogie)<ref>Aristote, ''Politiques'', III, 7, 1279a22-1279b10</ref>. Aucune de ces constitutions n'est absolument la meilleure en tout lieu et en tout temps. La meilleure constitution pour une cité donnée dépend des circonstances : étendue du territoire, richesses, mœurs des habitants, etc. Aristote fait preuve ici d'un réalisme politique qui contraste avec l'utopisme de la ''République'' de Platon. ==== La constitution mixte et la classe moyenne ==== La constitution la plus stable est celle qui mêle des éléments oligarchiques et démocratiques, donnant le pouvoir à la classe moyenne<ref>Aristote, ''Politiques'', IV, 11, 1295a25-1295b1</ref>. Les classes moyennes ne sont ni assez pauvres pour envier les riches, ni assez riches pour mépriser les pauvres. Elles recherchent la stabilité et l'égalité plutôt que les révolutions. Cette théorie de la classe moyenne et de la constitution mixte influencera durablement la pensée politique occidentale, de Polybe à Montesquieu. Elle exprime un idéal de modération et d'équilibre, caractéristique de la sagesse pratique aristotélicienne. ==== L'éducation ==== Les derniers livres des ''Politiques'' sont consacrés à l'éducation. Celle-ci ne peut être laissée aux familles privées, car la cité a pour fin de rendre les citoyens vertueux. Il doit donc y avoir une éducation publique commune, qui forme le caractère et l'intelligence des jeunes en vue de la vie civique et de la vie bonne<ref>Aristote, ''Politiques'', VIII, 1, 1337a11-21</ref>. Cette éducation comprend la gymnastique pour le corps, la musique pour l'âme, les lettres pour l'usage pratique, et le dessin pour apprécier la beauté des œuvres. Mais son but ultime n'est pas l'utilité mais le loisir bien employé (''scholê''), c'est-à-dire l'activité libre de l'esprit dans la contemplation et les arts libéraux<ref>Aristote, ''Politiques'', VIII, 3, 1337b28-1338a13</ref>. === Chapitre III : La ''Rhétorique'' – L'art de persuader === ==== La rhétorique comme art ==== La ''Rhétorique'' étudie les moyens de persuasion dans tous les genres de discours. Elle est l'homologue (''antistrophos'') de la dialectique : de même que la dialectique enseigne à raisonner sur toute question à partir de prémisses probables, la rhétorique enseigne à persuader tout auditoire sur tout sujet<ref>Aristote, ''Rhétorique'', I, 1, 1354a1-11</ref>. Aristote défend la rhétorique contre les attaques de Platon qui, dans le ''Gorgias'', en faisait une simple flatterie. Bien utilisée, elle est un art (''technê'') légitime et utile. Elle sert à défendre la vérité et la justice, car il serait absurde que l'incapacité de se servir de ses forces corporelles soit honteuse, mais non l'incapacité de se servir de la parole<ref>Aristote, ''Rhétorique'', I, 1, 1355a20-24</ref>. ==== Les trois genres rhétoriques et leurs topiques ==== Aristote distingue trois genres de rhétorique. Le genre délibératif conseille ou dissuade concernant l'avenir (devons-nous faire la guerre ?). Le genre judiciaire accuse ou défend concernant le passé (X a-t-il commis ce crime ?). Le genre épidictique loue ou blâme concernant le présent (célébrons la vertu du héros)<ref>Aristote, ''Rhétorique'', I, 3, 1358b2-29</ref>. Chaque genre a ses lieux propres. Le délibératif porte sur l'utile et le nuisible, recourant aux arguments sur les conséquences. Le judiciaire porte sur le juste et l'injuste, s'appuyant sur les lois et les témoignages. L'épidictique porte sur le beau et le laid moral, utilisant l'amplification<ref>Aristote, ''Rhétorique'', I, 3, 1358b29-1359a5</ref>. ==== Les preuves rhétoriques : ethos, pathos, logos ==== Aristote distingue trois moyens de persuasion : l'ethos (le caractère de l'orateur), le pathos (les émotions de l'auditoire), et le logos (le raisonnement lui-même)<ref>Aristote, ''Rhétorique'', I, 2, 1356a1-13</ref>. L'ethos persuade en inspirant confiance : l'orateur doit paraître prudent, vertueux et bienveillant. Le pathos persuade en suscitant des émotions favorables à la thèse défendue. Le livre II étudie systématiquement les émotions (colère, pitié, crainte, envie, etc.), leurs causes et leurs manifestations. Le logos persuade par les raisonnements, notamment l'enthymème (syllogisme rhétorique à partir de prémisses probables) et l'exemple (induction rhétorique)<ref>Aristote, ''Rhétorique'', I, 2, 1356a35-1356b5</ref>. Cette analyse des moyens de persuasion fonde la rhétorique comme discipline rationnelle et systématique, loin de l'empirisme des sophistes. Elle restera la base de l'enseignement rhétorique jusqu'à l'époque moderne. === Chapitre IV : La ''Potique'' – La création artistique === ==== La mimêsis et la catharsis ==== La ''Poétique'' étudie l'art poétique, principalement la tragédie et l'épopée. La poésie, comme tous les arts, est imitation (''mimêsis''). Mais elle n'imite pas les choses telles qu'elles sont (c'est le rôle de l'histoire), mais telles qu'elles pourraient ou devraient être selon la vraisemblance ou la nécessité<ref>Aristote, ''Poétique'', 9, 1451a36-1451b5</ref>. C'est pourquoi la poésie est plus philosophique que l'histoire : elle dit l'universel, alors que l'histoire dit le particulier. La tragédie représente une action sérieuse et complète, en suscitant pitié et crainte, pour opérer la purification (''catharsis'') de ces émotions<ref>Aristote, ''Poétique'', 6, 1449b24-28</ref>. Cette doctrine de la catharsis, qui répond à l'accusation platonicienne selon laquelle la tragédie corrompt l'âme en excitant les passions, est demeurée énigmatique. Peut-être Aristote veut-il dire que la tragédie, en permettant de ressentir ces émotions dans un cadre fictif, les évacue ou les modère, préparant ainsi le spectateur à mieux les gérer dans la vie réelle. ==== La structure de la tragédie ==== Aristote analyse avec précision la structure de la tragédie. Celle-ci doit former un tout avec commencement, milieu et fin. L'intrigue (''mythos'') est l'âme de la tragédie, plus importante que les caractères. L'intrigue idéale comprend une péripétie (''peripeteia''), renversement de l'action en sens contraire, et une reconnaissance (''anagnôrisis''), passage de l'ignorance à la connaissance<ref>Aristote, ''Poétique'', 11, 1452a15-32</ref>. Le héros tragique ne doit être ni parfaitement vertueux ni complètement vicieux, mais occuper une position intermédiaire. Son malheur doit résulter non d'un vice mais d'une erreur (''hamartia'')<ref>Aristote, ''Poétique'', 13, 1453a7-10</ref>. Ainsi Œdipe qui, sans le savoir, tue son père et épouse sa mère, inspire-t-il pitié plutôt que répulsion, parce que son crime procède de l'ignorance et non de la méchanceté. Ces analyses ont profondément influencé la théorie littéraire occidentale, de la Renaissance (avec la redécouverte de la ''Poétique'' et son influence sur le théâtre classique français) jusqu'à nos jours. == Conclusion : L'héritage d'Aristote == === La transmission et l'influence historique === L'influence d'Aristote sur l'histoire de la pensée occidentale et orientale est sans égale. Dans l'Antiquité tardive, les commentateurs néoplatoniciens (Porphyre, Alexandre d'Aphrodise, Simplicius, Philopon) étudient et expliquent ses œuvres, souvent en tentant de les harmoniser avec le platonisme. Au IXe siècle, les philosophes arabes traduisent Aristote en syriaque puis en arabe. Al-Fârâbî (872-950), Avicenne (980-1037) et surtout Averroès (1126-1198), surnommé « le Commentateur », développent un aristotélisme islamique qui influencera en retour l'Occident latin. À partir du XIIe siècle, les œuvres d'Aristote, accompagnées des commentaires arabes, sont traduites en latin. Elles révolutionnent l'université médiévale. Albert le Grand (1200-1280) et surtout Thomas d'Aquin (1225-1274) christianisent Aristote, montrant la compatibilité de sa philosophie avec la foi chrétienne. Le thomisme devient la philosophie officielle de l'Église catholique. Mais cette domination scolastique d'Aristote provoque aussi, à la Renaissance et à l'époque moderne, un puissant mouvement de rejet. La science moderne, de Galilée à Newton, se construit explicitement contre la physique aristotélicienne. === La pertinence contemporaine d'Aristote === Après trois siècles d'éclipse relative, le XXe siècle voit un remarquable renouveau de l'intérêt pour Aristote. En éthique, l'éthique des vertus revient au premier plan après la domination du kantisme et de l'utilitarisme, grâce aux travaux d'Anscombe, MacIntyre, Nussbaum. En philosophie de l'esprit, on redécouvre la pertinence du hylémorphisme aristotélicien face aux apories du dualisme cartésien et du matérialisme réductionniste. En métaphysique, Aristote inspire un renouveau de l'ontologie réaliste, attentive aux structures catégorielles de la réalité. En philosophie de la biologie, sa téléologie immanente et sa conception de l'organisme comme totalité fonctionnelle retrouvent une actualité face aux limites du mécanisme et du réductionnisme génétique. Plus largement, Aristote demeure une référence incontournable pour quiconque s'interroge sur les grandes questions philosophiques : qu'est-ce que l'être ? qu'est-ce que la connaissance ? comment vivre bien ? quelle est la meilleure constitution politique ? Son œuvre, par sa richesse, sa rigueur et son ampleur encyclopédique, continue de nourrir la réflexion philosophique contemporaine. == Notes et références == {{Références|colonnes = 2}} == Bibliographie == '''Éditions de référence :''' * Pierre Pellegrin (dir.), ''Aristote. Œuvres complètes'', Paris, Flammarion, 2014 * Bekker, Immanuel (éd.), ''Aristotelis Opera'', Berlin, Reimer, 1831-1870 '''Études générales :''' * Pierre Aubenque, ''Le problème de l'être chez Aristote'', Paris, PUF, 1962 * Jonathan Barnes (éd.), ''The Cambridge Companion to Aristotle'', Cambridge, Cambridge University Press, 1995 * Werner Jaeger, ''Aristote. Fondements pour une histoire de son évolution'', trad. fr. O. Sedeyn, Paris, L'Éclat, 1997 (1923) * Pierre Pellegrin, ''Aristote'', Paris, Bordas, 1990 '''Études spécialisées :''' * Richard Bodéüs, ''Aristote et la théologie des vivants immortels'', Montréal-Paris, Bellarmin-Les Belles Lettres, 1992 * Pierre-Marie Morel, ''Aristote. Une philosophie de l'activité'', Paris, Flammarion, 2003 * David Ross, ''Aristotle'', London, Methuen, 1923 {{Autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Aristote}} oir0euh4psetz3wl4vf6hte3ncxs3ox Dictionnaire de philosophie/Anaxagore 0 83143 764916 763997 2026-04-25T06:07:38Z PandaMystique 119061 764916 wikitext text/x-wiki {{DicoPhilo|Anaxagore de Clazomènes}} == Vie et contexte historique == {{wikisource|Auteur:Anaxagore_de_Clazomènes|Anaxagore de Clazomènes}} Les données biographiques concernant Anaxagore sont, comme le souligne l'''Oxford Classical Dictionary'', en grande partie « confuses et déroutantes » (''confused and confusing''), et la plupart des anecdotes transmises par la tradition antique doivent être abordées avec une prudence critique. Les récits qui nous sont parvenus proviennent en effet de sources tardives, séparées d'Anaxagore par plusieurs siècles : Plutarque (I{{er}}-II{{e}} siècle ap. J.-C.) dans ses ''Vies parallèles'', Valère Maxime (I{{er}} siècle ap. J.-C.) dans ses ''Faits et dits mémorables'', puis Diogène Laërce (première moitié du III{{e}} siècle ap. J.-C.) dans ses ''Vies et doctrines des philosophes illustres''. Ces auteurs compilent eux-mêmes des traditions doxographiques antérieures, parfois stylisées à des fins rhétoriques ou moralisatrices, parfois clairement légendaires. Anaxagore (en grec ancien Ἀναξαγόρας, « maître de l'assemblée » ou « chef au forum ») naît vers 500 av. J.-C. à Clazomènes, cité grecque d'Ionie située sur la côte occidentale de l'actuelle Turquie, à une trentaine de kilomètres à l'ouest d'Izmir<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 6 (DK 59 A 1). Apollodore d'Athènes, cité par Diogène Laërce, place la naissance d'Anaxagore à la 70{{e}} Olympiade (500-496 av. J.-C.).</ref>. Fils d'Hégésibule (certaines sources mentionnent Eubule), il appartient, selon la tradition ancienne, à une famille aristocratique et aurait possédé un patrimoine important<ref>Diogène Laërce, II, 6-7 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Selon Diogène Laërce, Anaxagore aurait abandonné ses biens à ses proches afin de se consacrer entièrement à la philosophie<ref>Diogène Laërce, II, 7 : « Il négligea ses biens par amour de la sagesse. »</ref>. Une autre tradition, rapportée tant par Valère Maxime que par Diogène Laërce, raconte qu'Anaxagore, revenant d'un long voyage, aurait trouvé ses propriétés en ruine et aurait déclaré : « Si cela n'avait pas péri, c'est moi qui aurais péri »<ref>Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5 ; Diogène Laërce, II, 6-7. Valère Maxime commente la sentence comme exemple de la sagesse la plus parfaite.</ref>. Ces récits, qu'ils soient authentiques ou pour partie légendaires, illustrent l'image qu'Anaxagore a laissée dans la mémoire doxographique : celle du philosophe contemplatif, détaché des affaires domestiques et consacré à l'étude du cosmos. Une anecdote célèbre, rapportée par plusieurs sources anciennes, témoigne de ce détachement. Interrogé sur son attachement à sa patrie, Anaxagore aurait répondu en levant la main vers le ciel : « J'ai un soin extrême de ma patrie », signifiant par là que le véritable philosophe considère l'univers entier comme sa demeure<ref>Plutarque, ''Vie de Périclès'', 4, 3-5 ; Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. Lorsqu'on lui demanda quel était l'homme le plus heureux, il aurait répondu, sur le même mode paradoxal, qu'aucun de ceux auxquels on songe ordinairement ne saurait prétendre à ce titre, et que le véritable bonheur paraîtrait même étrange à son interlocuteur<ref>Aristote, ''Éthique à Eudème'', 1215b6-8.</ref>. À quelqu'un qui lui demandait encore pour quelle raison on devrait choisir de naître plutôt que de ne pas être, il aurait répondu : « Afin de contempler les cieux et l'ordre de l'univers entier »<ref>Aristote, ''Éthique à Eudème'', 1216a11-14. Cette phrase, qui condense toute une conception de la vie philosophique comme ''theoria'', sera reprise par les moralistes anciens et par la tradition philosophique jusqu'à l'époque romaine.</ref>. === L'arrivée à Athènes et l'activité philosophique === La chronologie exacte de la vie d'Anaxagore demeure l'objet de débats parmi les historiens modernes, en raison de divergences importantes entre les sources anciennes<ref>Leonard Woodbury, « Anaxagoras and Athens », ''Phoenix'', vol. 35, n{{o}} 4, 1981, p. 295-315 ; Jaap Mansfeld, « The Chronology of Anaxagoras' Athenian Period and the Date of His Trial », ''Mnemosyne'', vol. 32-33, 1979-1980, p. 39-69 et p. 85-95 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 33-35.</ref>. Selon la chronologie établie par Apollodore d'Athènes et rapportée par Diogène Laërce, Anaxagore serait arrivé à Athènes vers 480 av. J.-C., à l'âge de vingt ans, au moment des guerres médiques<ref>Diogène Laërce, II, 7. Cette tradition est soutenue par certains chercheurs modernes : Patricia O'Brien, « Anaxagoras and the Diurnal Revolution », ''Phronesis'', vol. 13, 1968, p. 133-143 ; Leonard Woodbury, 1981 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006.</ref>. D'autres savants, notamment Jaap Mansfeld, proposent une date plus tardive, vers 456 av. J.-C.<ref>Jaap Mansfeld, 1979-1980 ; cf. également David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005, p. 1-18, pour une discussion approfondie des problèmes chronologiques.</ref>. La question n'est pas définitivement tranchée, mais la majorité des historiens s'accorde sur une période d'activité philosophique à Athènes s'étendant sur près de trente ans, probablement entre 480/456 et 450/437 av. J.-C.<ref>Diogène Laërce, II, 7 ; Malcolm Schofield, 1980, p. 33-35.</ref>. Quelle que soit la date précise de son arrivée, Anaxagore est présenté par la tradition antique comme le premier philosophe à introduire la spéculation cosmologique et la philosophie naturelle ionienne dans la cité athénienne<ref>Clément d'Alexandrie, ''Stromates'', I, 14, 63, 3 (DK 59 A 7) : « Anaxagore transporta d'Ionie à Athènes la philosophie. » Cf. également Plutarque, ''Vie de Périclès'', 4, 2 ; Isocrate, ''Sur l'échange'', 268.</ref>. Athènes, en pleine expansion culturelle et politique après sa victoire sur les Perses à Marathon (490 av. J.-C.) et à Salamine (480 av. J.-C.), deviendra rapidement le centre intellectuel du monde grec. C'est dans ce contexte que la tradition situe l'enseignement d'Anaxagore. La tradition biographique antique, dominée par le récit de Plutarque dans la ''Vie de Périclès'', rapporte qu'Anaxagore se serait lié à Périclès, l'homme d'État athénien qui dominera la vie politique de la cité de 454 à 431 av. J.-C.<ref>Plutarque, ''Vie de Périclès'', 4-5, 16, 32 (DK 59 A 15, A 17). Platon, ''Phèdre'', 269e-270a, évoque également l'influence d'Anaxagore sur l'éloquence de Périclès.</ref>. Selon cette tradition, Anaxagore aurait compté parmi les maîtres intellectuels de Périclès, et le surnom d'« instructeur de Périclès » lui aurait été attaché dès l'Antiquité<ref>Plutarque, ''Vie de Périclès'', 4, 5 ; Diogène Laërce, II, 10, 13. Les instruments de référence modernes (''Oxford Classical Dictionary'', s.v. « Anaxagoras ») restent toutefois prudents sur la portée exacte de cette relation, dont les témoignages sont tardifs.</ref>. Il convient cependant de ne pas transformer cette tradition en déclaration politique publique avérée : les sources dont nous disposons sont tardives, souvent biographiques ou rhétoriques, et la figure de l'« instructeur de Périclès » appartient en partie à la construction doxographique. L'idée que le grand orateur démocratique d'Athènes ait trouvé dans les leçons d'un philosophe naturaliste la source de son éloquence élevée et de son détachement aristocratique correspond à un topos biographique commode, qu'il convient de ne pas surinterpréter en termes de dette intellectuelle publique. Parmi les disciples ou auditeurs d'Anaxagore, les sources anciennes mentionnent aussi le poète tragique Euripide<ref>Diogène Laërce, II, 10 ; Héracléide du Pont, cité par Aulu-Gelle, ''Nuits attiques'', XV, 20 (DK 59 A 17). Certaines idées cosmologiques présentes dans les pièces d'Euripide semblent refléter l'enseignement d'Anaxagore.</ref>, le musicien et sophiste Damon<ref>Plutarque, ''Vie de Périclès'', 4.</ref>, et peut-être Archélaos, qui aurait ensuite été le maître de Socrate<ref>Diogène Laërce, II, 16, 23 (DK 60 A 1, A 4).</ref>. Concernant Socrate lui-même, la question de savoir s'il a personnellement rencontré Anaxagore demeure controversée. Dans le ''Phédon'', Platon fait dire à Socrate qu'il a entendu quelqu'un lire dans le livre d'Anaxagore (la tradition ancienne a identifié ce lecteur à Archélaos)<ref>Platon, ''Phédon'', 97b-99d. L'identité du lecteur n'est pas précisée par Platon, mais la tradition ancienne l'a identifié à Archélaos.</ref>, ce qui suggère que Socrate n'a probablement pas eu de contact direct avec le philosophe de Clazomènes. Dans l'''Apologie'', Platon fait par ailleurs référence au fait que les livres d'Anaxagore étaient en vente pour une drachme à l'orchestre du théâtre<ref>Platon, ''Apologie'', 26d. Cette remarque témoigne de la large diffusion de l'œuvre d'Anaxagore à Athènes à la fin du V{{e}} siècle av. J.-C.</ref>, ce qui indique que ses idées étaient largement connues à Athènes, même en l'absence d'enseignement oral direct. === L'œuvre écrite === Anaxagore a composé un traité intitulé ''Sur la nature'' (Περὶ φύσεως), rédigé en prose ionienne<ref>Diogène Laërce, II, 6 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 27, 2 (DK 59 A 41).</ref>. Selon les témoignages anciens, il n'aurait écrit qu'un seul livre<ref>Diogène Laërce, I, 16 ; II, 6-7.</ref>, bien que Platon emploie le pluriel τὰ Ἀναξαγόρου βιβλία dans l'''Apologie''<ref>Platon, ''Apologie'', 26d.</ref>. Cette apparente contradiction s'explique probablement par le fait que l'ouvrage, même relativement court, était copié sur plusieurs rouleaux de papyrus, ce qui était l'usage courant à l'époque pour les œuvres en prose. Diogène Laërce rapporte qu'Anaxagore fut le premier à publier un livre contenant des figures et des diagrammes<ref>Diogène Laërce, II, 11.</ref>, détail qui témoigne de la dimension scientifique et pédagogique qu'on lui prêtait dans l'Antiquité tardive. Le traité d'Anaxagore était rédigé dans un style sobre et dense, caractérisé par une prose ionienne archaïsante<ref>Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Hermann Fränkel, ''Dichtung und Philosophie des frühen Griechentums'', Munich, C.H. Beck, 1962, p. 529-547.</ref>. Contrairement aux poèmes philosophiques de Parménide et d'Empédocle, rédigés en hexamètres dactyliques à la manière d'Homère ou d'Hésiode, Anaxagore choisit la prose comme véhicule de sa pensée, s'inscrivant ainsi dans la tradition ionienne des philosophes naturalistes inaugurée par Anaximandre et Anaximène. De ce traité, il ne subsiste aujourd'hui qu'une vingtaine de fragments authentiques, principalement conservés par Simplicius de Cilicie (VI{{e}} siècle ap. J.-C.) dans ses commentaires sur Aristote<ref>L'édition de référence des fragments et témoignages demeure celle de Hermann Diels et Walther Kranz, ''Die Fragmente der Vorsokratiker'', 6{{e}} édition, Berlin, Weidmann, 1951-1952, vol. II, p. 5-44 (59 A et B). Une édition plus récente est celle d'André Laks et Glenn Most, ''Early Greek Philosophy'', Loeb Classical Library, 9 vol., Cambridge (Mass.), Harvard University Press, 2016, qui a introduit un nouveau système de numérotation ; éditions et traductions anglaises : Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 ; David Sider, ''The Fragments of Anaxagoras'', Sankt Augustin, Academia Verlag, 2005.</ref>. Simplicius, conscient de la rareté de l'ouvrage à son époque, prit soin de citer longuement les premières parties du traité, qui exposaient les principes généraux du système<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', 155, 23-157, 4 (fragments B1-B4) ; 164, 24-166, 1 (fragment B12).</ref>. === Le procès et l'exil === Les circonstances du départ d'Anaxagore d'Athènes et de sa fin de vie sont particulièrement controversées dans les sources anciennes. Diogène Laërce rapporte pas moins de quatre versions contradictoires du procès d'Anaxagore<ref>Diogène Laërce, II, 12-15. Ces quatre récits divergent sur l'identité de l'accusateur, la nature précise des charges, le déroulement du procès et son issue.</ref>. Selon une première version, attribuée à Sotion, Anaxagore aurait été accusé d'impiété (ἀσέβεια) par Cléon pour avoir déclaré que le soleil était une masse de métal incandescent ; Périclès l'aurait défendu, et Anaxagore aurait été condamné à une amende de cinq talents et à l'exil<ref>Sotion, dans Diogène Laërce, II, 12.</ref>. Selon Satyre, l'accusateur aurait été Thucydide (l'adversaire politique de Périclès, et non l'historien), les charges auraient inclus non seulement l'impiété mais aussi la trahison (sympathies pro-perses ou « médisme »), et Anaxagore aurait été condamné à mort par contumace<ref>Satyre, dans Diogène Laërce, II, 12-13.</ref>. Deux autres versions, attribuées respectivement à Hermippe et à Hiéronymos de Rhodes, présentent des variantes sur le rôle de Périclès et l'issue du procès<ref>Hermippe et Hiéronymos de Rhodes, dans Diogène Laërce, II, 13-14.</ref>. Plutarque, dans la ''Vie de Périclès'', fournit une version différente. Selon lui, un devin et politicien athénien nommé Diopeithès aurait fait voter un décret (le « décret de Diopeithès ») autorisant les poursuites judiciaires contre ceux qui ne reconnaissaient pas les dieux ou enseignaient des doctrines sur les phénomènes célestes<ref>Plutarque, ''Vie de Périclès'', 32, 1-2. Ce décret, daté approximativement de 433-432 av. J.-C., aurait visé Anaxagore mais aussi, indirectement, Périclès.</ref>. Selon cette version, Anaxagore aurait été accusé d'impiété pour avoir soutenu que le soleil n'était pas une divinité mais une pierre incandescente, et que la lune était une terre<ref>Plutarque, ''Vie de Périclès'', 32, 2 ; Platon, ''Apologie'', 26d, où Mélètos accuse Socrate de professer les mêmes opinions qu'Anaxagore.</ref>. Grâce à l'intervention de Périclès, Anaxagore aurait échappé à la condamnation à mort mais aurait dû s'exiler d'Athènes<ref>Plutarque, ''Vie de Périclès'', 32, 5.</ref>. L'historicité même de ce procès a été mise en doute par certains historiens modernes, qui soulignent l'absence de témoignages contemporains et les ressemblances troublantes avec le procès de Socrate<ref>J. A. Davison, « Protagoras, Democritus, and Anaxagoras », ''Classical Quarterly'', vol. 3, 1953, p. 33-45, exprime un scepticisme extrême.</ref>. Néanmoins, la plupart des spécialistes admettent aujourd'hui qu'un procès a bien eu lieu, même si les détails précis nous échappent<ref>Leonard Woodbury, 1981 ; Daniel Graham, 2006, p. 311-318, défendent l'historicité du procès tout en reconnaissant les difficultés chronologiques.</ref>. La date du procès demeure elle aussi incertaine : certains savants la placent vers 450 av. J.-C.<ref>Cette date traditionnelle est défendue notamment dans l'''Oxford Classical Dictionary'', 2{{e}} édition, 1970, s.v. « Anaxagoras ».</ref>, d'autres vers 437-436 av. J.-C.<ref>Mansfeld, 1979-1980.</ref>, d'autres encore vers 433-432 av. J.-C.<ref>Woodbury, 1981.</ref>. Quelle que soit la date précise, Anaxagore se retire à Lampsaque, colonie grecque d'Asie Mineure située sur l'Hellespont (l'actuel détroit des Dardanelles), où, selon la tradition, il est accueilli avec honneur<ref>Diogène Laërce, II, 14-15 ; Valère Maxime, ''Faits et dits mémorables'', VIII, 7, ext. 5.</ref>. Il y meurt en 428 av. J.-C., à l'âge de soixante-douze ans selon Apollodore<ref>Apollodore, dans Diogène Laërce, II, 7.</ref>. Les habitants de Lampsaque lui vouent, selon les sources tardives, un culte et célèbrent sa mémoire pendant plus d'un siècle après sa mort. Ils auraient élevé un autel dédié à l'Esprit et à la Vérité (Νοῦς καὶ Ἀλήθεια) en son honneur, et observé l'anniversaire de sa mort comme un jour férié pour les enfants des écoles<ref>Diogène Laërce, II, 15 ; Élien, ''Histoire variée'', VIII, 19 ; Cicéron, ''Tusculanes'', V, 36, 104.</ref>. Une inscription fut placée sur sa tombe, dont le texte exact ne nous est malheureusement pas parvenu, mais qui témoignait, selon Diogène Laërce, de l'estime dans laquelle les citoyens de Lampsaque tenaient le philosophe<ref>Diogène Laërce, II, 15.</ref>. === Portrait et anecdotes === Les sources anciennes ont conservé de nombreuses anecdotes sur Anaxagore qui, même si leur authenticité historique ne peut être garantie, témoignent de l'image du philosophe dans la tradition biographique antique. Galien rapporte qu'Anaxagore, apprenant la mort de son fils, aurait déclaré avec le plus grand calme : « Je savais qu'il était mortel quand je l'ai engendré »<ref>Galien, ''Des opinions d'Hippocrate et de Platon'', IV, 7, 41 (DK 59 A 33).</ref>. Ces récits contribuèrent à faire d'Anaxagore le modèle, dans la tradition, du philosophe détaché des contingences matérielles et consacré à la contemplation de la nature. Dans le ''Phèdre'' de Platon, Socrate attribue l'éloquence de Périclès à l'influence d'Anaxagore, qui lui aurait appris à s'élever au-dessus des préoccupations quotidiennes par la spéculation sur la nature de l'intelligence (νοῦς) et de la folie<ref>Platon, ''Phèdre'', 269e-270a.</ref>. Cette remarque témoigne de la réputation d'Anaxagore dans l'Athènes classique : celle d'un penseur dont les spéculations abstraites et « météorologiques » (au sens ancien de l'étude des phénomènes célestes) pouvaient paraître étranges ou excessives aux yeux du commun, mais qui exerçaient une fascination certaine sur les esprits cultivés. Cette image se reflète jusque dans la comédie d'Aristophane, ''Les Nuées'', où les spéculations cosmologiques tournées en ridicule semblent en partie inspirées par les doctrines d'Anaxagore, bien que ce soit Socrate qui soit présenté sur scène<ref>Aristophane, ''Les Nuées'', passim. Cf. Kenneth Dover, ''Aristophanes Clouds'', Oxford, Clarendon Press, 1968, p. xxxii-xlvii, pour la discussion du rapport entre les théories cosmologiques ridiculisées dans la pièce et celles d'Anaxagore.</ref>. === L'école de Lampsaque === À Lampsaque, Anaxagore fonda ou du moins anima une école philosophique qui continua son enseignement après sa mort<ref>Malcolm Schofield, 1980, p. 1 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Parmi ses disciples à Lampsaque, les sources mentionnent Métrodore de Lampsaque<ref>Diogène Laërce, II, 17 ; Plutarque, ''Des opinions des philosophes'', 888e (DK 61).</ref>, qui poursuivit et développa les interprétations allégoriques d'Homère dans un esprit anaxagoréen. L'influence de l'école de Lampsaque se prolongea au moins jusqu'à la fin du V{{e}} siècle av. J.-C. Cette présence d'Anaxagore à Lampsaque explique peut-être pourquoi ses idées ont continué à circuler et à être discutées dans le monde grec, malgré son départ d'Athènes et le caractère fragmentaire de la tradition de son œuvre écrite. == Les principes métaphysiques fondamentaux == La philosophie d'Anaxagore se construit en réponse directe aux exigences métaphysiques établies par Parménide d'Élée<ref>Patricia Curd, ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998, p. 123-142 ; Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 27-47.</ref>. Dans son poème philosophique, Parménide avait posé deux principes fondamentaux : « l'être est et ne peut pas ne pas être » (ἔστιν εἶναι) et « le non-être n'est pas et ne peut pas être » (οὐκ ἔστι μὴ εἶναι)<ref>Parménide, fragment B2, DK 28 B 2, 3-5 ; cf. également B6, 1-2 et B8, 1-2.</ref>. De ces prémisses, Parménide concluait que toute génération et toute corruption véritables sont impossibles, car elles impliqueraient un passage de l'être au non-être ou du non-être à l'être, transitions logiquement impossibles puisque le non-être ne peut en aucune manière être<ref>Parménide, B8, 6-21 ; Aristote, ''Physique'', I, 8, 191a23-31.</ref>. Plus encore, Parménide soutenait que l'être véritable devait être un, continu, homogène, immuable et éternel<ref>Parménide, B8, 22-25 : « Il n'est pas divisible, puisqu'il est tout entier semblable » (οὐδὲ διαιρετόν ἐστιν, ἐπεὶ πᾶν ἐστιν ὁμοῖον).</ref>. Anaxagore accepte les principes éléatiques fondamentaux, c'est-à-dire l'impossibilité du passage de l'être au non-être et inversement, mais refuse d'en tirer la conclusion que le monde sensible et le changement sont illusoires<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 25, 19-26 (DK 59 A 52).</ref>. Selon Simplicius, « Anaxagore de Clazomènes, qui fut un disciple de la philosophie d'Anaximène, fut le premier à s'opposer à Parménide »<ref>Simplicius, ''Commentaire sur la Physique'', 25, 19-21 (DK 59 A 52). L'affirmation qu'Anaxagore fut disciple d'Anaximène est chronologiquement problématique et doit être comprise au sens large d'une appartenance à la tradition ionienne.</ref>. Plutôt que de nier la réalité du changement et de la diversité, Anaxagore cherche à fonder une cosmologie conforme aux exigences parménidiennes tout en rendant compte de la multiplicité et du mouvement observables dans la nature<ref>Malcolm Schofield, 1980, p. 38-42 ; G. E. L. Owen, « Eleatic Questions », ''Classical Quarterly'', vol. 10, 1960, p. 84-102.</ref>. Comme l'a remarqué G. E. L. Owen, la phrase d'ouverture du traité d'Anaxagore, « Toutes choses étaient ensemble », est « manifestement formulée comme une contradiction plate de Parménide sur plusieurs questions majeures »<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95, cité dans Malcolm Schofield, 1980, p. 64.</ref>. === Le principe de conservation === Le premier principe métaphysique fondamental qu'Anaxagore énonce se trouve dans le fragment B17 : « Les Grecs ne pensent pas correctement au sujet de la génération et de la corruption. Aucune chose ne naît ni ne périt, mais à partir des choses qui sont, il y a mélange et séparation. Ainsi, ils appelleraient correctement la génération "mélange" (σύγκρισις) et la corruption "séparation" (διάκρισις) »<ref>Anaxagore, fragment B17, cité par Simplicius, ''Commentaire sur la Physique'', 163, 20-24 (DK 59 B 17).</ref>. Ce principe de conservation constitue le fondement de toute sa physique et sa réponse directe à l'interdit parménidien. Ce qui apparaît comme génération n'est en réalité qu'un réarrangement d'éléments préexistants qui se mélangent (συμμίσγεται). Ce qui semble être corruption n'est que la dissociation (διακρίνεται) de ces mêmes éléments<ref>Anaxagore, B17 ; cf. également Aristote, ''Génération et corruption'', I, 1, 314a18-20 (DK 59 A 52) : « Anaxagore et d'autres disent que la génération et la corruption sont mélange et séparation. »</ref>. Rien ne naît du néant (ex nihilo nihil fit), rien ne retourne au néant : les composants élémentaires de la réalité existent de toute éternité et demeurent inaltérables dans leur nature propre. Aristote souligne qu'Anaxagore, comme d'autres philosophes naturalistes, fonde explicitement ce principe sur l'axiome parménidien<ref>Aristote, ''Physique'', I, 4, 187a26-31.</ref>. Le principe prend chez Anaxagore une forme plus spécifique encore dans le fragment B10, où il pose la question rhétorique : « Comment le cheveu pourrait-il provenir de ce qui n'est pas cheveu, et la chair de ce qui n'est pas chair ? » (πῶς γὰρ ἂν ἐκ μὴ τριχὸς γένοιτο θρὶξ καὶ σὰρξ ἐκ μὴ σαρκός;)<ref>Anaxagore, fragment B10, conservé dans une scholie à Grégoire de Nazianze (DK 59 B 10).</ref>. Cette formulation, qui deviendra proverbiale dans l'Antiquité, exprime ce que les commentateurs modernes appellent le « principe du semblable par le semblable » (similia similibus) : une substance ne peut provenir que de la même substance, déjà présente sous une forme latente<ref>Aristote, ''Physique'', I, 4, 187a26-29 ; cf. Malcolm Schofield, 1980, p. 51-58 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 309-315.</ref>. Ce principe présente une analogie frappante avec celui qu'Antoine-Laurent de Lavoisier formulera en 1789 comme principe de conservation de la matière, et la sentence « Rien ne se perd, rien ne se crée, tout se transforme » en est parfois rapprochée. Il convient cependant de ne pas surinterpréter cette analogie : les mécanismes qu'Anaxagore propose pour expliquer les transformations (mélange et séparation d'ingrédients éternels) sont qualitatifs et ne relèvent pas d'une conception chimique quantitative au sens moderne<ref>Antoine-Laurent de Lavoisier, ''Traité élémentaire de chimie'', Paris, Cuchet, 1789, vol. I, p. 101 : « Rien ne se crée, ni dans les opérations de l'art, ni dans celles de la nature, et l'on peut poser en principe que, dans toute opération, il y a une égale quantité de matière avant et après l'opération. » Le rapprochement avec Anaxagore relève plus de l'analogie conceptuelle rétrospective que d'une filiation historique documentée.</ref>. L'intuition conservatrice d'Anaxagore partage avec le principe lavoisien l'idée que rien ne se perd ni ne se crée dans le devenir physique, mais il serait anachronique d'y voir l'un des principes cardinaux de la chimie moderne. === Tout est dans tout === Le deuxième principe métaphysique fondamental d'Anaxagore s'énonce ainsi : « Il y a une part de tout en toute chose » (ἐν παντὶ παντὸς μοῖρα ἔνεστι, fragment B11)<ref>Anaxagore, fragment B11, cité par Simplicius, ''Commentaire sur la Physique'', 164, 26 (DK 59 B 11).</ref>. Ce principe, souvent désigné par la formule latine ''omnia in omnibus'' (« toutes choses dans toutes choses »), constitue sans doute la thèse la plus caractéristique et la plus déroutante de la philosophie d'Anaxagore<ref>Cf. Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Il signifie que chaque portion de matière, si infime soit-elle, contient en elle-même des portions de toutes les autres substances qui existent dans l'univers. Il n'existe aucune substance pure, aucun élément qui puisse être isolé de tous les autres<ref>Anaxagore, B6 : « Puisqu'il est impossible qu'il y ait un minimum, il ne serait pas possible que [quelque chose] soit séparé, ni ne vienne à l'être par soi-même » (ἐπεὶ δὲ οὐκ ἔστι τοῦ ὀλίγου τὸ ἐλάχιστον, οὐκ ἂν γένοιτο χωρίς, οὐδὲ γένοιτο καθ᾽ ἑαυτό).</ref>. Dans un morceau d'or, il y a non seulement de l'or en proportion dominante, mais aussi de la chair, des os, du chaud, du froid, du sec, de l'humide, et ainsi de suite pour toutes les qualités et substances possibles<ref>Aristote, ''Métaphysique'', I, 3, 984a13-16 ; Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 A 45).</ref>. Cette thèse découle logiquement du principe de conservation et du principe du semblable par le semblable combinés. En effet, comment la chair pourrait-elle provenir du pain et du lait que nous consommons, si le pain et le lait ne contenaient pas déjà de la chair ? La question rhétorique du fragment B10 impose cette conclusion. La nourriture que nous ingérons doit nécessairement contenir en elle-même, quoique de manière imperceptible en raison de la petitesse des parties, toutes les substances qui composent notre corps : cheveux, ongles, veines, artères, nerfs, os<ref>Scholie anonyme à Grégoire de Nazianze, DK 59 B 10 : « Dans le même liquide séminal, il y a des cheveux, des ongles, des veines et des artères, des nerfs et des os, et ils sont imperceptibles en raison de la petitesse des parties (δι᾽ ὀλιγότητα), mais lorsqu'ils croissent, ils se séparent graduellement. »</ref>. C'est par un processus de séparation graduelle (ἀποκρίνεσθαι), au cours de la croissance, que ces éléments préexistants dans la nourriture viennent s'ajouter aux parties correspondantes de notre organisme. Le principe « tout est dans tout » s'applique non seulement aux substances naturelles comme la chair et les os, mais aussi aux qualités opposées. Anaxagore affirme que « le noir est dans le blanc et le blanc dans le noir » et qu'il en va de même pour le lourd et le léger, le chaud et le froid<ref>Anaxagore, B15, cité par Simplicius, ''Commentaire sur le Ciel'', 608, 26 (DK 59 B 15) ; Simplicius, ''Commentaire sur la Physique'', 175, 11-14.</ref>. Ces oppositions qualitatives ne sont pas absolues mais relatives : ce qui nous paraît blanc contient en réalité du noir, mais en proportion si faible que cette part de noir demeure invisible à nos sens. De même, ce qui est léger contient du lourd, et inversement<ref>Anaxagore, B1, B4b ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Cette doctrine a suscité d'intenses débats interprétatifs depuis l'Antiquité. Aristote la présente comme une tentative de résoudre le problème de la nutrition tout en respectant les contraintes éléatiques<ref>Aristote, ''Physique'', III, 4, 203a19-b3 ; cf. W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 289-294.</ref>. Les interprètes modernes se divisent sur la question de savoir si Anaxagore conçoit ces « portions » (μοῖραι) comme des particules infinitésimales ou comme des qualités interpénétrées sans structure corpusculaire déterminée<ref>Pour la première interprétation « particulaire », voir Gregory Vlastos, 1950 ; Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120. Pour la seconde interprétation « non-particulaire », voir Colin Strang, 1963 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. Quoi qu'il en soit, ce principe constitue la clé de voûte du système physique d'Anaxagore. === Pas de plus petit ni de plus grand === Le troisième principe métaphysique, exposé dans le fragment B3, stipule qu'« il n'y a pas de plus petit dans le petit, mais toujours un plus petit encore, car il est impossible que ce qui est cesse d'être par division (οὐ γάρ ἐστι τοῦ ἀποκεκρίσθαι τὸ ἐλάχιστον). Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude (πλῆθος) ; mais par rapport à elle-même, chaque chose est à la fois grande et petite »<ref>Anaxagore, fragment B3, cité par Simplicius, ''Commentaire sur la Physique'', 164, 17-20 (DK 59 B 3).</ref>. Ce principe garantit la divisibilité infinie de la matière et s'oppose frontalement à toute conception atomiste de type démocritéen<ref>Leucippe et Démocrite, fragments DK 67-68 ; Aristote, ''Génération et corruption'', I, 2, 315b28-317a2 ; I, 8, 325a23-b5.</ref>. Contrairement à Leucippe et Démocrite, qui postulent l'existence d'atomes insécables (ἄτομα, littéralement « indivisibles »), Anaxagore maintient que toute portion de matière, aussi petite soit-elle, peut encore être divisée, et que cette division révélera toujours la présence de toutes les substances selon le principe « tout est dans tout »<ref>Démocrite, fragments B9, B125, B156, B164 ; cf. Aristote, ''De la génération et de la corruption'', I, 8, 325a23-b5 ; Simplicius, ''Commentaire sur le Ciel'', 294, 33-295, 22 (DK 68 A 37).</ref>. Pour Anaxagore, la divisibilité peut être infinie sans que la matière s'évanouisse dans le néant, précisément parce que chaque fragment, si petit soit-il, contient encore toutes les substances<ref>Anaxagore, B6 : « Puisque les parts du grand et du petit sont égales en nombre, ainsi également toutes choses seraient dans toute chose. Il n'est pas possible qu'elles soient séparées, mais toutes choses ont une part de toute chose » (ἴσαι γὰρ ἀριθμῷ μοῖραί εἰσι καὶ τοῦ μεγάλου καὶ τοῦ σμικροῦ· καὶ οὕτως ἂν εἴη πάντα ἐν παντί).</ref>. Cette infinité dans la petitesse se combine avec l'infinité dans la grandeur. Il n'existe pas de limite supérieure à l'extension d'une substance, pas plus qu'il n'existe de limite inférieure<ref>Anaxagore, B3 : « Mais il y a aussi toujours un plus grand que le grand, et il est égal au petit en multitude » (ἀλλὰ καὶ μεγάλου ἀεὶ ἔστι μεῖζον· καὶ ἴσον ἐστὶ τῷ σμικρῷ πλήθει).</ref>. Cette double infinité, à la fois de division et d'extension, constitue un trait distinctif de la métaphysique d'Anaxagore et pose des problèmes interprétatifs considérables aux commentateurs, tant anciens que modernes<ref>Margaret Furth, « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; David Furley, « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126.</ref>. Le principe de non-minimum a une conséquence métaphysique importante : il assure que le mélange universel « tout est dans tout » ne pourra jamais être défait. En effet, puisqu'il n'existe pas de plus petite quantité d'une substance, celle-ci ne pourra jamais être entièrement extraite d'un mélange. On pourra réduire sa proportion indéfiniment, mais elle demeurera toujours présente en quelque mesure<ref>Anaxagore, B6 ; Simplicius, ''Commentaire sur la Physique'', 164, 20-22 : « Car si tout est dans tout et si tout se sépare de tout, alors du prétendu minimum quelque chose de plus petit que lui sera séparé, et du prétendu maximum quelque chose de plus grand que lui a été séparé. »</ref>. Ainsi, le principe de mélange universel est garanti de manière structurelle par le principe de divisibilité infinie. Comme l'a remarqué Colin Strang, « la complexité structurelle n'est pas, dans la théorie d'Anaxagore, fonction de la taille »<ref>Colin Strang, 1963, p. 366 : « Structural complexity is not, on Anaxagoras' theory, a function of size. »</ref>. La justification qu'Anaxagore donne de ce principe est explicitement parménidienne : « car il est impossible que ce qui est cesse d'être » (οὐ γὰρ ἔστι τοῦ εἶναι τὸ μὴ εἶναι)<ref>Anaxagore, B3 ; cette formulation reprend directement l'axiome de Parménide, B2, 3.</ref>. Si l'on pouvait diviser la matière jusqu'à la faire disparaître complètement, cela impliquerait un passage de l'être au non-être, ce qui viole l'interdit fondamental. Toute division, aussi poussée soit-elle, doit donc laisser subsister quelque chose, et ce quelque chose, par application du principe « tout est dans tout », contiendra encore des portions de toutes les substances<ref>Simplicius, ''Commentaire sur la Physique'', 164, 23-165, 1 (commentaire sur B3).</ref>. === Le principe de prédominance === Du principe « tout est dans tout » découle une difficulté évidente : si chaque chose contient une part de toutes les autres, comment expliquer que nous percevions des objets distincts et identifiables ? Comment distinguer l'or de la chair, le noir du blanc, si l'or contient de la chair et la chair contient de l'or, si le noir contient du blanc et le blanc contient du noir ? Anaxagore résout cette difficulté par ce que les commentateurs modernes appellent le « principe de prédominance » (bien qu'Anaxagore lui-même n'emploie pas ce terme technique)<ref>Le terme « principe de prédominance » (predominance principle) a été introduit par les interprètes modernes, notamment Gregory Vlastos, 1950, p. 47-50 ; Malcolm Schofield, 1980, p. 88-101.</ref>. Dans le fragment B12, il affirme : « Chaque chose est et était très manifestement (ἐμφανέστατα) constituée de celles des choses dont il y a le plus en elle »<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 1-157, 4, à 156, 10-11 (DK 59 B 12).</ref>. Autrement dit, une chose tire son identité et ses propriétés apparentes des substances qui prédominent en elle. Un morceau d'or nous apparaît comme de l'or parce que la substance or y est présente en proportion largement supérieure à toutes les autres substances. De même, notre chair nous semble être de la chair parce que la substance chair y domine quantitativement<ref>Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 : « Chaque chose semble être cela dont elle a le plus, comme elle l'était auparavant » (δοκεῖν δ᾽ ἕκαστον εἶναι ταῦτα ὧν ἂν πλεῖστα ἐνῇ, ὥσπερ καὶ πρότερον).</ref>. Cette prédominance n'est pas absolue, puisque toutes les autres substances demeurent présentes en quelque proportion, mais elle est suffisante pour conférer à l'objet ses caractéristiques perceptibles<ref>Anaxagore, B12 ; Aristote, ''Physique'', I, 4, 187b1-7.</ref>. Le principe de prédominance permet à Anaxagore de concilier son ontologie de mélange universel avec notre expérience quotidienne d'un monde composé d'objets distincts et identifiables. Il rend compte aussi du changement : lorsqu'un objet semble se transformer en un autre, par exemple lorsque le pain que nous mangeons devient chair, ce qui se produit en réalité est une modification des proportions relatives des substances présentes. La chair, déjà présente dans le pain mais en proportion imperceptible, vient s'ajouter à la chair de notre corps à mesure que les autres composants du pain se dispersent ou que leurs proportions relatives diminuent<ref>Anaxagore, B10 ; Aristote, ''Génération des animaux'', II, 4, 740b26-29 ; Simplicius, ''Commentaire sur la Physique'', 460, 4-465, 19 (DK 59 A 45).</ref>. Contrairement aux apparences sensibles, il n'y a pas de transformation qualitative véritable, mais seulement des réarrangements quantitatifs<ref>Malcolm Schofield, 1980, p. 88-101 ; Daniel Graham, ''Explaining the Cosmos: The Ionian Tradition of Scientific Philosophy'', Princeton, Princeton University Press, 2006, p. 137-152.</ref>. Théophraste, dans son traité ''Sur les sensations'', rapporte qu'Anaxagore soutenait que « toute sensation s'accompagne de douleur » (πᾶσαν αἴσθησιν μετὰ λύπης εἶναι) précisément parce que percevoir implique un contact entre des qualités opposées<ref>Théophraste, ''De Sensibus'', 1, 27-29 (DK 59 A 92). Cf. également Aétius, IV, 9, 1 (DK 59 A 92).</ref>. Si le principe de prédominance explique pourquoi nous percevons des objets distincts, il explique aussi pourquoi cette perception n'est jamais parfaitement exacte : les sens ne peuvent discriminer que les différences marquées de proportion, mais les différences subtiles leur échappent<ref>Sextus Empiricus, ''Contre les mathématiciens'', VII, 90 (DK 59 B 21) : « Les apparences sont une vision des choses non-manifestes » (ὄψις τῶν ἀδήλων τὰ φαινόμενα).</ref>. === Synthèse : la réponse d'Anaxagore à Parménide === Les quatre principes métaphysiques que nous venons d'examiner, soit la conservation, le « tout est dans tout », la divisibilité infinie et la prédominance, forment un système cohérent qui constitue la réponse d'Anaxagore au défi parménidien<ref>Patricia Curd, 1998, p. 123-165 ; Malcolm Schofield, 1980, p. 27-86.</ref>. Anaxagore accepte l'impossibilité du passage de l'être au non-être, mais rejette les conséquences que Parménide en tire concernant l'unicité, l'immobilité et l'homogénéité de l'être. Premièrement, en remplaçant la génération et la corruption par le mélange et la séparation (B17), Anaxagore sauve les phénomènes sans violer l'interdit éléatique : rien ne naît véritablement, rien ne périt véritablement, il n'y a que réarrangement de ce qui existe déjà de toute éternité. Deuxièmement, en posant que tout est dans tout (B11, B6), Anaxagore explique comment des substances apparemment nouvelles peuvent émerger sans être créées ex nihilo : elles étaient déjà présentes dans le mélange, simplement imperceptibles en raison de leur faible proportion. Troisièmement, en affirmant la divisibilité infinie (B3, B6), Anaxagore garantit que le mélange universel ne pourra jamais être entièrement défait. Quatrièmement, en introduisant le principe de prédominance (B12), Anaxagore rend compte de la diversité phénoménale et de la possibilité de la perception, tout en maintenant l'ontologie du mélange universel. Anaxagore parvient ainsi à préserver les intuitions fondamentales de Parménide, à savoir la permanence de l'être, l'impossibilité du non-être et l'immutabilité substantielle, tout en rendant compte de la pluralité, du changement et du devenir qui caractérisent notre expérience du monde<ref>Patricia Curd, 1998, p. 165 : « Anaxagoras accepts the fundamental Eleatic constraint that what-is-not cannot be, but offers an account of the world that preserves both plurality and change. » Cf. également Daniel Graham, 2006, p. 137-152 ; G. E. R. Lloyd, ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970, p. 47-52.</ref>. == Les ingrédients primordiaux == La question de savoir quels sont exactement les ingrédients élémentaires (τὰ χρήματα) qui composent l'univers d'Anaxagore a suscité d'intenses débats parmi les commentateurs, depuis Aristote jusqu'aux spécialistes contemporains<ref>Pour une vue d'ensemble des débats, voir Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 99-138 ; Patricia Curd, ''Anaxagoras of Clazomenae : Fragments and Testimonia'', Toronto, University of Toronto Press, 2007, essais 2-4 ; Daniel Graham, « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18.</ref>. Le problème est rendu particulièrement complexe par le fait qu'Anaxagore ne fournit pas de liste systématique et exhaustive de ces ingrédients, et que les fragments conservés mentionnent des entités de natures apparemment différentes. Comme le souligne Malcolm Schofield, « malgré le rôle cardinal de la doctrine du "tout est dans tout" dans sa philosophie, les fragments qui ont survécu indiquent que dans son exposition, Anaxagore assigna au moins autant d'importance à son récit du mélange primordial et à sa description du Noûs et de son activité cosmogonique »<ref>Malcolm Schofield, 1980, p. 99.</ref>. === Les opposés === Dans les fragments B1, B2, B4b, B8, B12 et B15, Anaxagore énonce explicitement plusieurs paires d'opposés (τὰ ἐναντία) : l'humide et le sec (τὸ ὑγρόν καὶ τὸ ξηρόν), le chaud et le froid (τὸ θερμόν καὶ τὸ ψυχρόν), le lumineux et l'obscur (τὸ λαμπρόν καὶ τὸ ζοφερόν), le dense et le rare (τὸ πυκνόν καὶ τὸ ἀραιόν)<ref>Anaxagore, B1, B2, B4b, B8, B12, B15.</ref>. Ces qualités opposées jouent un rôle fondamental dans la cosmologie d'Anaxagore. Ce sont elles qui, par leur séparation progressive (ἀποκρίνεσθαι) à partir du mélange originel et leur réagencement ultérieur, donnent naissance à la diversité des phénomènes naturels<ref>Anaxagore, B12, B13, B15, B16 ; Aristote, ''Physique'', I, 4, 187b1-7 (DK 59 A 52).</ref>. Les opposés ne doivent pas être compris comme de simples attributs qui qualifieraient une substance sous-jacente. Dans la pensée présocratique en général, et chez Anaxagore en particulier, la distinction ultérieure entre substance et qualité n'existe pas encore avec la netteté qu'elle acquerra chez Aristote<ref>G. E. L. Owen, « Tithenai ta Phainomena », dans ''Aristotle et les problèmes de méthode'', éd. Suzanne Mansion, Louvain, Publications Universitaires, 1961, p. 83-103 ; Jonathan Barnes, ''The Presocratic Philosophers'', Londres, Routledge, 1982, p. 316-321.</ref>. Le chaud (τὸ θερμόν) n'est pas simplement une propriété qui affecterait une matière indéterminée ; c'est une réalité substantielle en soi, qui peut être présente en plus ou moins grande proportion dans un mélange donné. Comme l'a remarqué F. M. Cornford, ces opposés doivent être compris comme des « choses-qualités » (quality-things)<ref>F. M. Cornford, « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30, aux pages 16-17.</ref>. Gregory Vlastos précise que ces opposés doivent plutôt être compris « comme des formes d'énergie ou de puissance (δύναμις) »<ref>Gregory Vlastos, « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57.</ref>. === L'interprétation « austère » : les opposés seuls === Paul Tannery, à la fin du XIXe siècle, fut le premier à contester l'interprétation aristotélicienne selon laquelle Anaxagore aurait postulé l'existence de « particules homéomères » (particules de chair, d'os, etc.)<ref>Paul Tannery, « La théorie de la matière d'Anaxagore », ''Revue Philosophique'', vol. 22, 1886, p. 255-274 ; repris dans ''Pour l'histoire de la science hellène'', Paris, Alcan, 1887, p. 275-290.</ref>. Tannery soutenait qu'Anaxagore ne parlait que de qualités : l'humide, le sec, le chaud, le froid, etc. John Burnet adopta une position similaire dans son ouvrage influent ''Early Greek Philosophy'', reconnaissant que « même lorsque la notion de qualité (ποιότης) avait été définie, cette manière de penser survécut »<ref>John Burnet, ''Early Greek Philosophy'', 4{{e}} édition, Londres, Adam and Charles Black, 1930, p. 256-264, citation p. 263.</ref>. Burnet s'appuyait notamment sur Galien, qui affirme dans son commentaire sur Hippocrate que « ce sont les qualités qui sont éternelles » chez Anaxagore<ref>Galien, ''Commentaire sur le traité hippocratique Des humeurs'', XVI, 32 Kühn.</ref>. Cette interprétation présente plusieurs avantages. Premièrement, elle se fonde étroitement sur les fragments conservés d'Anaxagore lui-même, plutôt que sur les reconstructions d'Aristote, qui écrivait près de cent cinquante ans après Anaxagore et avait ses propres préoccupations philosophiques. Deuxièmement, elle rend compte du rôle cosmologique crucial des opposés dans les fragments B12, B13, B15 et B16, où ce sont explicitement les opposés qui se séparent lors de la cosmogonie<ref>Malcolm Schofield, 1980, p. 107-113 ; Colin Strang, « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118.</ref>. Cette interprétation a été défendue au XXe siècle par plusieurs spécialistes éminents, notamment F. M. Cornford, Gregory Vlastos (avec certaines réserves), Colin Strang, Malcolm Schofield (avec des nuances importantes), Brad Inwood, David Sedley, et plus récemment Anna Marmodoro<ref>F. M. Cornford, 1930 ; Gregory Vlastos, 1950, p. 329-333 ; Colin Strang, 1963 ; Malcolm Schofield, 1980, p. 99-138 ; Brad Inwood, « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; David Sedley, ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007, p. 24-26 ; Anna Marmodoro, « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422.</ref>. === L'interprétation aristotélicienne : les homéomères === Toutefois, la question devient plus complexe lorsqu'on prend en considération les témoignages indirects, notamment ceux d'Aristote. Dans plusieurs passages, Aristote attribue à Anaxagore une doctrine des « homéomères » (τὰ ὁμοιομερῆ), c'est-à-dire des substances dont chaque partie est semblable au tout<ref>Aristote, ''Métaphysique'', I, 3, 984a11-16 ; Aristote, ''Génération et corruption'', I, 1, 314a18-24 (DK 59 A 46).</ref>. Les exemples donnés par Aristote incluent la chair, les os, le sang, la moelle, l'or, le bois, autant de substances naturelles que nous rencontrons dans l'expérience quotidienne. Cependant, le terme même « homéomère » n'apparaît nulle part dans les fragments conservés d'Anaxagore. C'est Aristote qui l'a introduit pour caractériser ce qu'il comprenait être la position d'Anaxagore<ref>Le terme ὁμοιομερής apparaît d'abord chez Aristote, ''Parties des animaux'', II, 1, 646b10-20 ; ''Génération et corruption'', I, 1, 314a18 sq. Cf. Pierre Pellegrin, « La théorie aristotélicienne des homéomères », ''Revue de Métaphysique et de Morale'', vol. 86, 1981, p. 449-467.</ref>. Cette discordance entre les fragments authentiques, qui mentionnent principalement des opposés, et l'interprétation aristotélicienne, qui privilégie les substances naturelles comme la chair et les os, a conduit à une longue controverse parmi les spécialistes modernes. Comme le souligne W. K. C. Guthrie, « le fait le plus gênant pour ceux qui souhaitent suivre Aristote est que le terme homéomères n'apparaît jamais dans les fragments d'Anaxagore lui-même, et que les fragments ne mentionnent jamais explicitement la chair, les os ou le sang comme des ingrédients élémentaires »<ref>W. K. C. Guthrie, 1965, p. 284-285.</ref>. L'interprétation « expansive », qui accepte pleinement le témoignage aristotélicien, a néanmoins été défendue par plusieurs spécialistes, notamment Arthur L. Peck dans les années 1920 et 1930, et plus récemment par George Kerferd<ref>Arthur L. Peck, « Anaxagoras : Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; George B. Kerferd, « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143.</ref>. === L'interprétation médiane === Une troisième voie, une interprétation « médiane », a été proposée notamment par Malcolm Schofield et Patricia Curd<ref>Malcolm Schofield, 1980, p. 99-138 ; Patricia Curd, 1998, p. 123-165 ; Patricia Curd, 2007, essais 2-4.</ref>. Selon cette lecture, l'ontologie d'Anaxagore comprend plusieurs catégories d'entités : les opposés, les substances naturelles fondamentales comme les métaux, la terre, l'air et l'éther, et les ingrédients biologiques comme la chair, le sang et les os. En revanche, les plantes, les animaux et leurs parties organiques ne seraient pas des éléments primordiaux mais des constructions naturelles résultant de l'agencement des ingrédients plus fondamentaux<ref>Patricia Curd, 2007, essais 2-3, p. 157-191 ; Malcolm Schofield, 1980, p. 132-138.</ref>. Cette interprétation médiane présente l'avantage de tenir compte à la fois des fragments authentiques et des témoignages d'Aristote, sans les opposer frontalement. Elle reconnaît que les opposés jouent un rôle cosmologique crucial, puisque c'est leur séparation qui déclenche la formation du cosmos (fragments B12, B13, B15), tout en admettant que les substances naturelles ont également une place dans l'ontologie d'Anaxagore. === Les semences (σπέρματα) === Un élément supplémentaire de complexité est introduit par la mention des « semences » (σπέρματα) dans les fragments B4a et B4b. Dans le fragment B4b, après avoir mentionné les opposés, Anaxagore ajoute : « et il y avait beaucoup de terre présente, et des semences infinies en nombre, ne se ressemblant en rien les unes aux autres » (πολλὴ δὲ γῆ ἐνῆν καὶ σπέρματα ἄπειρα πλῆθος οὐδὲν ἐοικότα ἀλλήλοις)<ref>Anaxagore, fragment B4b, cité par Simplicius, ''Commentaire sur la Physique'', 34, 29-35, 9 (DK 59 B 4b).</ref>. Le fragment B4a est encore plus explicite : « Il est juste de penser qu'il y avait dans toutes les choses qui étaient rassemblées beaucoup de choses de toutes sortes, et des semences de toutes choses, possédant des formes et des couleurs et des saveurs de toute espèce »<ref>Anaxagore, fragment B4a, cité par Simplicius, ''Commentaire sur la Physique'', 34, 18-29 (DK 59 B 4a).</ref>. La nature exacte de ces semences a fait l'objet de débats considérables parmi les commentateurs. Gregory Vlastos a proposé que σπέρμα soit un terme technique introduit par Anaxagore pour désigner un agrégat infinitésimal contenant tous les ingrédients, mais dans lequel un seul prédomine<ref>Gregory Vlastos, 1950, p. 338-342 ; cf. également J. E. Raven, « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137.</ref>. David Lloyd a suggéré que les semences soient des portions pures (ou quasi-pures) d'opposés<ref>David Lloyd, « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251, note 1.</ref>. Une position intermédiaire, défendue par Malcolm Schofield, David Sedley, Patricia Curd et Daniel Gershenson, suggère que les semences doivent être comprises littéralement comme des semences biologiques ordinaires, c'est-à-dire des graines de plantes et des semences animales<ref>Malcolm Schofield, 1980, p. 119-132 ; David Sedley, 2007, p. 24-26 ; Patricia Curd, 2007, essai 2 ; Daniel E. Gershenson et Daniel A. Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 15-17.</ref>. Cette dernière interprétation présente plusieurs avantages. Elle ne fait pas violence au langage : lorsqu'Anaxagore parle de σπέρματα, il utilise le terme ordinaire pour « semences » sans lui donner un sens technique inhabituel. Elle explique la diversité infinie des semences mentionnée dans B4b. Elle est en outre corroborée par des témoignages anciens sur la biologie d'Anaxagore : Théophraste rapporte qu'« Anaxagore dit que l'air contient des semences de toutes choses, et que celles-ci, lorsqu'elles sont emportées avec l'eau, engendrent les plantes »<ref>Théophraste, ''Causes des plantes'', I, 5, 2 (DK 59 A 117).</ref>. De même, Hippolyte rapporte qu'« au commencement, les animaux naquirent de l'humide, du chaud et du terreux, puis plus tard les uns des autres »<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 12 (DK 59 A 42).</ref>. == L'état originel : tout ensemble == Le traité d'Anaxagore s'ouvrait par l'une des déclarations les plus célèbres et les plus discutées de la philosophie présocratique : « Toutes choses étaient ensemble » (ὁμοῦ πάντα χρήματα ἦν, fragment B1)<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-26 (DK 59 B 1). Diogène Laërce, II, 6, rapporte qu'Anaxagore « commença son traité d'une manière très attrayante ».</ref>. Cette formule programmatique, placée en position d'ouverture, exprime la thèse cosmogonique fondamentale d'Anaxagore concernant l'état primordial de l'univers. Plusieurs commentateurs, notamment G. E. L. Owen, ont souligné que la formulation d'Anaxagore constitue une réponse directe et délibérée à Parménide<ref>G. E. L. Owen, « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986, p. 65-84.</ref>. Là où Parménide avait affirmé que l'être « est maintenant, tout ensemble, un, continu » (νῦν ἔστιν ὁμοῦ πᾶν, ἕν, συνεχές)<ref>Parménide, fragment B8, 5-6 (DK 28 B 8).</ref>, Anaxagore proclame que « toutes choses étaient ensemble ». Parménide affirmait l'unicité, la continuité, l'éternité présente et l'immobilité de l'être ; Anaxagore lui oppose la pluralité, la diversibilité infinie, l'existence passée et le devenir cosmogonique<ref>Malcolm Schofield, 1980, p. 64-65 ; Patricia Curd, 1998, p. 123-142.</ref>. === La description du mélange originel === Le fragment B1, dont Simplicius nous dit qu'il se trouvait près du début du traité d'Anaxagore, fournit une description plus complète de cet état primordial : <blockquote>Toutes choses étaient ensemble, illimitées et en multitude et en petitesse, car le petit aussi était illimité. Et toutes choses étant ensemble, rien n'était manifeste en raison de la petitesse. Car l'air et l'éther recouvraient toutes choses, tous deux étant illimités ; car ce sont eux qui sont les plus grands dans la totalité des choses, et en multitude et en grandeur.<ref>Anaxagore, fragment B1, cité par Simplicius, ''Commentaire sur la Physique'', 155, 23-157, 4 (DK 59 B 1).</ref></blockquote> Ce passage dense pose plusieurs problèmes interprétatifs considérables qui ont occupé les commentateurs depuis l'Antiquité. Quatre caractéristiques principales du mélange originel y sont énoncées : toutes choses étaient ensemble ; elles étaient illimitées en multitude et en petitesse ; rien n'était manifeste en raison de la petitesse ; l'air et l'éther recouvraient toutes choses. L'expression « illimitées en multitude et en petitesse » a suscité d'intenses débats interprétatifs. Deux lectures principales s'affrontent, que Malcolm Schofield a désignées respectivement comme l'interprétation « particulaire » et l'interprétation « proportionnelle »<ref>Malcolm Schofield, 1980, p. 70-99.</ref>. L'interprétation particulaire comprend « illimitées en multitude » comme signifiant qu'il existait un nombre infini de choses distinctes dans le mélange originel<ref>Gregory Vlastos, 1950, p. 31-57 ; W. K. C. Guthrie, 1965, p. 277-285 ; David Sider, 2005, p. 56-62.</ref>. L'interprétation proportionnelle, en revanche, refuse de comprendre le mélange originel comme une collection de particules discrètes : « illimitées en petitesse » signifierait plutôt que chaque ingrédient était présent dans le mélange en une proportion infiniment petite par rapport à la totalité<ref>Malcolm Schofield, 1980, p. 75-89 ; Colin Strang, 1963, p. 101-118 ; Jonathan Barnes, 1982, p. 39-53.</ref>. Le débat entre ces deux interprétations n'est pas résolu, et chacune présente des avantages et des difficultés<ref>Pour une discussion équilibrée des deux positions, voir Patricia Curd, 2007, essai 4, p. 192-213 ; Daniel Graham, 2006, p. 137-152.</ref>. === L'imperceptibilité du mélange === La troisième caractéristique du mélange originel est son indistinction : « rien n'était manifeste » (οὐδὲν ἔνδηλον ἦν). Anaxagore explique cette imperceptibilité par deux facteurs complémentaires : « en raison de la petitesse » (ὑπὸ σμικρότητος), et parce que « l'air et l'éther recouvraient toutes choses » (πάντα γὰρ ἀὴρ καὶ αἰθὴρ κατεῖχε). L'air (ἀήρ) désigne ici, conformément à l'usage ionien archaïque, une substance sombre, humide, froide et dense<ref>Anaximène, fragments DK 13 A 7, B 2 ; cf. Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 133-162 ; Daniel Graham, 2006, p. 93-102.</ref>. L'éther (αἰθήρ), en revanche, désigne la substance lumineuse, chaude, sèche et rare<ref>Anaxagore, B15. Cf. W. K. C. Guthrie, 1965, p. 301-304 ; Malcolm Schofield, 1980, p. 81-83.</ref>. Ces deux substances, affirme Anaxagore, « sont les plus grandes dans la totalité des choses, et en multitude et en grandeur ». Cela signifie qu'elles étaient présentes dans le mélange originel en proportions largement supérieures à tous les autres ingrédients. Le fragment B4b confirme cette description : <blockquote>Mais avant que ces choses ne fussent séparées, lorsque toutes choses étaient ensemble, aucune couleur n'était manifeste. Car le mélange de toutes choses l'empêchait : celui du sec et de l'humide, du chaud et du froid, du lumineux et de l'obscur, ainsi que d'une grande quantité de terre présente et de semences illimitées en multitude, ne se ressemblant en rien les unes aux autres.<ref>Anaxagore, fragment B4b (DK 59 B 4b).</ref></blockquote> Ce passage confirme que l'indistinction du mélange originel n'était pas due à l'absence des ingrédients, mais à leur mélange si intime que leurs caractéristiques respectives se neutralisaient mutuellement. === L'immobilité originelle === Plusieurs témoignages anciens rapportent qu'avant l'intervention du Noûs, le mélange universel était au repos<ref>Aristote, ''Physique'', VIII, 1, 250b24-26 (DK 59 A 64).</ref>. Cette immobilité primordiale pose un problème philosophique considérable : si le mélange était éternellement au repos, qu'est-ce qui a pu le mettre en mouvement ? Anaxagore répond en postulant l'existence du Noûs (Νοῦς, Intellect ou Esprit), une entité distincte de toutes les substances matérielles, qui possède le pouvoir d'initier le mouvement<ref>Anaxagore, B12.</ref>. Mais cette réponse soulève elle-même de nouvelles difficultés, qui seront examinées plus loin. === L'étendue du mélange originel === Le fragment B1 affirme que l'air et l'éther « tous deux étaient illimités » (ἄμφω ἄπειρα ἐόντα), et le fragment B2 précise : « L'air et l'éther se séparent de la multitude environnante, et la multitude environnante est illimitée en quantité »<ref>Anaxagore, fragment B2 (DK 59 B 2).</ref>. Ces affirmations suggèrent que le mélange originel était spatialement infini<ref>Aristote, ''Physique'', III, 4, 203a19-23 (DK 59 A 43).</ref>. Le fragment B12 indique que « le Noûs commença à exercer son pouvoir à partir d'un petit commencement, puis la rotation s'étendit sur une région plus grande, et s'étendra sur une région plus grande encore »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Cela suggère que le processus cosmogonique, bien qu'il soit en cours depuis un temps considérable, n'a pas encore affecté la totalité du mélange infini. Cette conception d'un univers partiellement ordonné, où la cosmogonie est encore en cours dans les régions périphériques tandis que notre monde déjà structuré occupe une région centrale, est l'une des idées les plus originales d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Patricia Curd, 2007, essai 5, p. 214-237 ; Daniel Graham, 2006, p. 148-152.</ref>. == Le Noûs : l'Intellect cosmique == Le fragment B12 d'Anaxagore, le plus long et le plus célèbre de tous les fragments conservés, est entièrement consacré au Noûs (Νοῦς, « Intellect » ou « Esprit »). Ce passage, d'une grandeur solennelle et d'une intensité remarquable, constitue l'un des textes les plus puissants de toute la prose grecque archaïque<ref>Malcolm Schofield, ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980, p. 3-32 ; Karl Deichgräber, « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26.</ref>. Dans ce fragment, Anaxagore expose sa doctrine du Noûs comme principe du mouvement cosmogonique et source d'ordre dans l'univers. Le Noûs représente l'innovation philosophique la plus originale d'Anaxagore<ref>W. K. C. Guthrie, 1965, p. 272-279 ; Diogène Laërce, II, 6 (DK 59 A 1), rapporte qu'Anaxagore était surnommé « Monsieur Intellect » (ὁ Νοῦς) en raison de l'importance centrale qu'il donnait à cette notion.</ref>. Il convient d'emblée de préciser, afin d'éviter un contresens répandu dans la littérature secondaire ancienne comme moderne, que le Noûs d'Anaxagore est d'abord une ''cause motrice'' du cosmos : il initie et contrôle le mouvement rotatoire qui produit la séparation des ingrédients à partir du mélange originel. Anaxagore ne dit nulle part, dans les fragments conservés, que l'Intellect ordonne les choses ''parce qu'il serait meilleur qu'elles soient ainsi''. Or, c'est précisément cette affirmation que Socrate et Platon auraient voulu trouver chez le philosophe de Clazomènes, et dont ils lui reprocheront ensuite l'absence dans le passage célèbre du ''Phédon'' (97b-98c). La lecture proprement « téléologique » du Noûs, qui en fait une cause finale organisant le monde selon la Raison du Bien, est donc une reconstruction rétrospective, due à Platon puis à Aristote, et répercutée par toute une tradition doxographique postérieure. Elle projette sur Anaxagore les exigences explicatives du platonisme et de l'aristotélisme, exigences qu'Anaxagore ne partage pas sous cette forme. Plus fondamentalement encore, appliquer sans précaution aux présocratiques la distinction aristotélicienne des quatre causes (matérielle, formelle, efficiente, finale) relève d'un anachronisme conceptuel. Cette distinction est une construction d'Aristote, élaborée dans la ''Physique'' et la ''Métaphysique'' pour penser son propre rapport critique à ses prédécesseurs. La plupart des penseurs antérieurs à Aristote, Anaxagore compris, ne disposent pas d'un tel vocabulaire et n'organisent pas leur réflexion autour de cette quadripartition. Le Noûs d'Anaxagore ne peut être intégralement rangé dans aucune des quatre catégories aristotéliciennes : il est quelque chose comme une cause motrice doublée d'un principe ordonnateur, sans que cet ordre implique nécessairement une référence à un bien objectif. Il est donc plus juste de parler, comme le font les spécialistes contemporains, d'une fonction kinétique et cognitive du Noûs, plutôt que d'y voir la première formulation d'une téléologie rigoureuse<ref>Sur ce point, voir Patricia Curd, « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019), section sur le Noûs ; Malcolm Schofield, 1980, p. 55-70 ; James Lesher, « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142. Sur l'anachronisme que représente l'application des quatre causes aristotéliciennes aux physiciens présocratiques, voir l'article « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', éd. Daniel Graham, 2019. Cf. également Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, qui défend une lecture téléologique minimale et nuancée, restée minoritaire.</ref>. === La séparation du Noûs d'avec toutes choses === Le fragment B12 s'ouvre par une affirmation qui constitue la thèse fondamentale d'Anaxagore concernant le Noûs : <blockquote>Les autres choses ont une part de tout, mais le Noûs est illimité et autonome, et il n'a été mélangé à aucune chose, mais il existe seul, lui-même par lui-même.<ref>Anaxagore, fragment B12, cité par Simplicius, ''Commentaire sur la Physique'', 156, 13-15 (DK 59 B 12).</ref></blockquote> Cette phrase affirme que le Noûs constitue une exception au principe universel « tout est dans tout ». Tandis que toutes les substances matérielles contiennent en elles-mêmes des portions de toutes les autres substances, le Noûs, lui, demeure entièrement pur et séparé<ref>Anaxagore, B11 : « Dans toute chose il y a une part de toute chose, excepté le Noûs ; et il y a certaines choses dans lesquelles il y a aussi du Noûs ».</ref>. Trois attributs sont explicitement prédiqués du Noûs : il est « illimité » (ἄπειρον), « autonome » (αὐτοκρατές), et « non mélangé à aucune chose ». Anaxagore justifie cette séparation par un argument remarquable : <blockquote>Car s'il n'existait pas par lui-même, mais s'il avait été mélangé à quelque autre chose, il participerait de toutes les choses, s'il avait été mélangé à quoi que ce soit. Car dans toute chose il y a une part de toute chose, comme je l'ai dit précédemment. Et les choses mélangées avec lui l'empêcheraient, de sorte qu'il ne dominerait aucune chose de la même manière qu'il la domine en fait, étant seul par lui-même.<ref>Anaxagore, B12, lignes 156, 15-20.</ref></blockquote> L'argument procède ainsi : si le Noûs était mélangé à quoi que ce soit, il contiendrait une part de tout ; les substances mélangées l'empêcheraient d'exercer son pouvoir de contrôle ; or le Noûs exerce effectivement ce pouvoir ; donc le Noûs n'est mélangé à aucune chose<ref>Malcolm Schofield, 1980, p. 12-14 ; Jonathan Barnes, 1982, p. 375-377.</ref>. Plusieurs lectures de la prémisse cruciale, c'est-à-dire de la raison pour laquelle le mélange empêcherait l'action du Noûs, ont été proposées et ne sont pas incompatibles entre elles<ref>Patricia Curd, 2007, essai 5, p. 220-225 ; Christian Vassallo, « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32, aux pages 8-18.</ref>. === Les attributs du Noûs === Après avoir établi la séparation du Noûs, Anaxagore énonce une série d'attributs qui caractérisent sa nature. Le style employé ici est celui de la « prédication solennelle » (feierliche Prädikation), identifié par Karl Deichgräber comme caractéristique du style hymnico-religieux archaïque<ref>Karl Deichgräber, 1933, p. 16-22 ; Eduard Norden, ''Agnostos Theos'', Leipzig, Teubner, 1913, p. 3-29 ; Malcolm Schofield, 1980, p. 4-9.</ref> : <blockquote>Car il est le plus fin de toutes choses et le plus pur, et il possède toute connaissance à l'égard de toute chose et il a la plus grande force ; et toutes les choses qui ont une âme, les plus grandes comme les plus petites, toutes le Noûs les domine.<ref>Anaxagore, B12, lignes 156, 20-24.</ref></blockquote> Le premier attribut, qui qualifie le Noûs de « plus fin » et « plus pur » de toutes choses, a suscité des interprétations divergentes depuis l'Antiquité. Certains y voient l'affirmation, encore en gestation conceptuelle, de l'immatérialité du Noûs<ref>Aristote, ''De l'âme'', III, 4, 429a18-24 ; W. K. C. Guthrie, 1965, p. 278-279.</ref> ; d'autres, en s'appuyant sur le fait qu'Anaxagore utilise l'adjectif λεπτός ailleurs pour décrire l'eau de mer, soutiennent que ces termes doivent être pris en un sens physique : le Noûs serait alors une substance matérielle d'une extrême finesse et d'une grande pureté, proche des réalités les plus ténues du monde sensible<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-3 (DK 59 A 41) ; John Burnet, 1930, p. 268-269 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 27-33.</ref>. Une position médiane suggère qu'Anaxagore n'avait pas encore développé le concept d'incorporéité dans sa pleine rigueur conceptuelle, qui suppose une distinction nette du matériel et de l'immatériel élaborée plus tard par Platon, mais qu'il cherchait néanmoins à exprimer, avec les ressources linguistiques dont il disposait, l'idée que le Noûs est d'une nature fondamentalement différente de toutes les autres substances<ref>Malcolm Schofield, 1980, p. 18-22.</ref>. Le deuxième attribut, qui concerne la connaissance, affirme que le Noûs « possède toute connaissance à l'égard de toute chose » : il s'agit ici d'une forme d'omniscience cosmique. Le troisième, qui concerne la puissance, précise que le Noûs « a la plus grande force », cette force étant liée à sa connaissance selon un schéma que l'on retrouvera chez Aristote et qui fait de la puissance l'envers opératif du savoir<ref>Malcolm Schofield, 1980, p. 22-24.</ref>. Le quatrième attribut, qui concerne le contrôle exercé par le Noûs sur tous les êtres vivants, est cohérent avec le fragment B11, selon lequel il y a du Noûs dans certaines choses, c'est-à-dire dans les êtres animés<ref>Anaxagore, B11. Cf. Malcolm Schofield, 1980, p. 25-27 ; Patricia Curd, 2007, essai 5, p. 225-230.</ref>. === Le rôle cosmogonique du Noûs === Après avoir décrit la nature du Noûs, Anaxagore expose son rôle dans la cosmogonie : <blockquote>Et le Noûs a dominé la révolution entière, de sorte qu'elle a commencé à tourner au commencement. Et d'abord elle a commencé à tourner à partir d'une petite région, mais elle tourne sur une région plus grande, et elle tournera sur une région plus grande encore. Et toutes les choses qui étaient mélangées ensemble et séparées et distinguées, toutes le Noûs les a connues. Et toutes les choses qui devaient être, celles qui étaient, celles qui sont maintenant et celles qui seront, toutes le Noûs les a mises en ordre, et aussi cette révolution dans laquelle tournent maintenant les astres et le soleil et la lune et l'air et l'éther qui sont en train d'être séparés.<ref>Anaxagore, B12, lignes 156, 24-157, 3.</ref></blockquote> Ce passage affirme trois choses concernant l'activité cosmogonique du Noûs. D'abord, l'Intellect initie un mouvement de révolution (περιχώρησις) dans le mélange originel, jusqu'alors immobile. Ensuite, ce mouvement, commencé dans une petite région, s'est étendu progressivement et continue de s'étendre, ce qui implique que la cosmogonie n'est pas un événement ponctuel passé, mais un processus encore en cours dans les régions périphériques du mélange infini. Enfin, c'est ce mouvement qui a produit la séparation (ἀπόκρισις) et la distinction (διάκρισις) des ingrédients, donnant naissance au cosmos ordonné que nous observons<ref>Simplicius, ''Commentaire sur la Physique'', 300, 31-301, 1 ; Aristote, ''Physique'', VIII, 1, 250b24-252a5 (DK 59 A 64).</ref>. Le mécanisme cosmogonique proprement dit est d'ordre mécanique : c'est le mouvement rotatoire qui, par sa force centrifuge, sépare les substances denses des substances rares<ref>Anaxagore, B12, B13, B15, B16.</ref>. Le Noûs n'intervient donc pas directement dans chaque détail de la cosmogonie : il initie le mouvement rotatoire, et celui-ci produit ensuite mécaniquement la séparation et la réorganisation des substances. Cette répartition des rôles entre un principe moteur intelligent et un processus mécanique explique pourquoi Platon et Aristote pourront reprocher à Anaxagore de « laisser faire » la matière après avoir introduit l'Intellect : à leurs yeux, introduire une cause intelligente sans lui confier l'organisation détaillée du monde revient à lui refuser son rôle véritable<ref>Malcolm Schofield, 1980, p. 27-32 ; Daniel Graham, 2006, p. 148-152.</ref>. Le texte affirme cependant aussi que « le Noûs a mis en ordre » (διεκόσμησε νοῦς) toutes choses, passées, présentes et futures. Le verbe διακοσμεῖν signifie « mettre en ordre » ou « arranger ». Il ne faut pas en conclure trop vite à une téléologie au sens fort, comme si les choses étaient disposées en vue du bien : Anaxagore ne fournit pas, dans les fragments qui nous sont parvenus, un tel principe évaluatif. Le Noûs connaît et dispose, il est à la fois intelligent et ordonnateur, mais rien dans les textes n'indique qu'il ordonne les choses ''parce qu'elles seraient ainsi meilleures''. C'est précisément ce point qui sera au cœur de la critique platonicienne dans le ''Phédon'' et qu'il faut examiner avec soin<ref>Christian Vassallo, 2016, a défendu l'idée qu'il y aurait malgré tout une dimension téléologique faible chez Anaxagore ; cette lecture reste minoritaire et contestée. Voir au contraire la synthèse de Patricia Curd, ''SEP'' 2007 (révision substantielle 2019).</ref>. === La critique platonicienne et aristotélicienne === Dans le ''Phédon'', Platon fait raconter par Socrate sa déception à la lecture du livre d'Anaxagore : <blockquote>Un jour, j'entendis quelqu'un lire dans un livre d'Anaxagore, disant que c'est l'Intellect qui met tout en ordre et qui est la cause de toutes choses. Je fus ravi de cette cause, et il me sembla qu'il était en quelque sorte bon que l'Intellect fût la cause de tout ; et je pensai que, s'il en est ainsi, l'Intellect qui met tout en ordre doit tout ordonner et disposer chaque chose de la manière qui est la meilleure. [...] Mais cette merveilleuse espérance, mon ami, me fut enlevée lorsque, progressant dans ma lecture, je vis que cet homme ne fait aucun usage de l'Intellect, qu'il ne lui attribue aucune responsabilité dans la mise en ordre des choses, mais qu'il allègue comme causes l'air, l'éther, l'eau et beaucoup d'autres choses absurdes.<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref></blockquote> Ce passage est capital, et il faut en saisir exactement la portée pour éviter le contresens le plus tenace de la tradition exégétique. Socrate ne dit pas qu'Anaxagore avait effectivement proposé une explication par le « meilleur » et qu'il y aurait manqué dans le détail : il dit qu'il ''espérait'' trouver une telle explication, et qu'il fut déçu de ne pas la trouver. La formule « doit tout ordonner et disposer chaque chose de la manière qui est la meilleure » exprime donc l'attente socratique, c'est-à-dire ce que Socrate aurait voulu lire, non la doctrine effective d'Anaxagore. La nuance est décisive. Le texte d'Anaxagore, dans les fragments que nous possédons, affirme que le Noûs connaît toutes choses et qu'il les met en ordre par l'intermédiaire du tourbillon cosmogonique. Il n'affirme pas que cet ordre soit le meilleur possible, ni que le Noûs vise le bien en produisant cet ordre. C'est Socrate qui, lisant Anaxagore, projette ses propres attentes philosophiques : si le monde est ordonné par un Intellect, pense Socrate, alors il doit l'être en vue du bien, puisqu'un Intellect rationnel ne peut que vouloir le meilleur. Cette inférence paraît évidente à Socrate, mais elle n'est pas anaxagoréenne. La lecture qui fait du Noûs d'Anaxagore une « cause téléologique » ou une « cause finale » est, par conséquent, une reconstruction rétrospective qui projette sur le Clazoménien les exigences platoniciennes (le Bien comme cause) puis aristotéliciennes (la cause finale comme l'une des quatre causes)<ref>Malcolm Schofield, 1980, p. 55-70 ; James Lesher, 1995, p. 125-142 ; Patricia Curd, ''SEP'', 2007 (révision substantielle 2019).</ref>. Il faut ici distinguer deux choses qui sont souvent confondues : d'une part, l'attribution au Noûs d'un rôle moteur et cognitif, qui est effectivement anaxagoréenne ; d'autre part, l'attribution au Noûs d'un principe évaluatif selon lequel le monde serait disposé en vue du meilleur, qui ne l'est pas. Le reproche socratique ne consiste donc pas à accuser Anaxagore d'incohérence interne (avoir posé une téléologie puis l'avoir abandonnée), mais à regretter qu'il n'ait pas poussé sa pensée jusqu'à la téléologie que Socrate lui aurait souhaitée. La différence est subtile mais philosophiquement essentielle : elle marque le lieu précis où la pensée présocratique cède la place à la pensée classique. Aristote reprend et durcit la critique dans la ''Métaphysique'' : <blockquote>Anaxagore utilise l'Intellect comme un ''deus ex machina'' pour la fabrication du monde ; et quand il est embarrassé pour expliquer pourquoi quelque chose est nécessairement ainsi, il le fait intervenir. Mais dans tous les autres cas, il allègue comme causes toutes sortes de choses plutôt que l'Intellect.<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref></blockquote> Le reproche d'Aristote, comme celui de Socrate-Platon, présuppose un idéal explicatif téléologique qui n'est pas celui d'Anaxagore. Il ne faut donc pas conclure qu'Anaxagore « introduit le Noûs comme cause téléologique puis échoue à l'utiliser » : il introduit le Noûs comme cause motrice et ordonnatrice, et ses critiques l'accusent de ne pas avoir ''aussi'' développé une explication par le meilleur qu'eux attendent. Cette distinction entre la doctrine effective d'Anaxagore et la doctrine que ses successeurs auraient voulu lire chez lui commande toute l'interprétation correcte de son héritage : l'histoire de la téléologie philosophique ne commence pas, en toute rigueur, avec Anaxagore, mais avec la déception philosophique de Socrate face à Anaxagore, puis avec la construction proprement platonicienne du Démiurge et aristotélicienne du Premier Moteur. === Synthèse : l'innovation du Noûs === L'introduction du Noûs par Anaxagore constitue une innovation philosophique à plusieurs titres. Premièrement, Anaxagore est, parmi les penseurs grecs dont nous avons conservé les doctrines, le premier à poser explicitement l'existence d'une entité qui, bien qu'elle agisse sur la matière, n'est mélangée à aucune substance matérielle<ref>W. K. C. Guthrie, 1965, p. 278-279 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33.</ref>. Cette conception préparera, sans y être pour autant équivalente, les doctrines ultérieures de l'âme immatérielle chez Platon et de l'intellect séparé chez Aristote<ref>Platon, ''Phédon'', 78b-84b ; Aristote, ''De l'âme'', III, 5, 430a10-25. Cf. Edward Hussey, ''The Presocratics'', Londres, Duckworth, 1972, p. 138-141.</ref>. Deuxièmement, Anaxagore identifie une cause unique pour le mouvement cosmique et l'ordre qui en résulte<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20, qualifie cette innovation de « sobre ».</ref>. En désignant le principe cosmique par le terme Νοῦς, mot habituellement associé à l'intelligence et à la pensée, Anaxagore suggère que l'ordre du monde n'est pas aveugle : il y a dans le cosmos quelque chose d'intelligent qui connaît et qui dispose. C'est cette suggestion qui sera reprise et radicalisée par Socrate, Platon et Aristote, au prix d'une transformation dont il faut reconnaître qu'elle va au-delà de ce qu'affirme Anaxagore lui-même<ref>Malcolm Schofield, 1980, p. 3-32 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. == La cosmogonie et la cosmologie == La cosmogonie et la cosmologie d'Anaxagore constituent l'application de ses principes métaphysiques. Dans ces domaines, Anaxagore se montre à la fois héritier de la tradition ionienne et novateur, proposant des explications naturalistes des phénomènes célestes et météorologiques<ref>W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 301-331 ; Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 34-55.</ref>. === Le mouvement rotatoire cosmogonique === Le processus cosmogonique commence lorsque le Noûs initie un mouvement de rotation (περιχώρησις) dans le mélange originel<ref>Anaxagore, fragment B12 (DK 59 B 12).</ref>. Ce mouvement rotatoire ne doit pas être conçu comme une simple rotation uniforme de l'ensemble du mélange, mais comme un tourbillon (δῖνος) ou un vortex dont la vitesse et l'étendue augmentent progressivement<ref>Aristote, ''Du Ciel'', II, 13, 295a9-14 (DK 59 A 88).</ref>. Anaxagore affirme que ce mouvement initial était d'une rapidité extraordinaire : « Rien de ce qui existe maintenant chez les hommes n'est aussi rapide, mais [il était] certainement plusieurs fois plus rapide »<ref>Anaxagore, fragment B9 (DK 59 B 9).</ref>. Le mécanisme de la séparation cosmogonique est mécanique. Le mouvement rotatoire produit une force centrifuge qui pousse les substances rares vers la périphérie et attire les substances denses vers le centre<ref>Anaxagore, B12, B15 ; Aristote, ''Du Ciel'', III, 2, 300b1-8 (DK 59 A 88).</ref>. Le fragment B15 décrit ce processus : <blockquote>Le dense et l'humide et le froid et l'obscur se rassemblèrent ici, là où maintenant est la terre, tandis que le rare et le chaud et le sec se retirèrent vers les régions lointaines de l'éther.<ref>Anaxagore, fragment B15 (DK 59 B 15).</ref></blockquote> Ce processus de séparation n'est jamais achevé. Conformément au principe que « rien n'est complètement séparé » (fragment B8), la rotation continue indéfiniment à produire des séparations et des mélanges partiels<ref>Anaxagore, B8, B12.</ref>. === La formation de la terre === Au centre du tourbillon cosmique, les substances denses, humides, froides et obscures se sont concentrées pour former la terre<ref>Anaxagore, B15 ; Aristote, ''Du Ciel'', III, 2, 300b8-16 (DK 59 A 88).</ref>. Selon Anaxagore, la terre a la forme d'un disque plat<ref>Hippolyte, ''Réfutation de toutes les hérésies'', I, 8, 3 (DK 59 A 42) ; Aristote, ''Du Ciel'', II, 13, 294b13-15 (DK 59 A 88).</ref>, conception traditionnelle dans la cosmologie ionienne<ref>Charles Kahn, ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960, p. 76-116 ; Daniel Graham, 2006, p. 93-102.</ref>. Anaxagore répond à la question de la stabilité de la terre en affirmant qu'elle demeure immobile parce qu'elle repose sur l'air (ἀήρ) qui la supporte<ref>Aristote, ''Du Ciel'', II, 13, 294b13-21 (DK 59 A 88) : « Anaxagore dit que la terre demeure immobile en raison de son égalité et de la grandeur, car elle ne coupe pas l'air mais le couvre comme un couvercle ».</ref>. Anaxagore aurait même effectué des démonstrations expérimentales avec des clepsydres pour montrer que l'air possède une résistance élastique capable de supporter des corps<ref>Aristote, ''Physique'', IV, 6, 213a22-27 (DK 59 A 68) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 40-43.</ref>. === La formation des corps célestes === Les corps célestes, soleil, lune et étoiles, se sont formés à partir des substances rares, chaudes et sèches projetées vers la périphérie par la force du tourbillon cosmique<ref>Anaxagore, B15 ; Hippolyte, DK 59 A 42.</ref>. Selon cette théorie, les astres ne sont pas des êtres divins mais des masses de pierre ou de métal incandescent, rougies par leur mouvement rapide à travers l'éther<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42. Cette thèse est l'une de celles qui fonderont, selon Plutarque, les accusations d'impiété contre Anaxagore.</ref>. Anaxagore soutenait que le soleil est une masse de pierre ou de métal incandescent<ref>Platon, ''Apologie'', 26d (DK 59 A 35) ; Hippolyte, DK 59 A 42 ; Diogène Laërce, II, 8 (DK 59 A 1) ; Aétius, II, 20, 6 (DK 59 A 72).</ref>. Quant à sa taille, Anaxagore estimait qu'« il est plus grand que le Péloponnèse »<ref>Aétius, II, 21, 3 (DK 59 A 72) ; Plutarque, ''Vie de Périclès'', 6, 2 (DK 59 A 1).</ref>, affirmation qui devait paraître extravagante aux Grecs de son époque, habitués à voir dans le soleil un astre de dimensions modestes. Anaxagore sous-estimait bien sûr très considérablement la taille réelle du soleil, mais l'audace consistait à oser le comparer à une portion de la terre grecque plutôt qu'à un simple disque lumineux. La lune, selon Anaxagore, est elle aussi un corps rocheux, semblable à la terre<ref>Platon, ''Apologie'', 26d ; Hippolyte, DK 59 A 42.</ref>. Contrairement au soleil, la lune ne produit pas sa propre lumière : elle brille par réflexion de la lumière solaire<ref>Plutarque, ''Contre Colotès'', 1116a-b (DK 59 A 77) ; Hippolyte, DK 59 A 42. L'attribution exclusive de cette découverte à Anaxagore doit être nuancée : certains témoignages anciens la rapportent également à Parménide (DK 28 B 14-15), et la question de la priorité reste discutée. Voir Daniel Graham, ''Science before Socrates'', 2006, p. 115-116.</ref>. Cette thèse permit à Anaxagore, qu'il en soit ou non le premier découvreur, d'expliquer correctement les phases lunaires et la mécanique des éclipses<ref>Hippolyte, DK 59 A 42 ; Aétius, II, 29, 6 (DK 59 A 77).</ref>. Une éclipse de lune se produit lorsque la terre s'interpose entre le soleil et la lune, projetant son ombre sur celle-ci<ref>Hippolyte, DK 59 A 42. Cf. Dirk Couprie, « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147.</ref>. Une éclipse de soleil se produit inversement lorsque la lune s'interpose entre le soleil et la terre<ref>Hippolyte, DK 59 A 42 ; Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18).</ref>. Ces explications, fondées sur une compréhension correcte de la géométrie des positions relatives du soleil, de la terre et de la lune, représentent une avancée considérable dans l'histoire de l'astronomie grecque<ref>W. K. C. Guthrie, 1965, p. 313-316 ; Daniel Graham, 2006, p. 149-150.</ref>. Selon la tradition doxographique, Anaxagore aurait même prédit une éclipse solaire<ref>Plutarque, ''Vie de Périclès'', 35, 2 (DK 59 A 18). La tradition évoque plusieurs éclipses possibles au V{{e}} siècle av. J.-C., sans que l'on puisse identifier avec certitude celle dont il s'agit. Les historiens modernes sont pour la plupart sceptiques quant à la possibilité qu'Anaxagore ait pu effectuer une prédiction précise, faute d'un modèle astronomique suffisamment développé. Cf. W. K. C. Guthrie, 1965, p. 314, note 1 ; Daniel Graham, 2006, p. 150, note 25.</ref>. Anaxagore soutenait enfin que la surface de la lune présente des irrégularités analogues à celles de la terre, montagnes et vallées, intuition que les observations télescopiques confirmeront deux millénaires plus tard<ref>Aétius, II, 30, 2 (DK 59 A 77).</ref>. La Voie lactée s'explique selon Anaxagore par l'ombre que projette la terre dans l'espace : dans les régions du ciel situées dans l'ombre de la terre, le soleil ne peut éclairer les étoiles ; celles-ci deviennent donc toutes visibles, même les plus faibles<ref>Aristote, ''Météorologiques'', I, 8, 345a25-31 (DK 59 A 80). Cf. Dirk Couprie, 2017.</ref>. === Le météorite d'Aigos Potamos === L'événement qui contribua à établir la réputation d'Anaxagore fut la chute d'un météorite de grande taille à Aigos Potamos, sur la rive européenne de l'Hellespont, vers 467 avant notre ère<ref>Pline l'Ancien, ''Histoire naturelle'', II, 149 (DK 59 A 11) ; Plutarque, ''Vie de Lysandre'', 12 (DK 59 A 12) ; Diogène Laërce, II, 10 (DK 59 A 1).</ref>. Selon les témoignages anciens, Anaxagore aurait prédit cette chute. Les historiens modernes sont divisés sur cette question : certains pensent qu'il s'agit d'une légende élaborée après coup, d'autres estiment qu'Anaxagore avait peut-être observé qu'un objet céleste se fragmentait<ref>Daniel W. Graham et Eric Hintz, « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Evangelos Th. Theodossiou et al., « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140.</ref>. Quoi qu'il en soit, la chute du météorite fut associée au nom d'Anaxagore et parut confirmer sa théorie selon laquelle les corps célestes sont faits de pierre. === Météorologie === Anaxagore consacra une partie considérable de son traité à l'explication des phénomènes météorologiques. Les nuages se forment par évaporation de l'eau sous l'effet de la chaleur solaire<ref>Aétius, III, 4, 1 (DK 59 A 82).</ref>. La pluie provient de la condensation de la vapeur d'eau contenue dans les nuages<ref>Anaxagore, fragment B16 (DK 59 B 16).</ref>. La formation de la grêle posait un problème particulier : comment de la glace peut-elle se former en été ? Anaxagore proposa une explication ingénieuse : lors des journées très chaudes, des courants d'air ascendants peuvent pousser les nuages à des altitudes très élevées, où l'air est suffisamment froid pour que l'eau gèle<ref>Aétius, III, 4, 1 (DK 59 A 84) ; Aristote, ''Météorologiques'', I, 12, 348b23-349a11 (critique de la théorie d'Anaxagore).</ref>. Cette théorie, bien que partiellement erronée dans ses détails, témoigne d'une compréhension correcte du principe de convection. Le tonnerre et l'éclair sont causés, selon Anaxagore, par la chute de l'éther dans les nuages<ref>Aétius, III, 3, 3 (DK 59 A 84) ; Hippolyte, DK 59 A 42.</ref>. Cette explication reconnaît correctement que l'éclair précède le tonnerre, la vue étant plus rapide que l'ouïe<ref>Sénèque, ''Questions naturelles'', II, 22 (citant Anaxagore).</ref>. Les tremblements de terre sont causés, selon Anaxagore, par de l'éther chaud piégé sous la surface de la terre<ref>Aristote, ''Météorologiques'', II, 7, 365a19-21 (DK 59 A 89).</ref>. === Hydrologie et géologie === Anaxagore proposa une explication de la crue annuelle du Nil : les crues estivales sont causées par la fonte des neiges dans les régions montagneuses situées à la source du fleuve<ref>Diodore de Sicile, I, 38, 4 (attribution explicite à Anaxagore) ; Daniel Gershenson et Daniel Greenberg, 1964, p. 54.</ref>. Cette explication est essentiellement correcte. La mer, selon Anaxagore, existait dès le début, mais sa salinité actuelle provient de l'évaporation de l'eau douce sous l'effet du soleil<ref>Hippolyte, DK 59 A 42.</ref>. === Synthèse : la cosmologie naturaliste d'Anaxagore === La cosmologie d'Anaxagore se caractérise par trois traits fondamentaux. Premièrement, l'unité de la nature : Anaxagore affirme que les corps célestes sont constitués des mêmes substances que la terre et obéissent aux mêmes lois physiques<ref>Hippolyte, DK 59 A 42 ; Daniel Gershenson et Daniel Greenberg, 1964, p. 23-26, 47-48.</ref>. Il n'existe pas de différence ontologique entre le monde sublunaire et le monde supralunaire, contrairement à ce qu'affirmera plus tard Aristote<ref>Aristote, ''Du Ciel'', I, 2-3, 268b11-270b25.</ref>. Deuxièmement, l'explication mécanique : tous les phénomènes cosmologiques et météorologiques sont expliqués par des processus physiques (rotation, séparation par densité, évaporation, condensation), sans recours à des agents divins<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 23-33.</ref>. Troisièmement, l'usage systématique de l'analogie : Anaxagore explique les phénomènes cosmiques par analogie avec des phénomènes terrestres observables<ref>Daniel Gershenson et Daniel Greenberg, 1964, p. 7-12.</ref>. Ces traits donnent à la cosmologie d'Anaxagore un caractère naturaliste marqué, qui représente une étape importante dans le développement d'une explication physique de la nature. Il convient toutefois de ne pas surestimer sa portée : parler d'Anaxagore comme d'un « fondateur de la méthode scientifique » (selon une expression qu'on trouve parfois dans la littérature) relève d'une certaine emphase rétrospective, qu'il vaut mieux tempérer en parlant plutôt d'un jalon dans une longue histoire où se combinent intuitions fécondes et erreurs caractéristiques de l'époque. == La physiologie et la biologie == Bien qu'Anaxagore soit surtout connu pour ses théories cosmologiques et météorologiques, les témoignages anciens indiquent qu'il consacra aussi une partie considérable de son traité à l'explication des phénomènes biologiques et physiologiques<ref>Daniel Gershenson et Daniel Greenberg, ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964, p. 55-57 ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 316-320.</ref>. === La théorie de la nutrition === L'une des questions biologiques les plus importantes qu'Anaxagore chercha à élucider est celle de la nutrition : comment l'alimentation se transforme-t-elle en chair, en os, en cheveux et en toutes les autres parties du corps ? Selon les témoignages d'Aristote et de la tradition doxographique, Anaxagore partait de l'observation que les êtres humains et les animaux se nourrissent d'aliments relativement simples (pain, eau) et que de ces aliments proviennent pourtant toutes les parties complexes et diversifiées de leur corps<ref>Simplicius, ''Commentaire sur la Physique'', 27, 2-11 (DK 59 A 45) : « Car comment, disait-il, des cheveux pourraient-ils provenir de ce qui n'est pas cheveu, et de la chair de ce qui n'est pas chair ? ». Cf. Aétius, I, 3, 5 (DK 59 A 46) ; Lucrèce, ''De la nature'', I, 834-838.</ref>. Cette observation posait un problème philosophique considérable au regard de l'interdit parménidien : il semble en effet qu'une substance nouvelle (la chair) naisse à partir d'une substance qui n'était pas chair (le pain), ce qui contredit le principe « rien ne naît de ce qui n'est pas ». La réponse d'Anaxagore était cohérente avec sa métaphysique générale : le pain doit déjà contenir de la chair, du sang, des os, des cheveux, et toutes les autres substances corporelles, bien que ces constituants y soient présents en quantités si infimes qu'ils demeurent imperceptibles<ref>Simplicius, ''Commentaire sur la Physique'', 460, 4-12 (DK 59 A 45).</ref>. Lorsque nous mangeons du pain, le corps extrait du pain les particules de chair qu'il contient déjà, et les ajoute à la chair existante<ref>Aristote, ''Génération des animaux'', I, 18, 723a6-11 (DK 59 A 45).</ref>. Cette théorie soulève évidemment d'autres difficultés : comment le corps sait-il extraire précisément les particules de chair du pain, et les diriger vers les muscles plutôt que vers les os ? Anaxagore attribuait cette fonction au Noûs présent dans chaque organisme vivant<ref>Cf. section « Le Noûs : l'Intellect cosmique ». Daniel Gershenson et Daniel Greenberg, 1964, p. 27-33, 55-56.</ref>. === La théorie de la perception sensorielle === Anaxagore élabora aussi une théorie originale de la perception sensorielle, fondée sur le principe que « le semblable n'est pas affecté par le semblable, mais les contraires sont affectés les uns par les autres »<ref>Théophraste, ''De Sensibus'', 27 (DK 59 A 92) ; Aristote, ''De l'âme'', III, 3, 427a21-26 (DK 59 A 94).</ref>. Ce principe constituait une réponse directe aux théories de ses prédécesseurs, notamment Empédocle, qui soutenait que la perception se produit par similitude<ref>Théophraste, ''De Sensibus'', 1-2 (DK 31 A 86).</ref>. Selon Anaxagore, pour qu'une perception ait lieu, il doit exister une différence entre l'organe sensoriel et l'objet perçu<ref>Théophraste, ''De Sensibus'', 27-28 (DK 59 A 92).</ref>. Nous ne sentons pas la température de l'air lorsqu'elle est exactement égale à celle de notre peau ; c'est seulement lorsqu'il existe une différence que nous percevons le chaud ou le froid<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92).</ref>. Une conséquence remarquable de cette théorie est qu'Anaxagore considérait que toute perception s'accompagne nécessairement de douleur ou d'un certain désagrément (λύπη)<ref>Théophraste, ''De Sensibus'', 29 (DK 59 A 92). Cf. W. K. C. Guthrie, 1965, p. 319 ; Inna Kupreeva, « Sensing the World », dans ''Physis and Psyche in Plato and Aristotle'', Londres, Bloomsbury, 2024, p. 95-114.</ref>. === La reproduction et l'embryologie === Anaxagore proposa en outre des théories sur la reproduction et le développement embryonnaire. Selon les témoignages anciens, il soutenait que le sexe de l'enfant est déterminé par le père seul, et non par la mère<ref>Aétius, V, 7, 1 (DK 59 A 107) ; Hippolyte, DK 59 A 42.</ref>. Cette théorie n'était pas entièrement originale, puisque des idées similaires avaient été proposées par Parménide et d'autres penseurs antérieurs<ref>Aétius, V, 7, 1 (DK 28 A 52-54). Cf. Ursula Mittwoch, « Sex Determination », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Oliver Kember, « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14.</ref>. === La génération des animaux et des plantes === Selon les témoignages doxographiques, Anaxagore distinguait entre la zoogonie originelle, c'est-à-dire la première génération des animaux, et la reproduction ultérieure par semences<ref>Hippolyte, DK 59 A 42 ; Aétius, V, 19, 4 (DK 59 A 42).</ref>. Dans la zoogonie originelle, les premiers animaux émergèrent de la terre encore chaude et humide, grâce aux semences (σπέρματα) contenues dans l'air et l'éther<ref>Théophraste, dans Simplicius, ''Commentaire sur la Physique'', 27, 2-4.</ref>. En ce qui concerne les plantes, Anaxagore affirmait qu'elles possèdent une âme (ψυχή) et un intellect (νοῦς)<ref>Aétius, V, 26, 4 (DK 59 A 117).</ref>. Cette conclusion découlait de ses observations du comportement des plantes : elles se tournent vers la lumière du soleil, étendent leurs racines vers l'eau<ref>Aristote, ''De l'âme'', I, 5, 410b27-411a7. Cf. Inna Kupreeva, 2024, p. 98-103.</ref>. === Observations biologiques diverses === Les sources anciennes conservent enfin quelques observations biologiques isolées d'Anaxagore. Il soutenait, par exemple, que les belettes sont les seuls animaux qui donnent naissance par la bouche<ref>Aristote, ''Histoire des animaux'', VI, 32, 580a15-17 (DK 59 A 114) ; Plutarque, ''Œuvres morales'', 975F-976A (DK 59 A 114).</ref>. Il était parvenu à cette conclusion erronée parce qu'il avait observé des belettes femelles transportant leurs petits dans leur gueule immédiatement après la mise bas<ref>Plutarque, ''Œuvres morales'', 975F (DK 59 A 114).</ref>. De même, il affirmait que les corbeaux et les ibis s'accouplent par le bec<ref>Aristote, ''Histoire des animaux'', V, 2, 539b31-540a1 (DK 59 A 114).</ref>. Ces erreurs montrent les limites de sa méthode empirique. === L'homme et les animaux === Selon Anaxagore, ce qui distingue l'homme du reste du règne animal est principalement l'une des distinctions physiologiques les plus évidentes : les mains de l'homme<ref>Aristote, ''Parties des animaux'', IV, 10, 687a7-12 (DK 59 A 102). Aristote critique cette position et affirme au contraire que l'homme a des mains parce qu'il est le plus intelligent.</ref>. Ce sont les mains, selon Anaxagore, qui permettent à l'homme de surpasser les animaux dans les compétences manipulatrices et les capacités techniques. == L'influence et la postérité == Anaxagore occupe une place importante dans l'histoire de la philosophie antique. Introducteur à Athènes de la tradition ionienne de recherche naturaliste, il constitue un jalon dans le développement de la pensée grecque du V{{e}} siècle<ref>Diogène Laërce, II, 6 (DK 59 A 1) ; W. K. C. Guthrie, ''A History of Greek Philosophy'', vol. II, Cambridge, Cambridge University Press, 1965, p. 266-267.</ref>. Les lignes qui suivent s'efforcent de décrire son influence avec la prudence philologique nécessaire : il est facile, en traitant des présocratiques, de céder à la tentation des grandes filiations, alors que la documentation réelle invite souvent à plus de retenue. === La transmission immédiate : Archélaos et le cercle socratique === Le premier vecteur de l'influence d'Anaxagore fut son disciple direct Archélaos d'Athènes (parfois dit aussi « de Milet »), qui enseigna à Athènes après le départ de son maître pour Lampsaque<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Simplicius, ''Commentaire sur la Physique'', 27, 23 (DK 60 A 7). La formule que l'on rencontre parfois, selon laquelle Archélaos aurait « succédé à Anaxagore à Lampsaque », n'est pas documentée par les sources : Archélaos est attesté comme actif à Athènes, où il aurait été le maître de Socrate. Sur ce point, voir Gábor Betegh, « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40.</ref>. Selon plusieurs témoignages anciens, Archélaos aurait été le maître de Socrate, ce qui établit un lien biographique, quoique indirect, entre Anaxagore et le fondateur de la philosophie morale<ref>Diogène Laërce, II, 16 (DK 60 A 1). Ion de Chios rapporte que le jeune Socrate voyagea avec Archélaos à Samos (DK 60 A 3).</ref>. Archélaos semble avoir développé et modifié certaines doctrines de son maître, en particulier en appliquant les principes anaxagoréens à l'éthique et aux institutions sociales, orientation qui anticipe peut-être le tournant moral pris ensuite par Socrate<ref>Diogène Laërce, II, 16 (DK 60 A 1) ; Hippolyte, DK 60 A 4 ; Gábor Betegh, 2016.</ref>. === L'influence sur Socrate : espoirs et déceptions === La relation entre Anaxagore et Socrate a probablement été indirecte, médiée par la lecture du livre. Dans le ''Phédon'', Platon fait raconter par Socrate sa rencontre avec la pensée d'Anaxagore, rencontre qui suscita d'abord un enthousiasme puis une déception<ref>Platon, ''Phédon'', 97b-98c (DK 59 A 47).</ref>. Comme on l'a souligné plus haut, cette déception porte sur une attente proprement socratique, celle d'une explication par le « meilleur », qu'Anaxagore n'avait pas, à proprement parler, formulée dans les termes que Socrate aurait voulus. Cette critique conduisit Socrate à se tourner vers la philosophie morale et la recherche de la cause finale, c'est-à-dire du Bien qui rendrait compte de l'ordre du monde<ref>Platon, ''Phédon'', 99c-100a. Cf. David Sedley, « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383.</ref>. L'idée qu'un principe rationnel puisse gouverner l'univers, idée que Socrate trouve chez Anaxagore et qu'il juge insuffisamment exploitée, a pu orienter le projet socratique sans qu'il faille pour autant présenter Anaxagore comme sa cause nécessaire<ref>David Sider, « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the CHS'', 2016 ; W. K. C. Guthrie, 1965, p. 327-331.</ref>. Dans l'''Apologie'', l'accusation portée contre Socrate inclut l'imputation de théories cosmologiques manifestement inspirées d'Anaxagore, ce qui montre l'association étroite entre les deux penseurs dans l'esprit des Athéniens, indépendamment de la distance philosophique réelle qui les sépare<ref>Platon, ''Apologie de Socrate'', 26d (DK 59 A 35). Cf. Gregory Vlastos, ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991, p. 293-297.</ref>. Xénophon présente pour sa part Socrate comme mettant en garde ses disciples contre l'étude des phénomènes célestes à la manière d'Anaxagore, ce qui laisse entendre que Socrate lui-même s'était explicitement démarqué de la philosophie naturelle anaxagoréenne<ref>Xénophon, ''Mémorables'', IV, 7, 6 (DK 59 A 47).</ref>. === L'appropriation platonicienne : du Noûs au Démiurge === Platon s'empare de la doctrine anaxagoréenne du Noûs et la transforme, en la radicalisant, en une cosmologie téléologique pleinement articulée. Dans le ''Timée'', Platon présente le Démiurge, cet artisan divin qui façonne le monde sensible à l'image des Formes éternelles, comme une figure qu'on peut lire en dialogue avec le Noûs anaxagoréen<ref>Platon, ''Timée'', 29a-30c, 47e-48a. Cf. Glenn Morrow, « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Luc Brisson, ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974, p. 87-125.</ref>. Il convient toutefois d'être prudent. La téléologie platonicienne va en effet bien au-delà de ce qu'affirmait Anaxagore : le Démiurge contemple les Formes éternelles pour façonner le monde, et cet arrière-plan métaphysique d'essences intelligibles n'a pas d'équivalent chez le Clazoménien, dont le Noûs demeure un principe moteur et cognitif, mais non un principe qui « voit » des réalités intelligibles préalables à son action. Dans le ''Philèbe'', Platon affirme explicitement sa dette envers Anaxagore en déclarant que « l'Intellect est roi du ciel et de la terre »<ref>Platon, ''Philèbe'', 28c (DK 59 A 47). Cf. également ''Cratyle'', 413c.</ref>, reprenant ainsi la doctrine anaxagoréenne selon laquelle « le Noûs domine tout »<ref>Anaxagore, B12 (DK 59 B 12).</ref>. Dans les ''Lois'', Platon fait l'éloge des « anciens » qui ont découvert que « l'Intellect gouverne toutes choses », allusion probable à Anaxagore<ref>Platon, ''Lois'', X, 897b-c, XII, 967b-c. Cf. Malcolm Schofield, 1980, p. 55-70.</ref>. L'influence d'Anaxagore sur Platon est donc réelle, mais elle passe par une transformation considérable de la doctrine originelle : le Noûs anaxagoréen, simple cause motrice, devient chez Platon un Intellect qui contemple le Bien et façonne le monde selon le meilleur ordre possible. Le passage d'Anaxagore à Platon est celui qui fait naître, en toute rigueur, la tradition téléologique de la philosophie occidentale. === La critique aristotélicienne === Aristote, tout en reconnaissant l'importance historique d'Anaxagore, fut l'un de ses critiques les plus sévères. Dans la ''Métaphysique'', il salue Anaxagore comme « un homme sobre parmi des bavards »<ref>Aristote, ''Métaphysique'', I, 3, 984b15-20 (DK 59 A 43).</ref>, louant son introduction du Noûs comme cause de l'ordre cosmique. Mais cette louange est immédiatement suivie d'une critique : Anaxagore « utilise l'Intellect comme un ''deus ex machina'' »<ref>Aristote, ''Métaphysique'', I, 4, 985a18-21 (DK 59 A 47).</ref>. Comme on l'a vu, cette critique présuppose un idéal téléologique qui n'est pas celui d'Anaxagore lui-même. Aristote adopte en revanche, en le reformulant, le terme technique homéomère (ὁμοιομερής) pour désigner les substances anaxagoréennes, bien qu'il soit probable qu'Anaxagore lui-même n'ait jamais utilisé ce mot<ref>Cf. Malcolm Schofield, 1980, p. 87-108.</ref>. La distinction que la tradition anaxagoréenne a léguée, entre substances homéomères (chair, os, sang) et substances anhoméomères (main, pied, visage), devient ainsi fondamentale dans la philosophie naturelle aristotélicienne, où elle servira à articuler l'analyse des parties du vivant<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314a20-b1 ; ''Parties des animaux'', II, 1, 646a12-24.</ref>. === L'héritage dans la philosophie hellénistique et romaine === Après Aristote, la pensée d'Anaxagore continua d'exercer une influence diffuse. Les Stoïciens s'approprièrent certains aspects de sa doctrine du Noûs pour développer leur propre concept du Logos universel qui pénètre et gouverne toute la nature<ref>Diogène Laërce, VII, 134-139 (SVF II, 634) ; Cicéron, ''De la nature des dieux'', I, 11, 27 ; II, 8, 23. Cf. A. A. Long et D. N. Sedley, ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987, p. 268-274.</ref>. Le pneuma stoïcien présente des analogies avec le Noûs anaxagoréen, bien que les Stoïciens aient rejeté le dualisme matière/esprit d'Anaxagore en faveur d'un matérialisme intégral<ref>Michael J. White, « Stoic Natural Philosophy », dans Brad Inwood (éd.), ''The Cambridge Companion to the Stoics'', Cambridge, Cambridge University Press, 2003, p. 124-152.</ref>. Les Épicuriens, en revanche, rejetèrent la doctrine anaxagoréenne. Lucrèce critique explicitement Anaxagore dans le ''De natura rerum''<ref>Lucrèce, ''De la nature'', I, 830-920 (DK 59 A 44). Cf. David Sedley, ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998, p. 24-33.</ref>. Dans la tradition néoplatonicienne, Anaxagore fut lu à travers le prisme de Platon. Simplicius, au VI{{e}} siècle de notre ère, consacra de longs passages de son commentaire sur la ''Physique'' d'Aristote à l'exégèse des fragments d'Anaxagore ; c'est d'ailleurs grâce à ces commentaires que la majeure partie de notre connaissance d'Anaxagore nous est parvenue<ref>Simplicius, ''Commentaire sur la Physique'' (passim).</ref>. === Un héritage à ne pas surinterpréter === Il est tentant de présenter Anaxagore comme un précurseur de la science mécaniste moderne, de l'atomisme, voire de la physique contemporaine. Il faut résister à cette tentation, au moins dans sa forme la plus large. Au XVII{{e}} siècle, certains philosophes mécanistes ont effectivement cité les présocratiques pour légitimer leur programme, mais c'est l'atomisme de Démocrite et de Leucippe, médiatisé par Épicure et par Lucrèce, qui a exercé une influence directe sur la physique corpusculaire naissante de Gassendi, Boyle et Newton. L'influence propre d'Anaxagore sur cette tradition reste, pour l'essentiel, limitée et indirecte : sa doctrine de la divisibilité infinie et du mélange universel s'oppose d'ailleurs aux postulats fondamentaux de l'atomisme classique, et c'est précisément cette opposition qui la rendait peu exploitable pour les mécanistes modernes<ref>Alan Chalmers, « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Andrew Pyle, ''Atomism and its Critics : From Democritus to Newton'', Bristol, Thoemmes Press, 1997.</ref>. On trouve aussi, ici ou là, des rapprochements entre la doctrine anaxagoréenne du « tout dans tout » et certaines idées de la physique moderne : théorie des champs, intrication quantique, non-séparabilité des systèmes physiques. De tels rapprochements, parfois suggérés par des physiciens eux-mêmes (Werner Heisenberg évoque à l'occasion les présocratiques dans ses réflexions philosophiques), peuvent avoir une valeur heuristique ou pédagogique. Ils ne doivent pas pour autant être transformés en affirmations de continuité doctrinale. La physique quantique procède d'un appareil mathématique et expérimental qui n'a aucun équivalent chez les Grecs anciens, et les analogies conceptuelles qu'on peut tracer avec Anaxagore relèvent de la métaphore rétrospective, non de la filiation historique<ref>Werner Heisenberg, ''Physics and Philosophy'', New York, Harper, 1958, p. 62-63, évoque les présocratiques sans établir de filiation précise avec la physique quantique.</ref>. Il a été parfois suggéré, de manière analogue, que les grands théologiens médiévaux aient vu dans le Noûs un précurseur du Dieu créateur et ordonnateur. Cette suggestion demande une prudence particulière. Thomas d'Aquin, Maïmonide et Avicenne s'inscrivent dans une tradition aristotélicienne et néoplatonicienne déjà très élaborée, dans laquelle le Noûs anaxagoréen n'apparaît, quand il est mentionné, qu'à travers la médiation d'Aristote, et le plus souvent pour être critiqué. La théologie médiévale développe sa conception du Dieu créateur à partir de ressources propres (exégèse biblique, coranique ou talmudique, théologie négative néoplatonicienne, métaphysique aristotélicienne de l'acte pur), et non par appropriation directe de la doctrine anaxagoréenne. Il faut donc parler de continuités discrètes dans une histoire complexe, où la figure d'Anaxagore est plus souvent un repoussoir ou une étape dépassée qu'une source vive<ref>Sur la tradition aristotélicienne et néoplatonicienne médiévale, voir Étienne Gilson, ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; sur la transmission arabe des présocratiques, voir Cristina D'Ancona, « Greek into Arabic: Neoplatonism in Translation », dans P. Adamson et R. C. Taylor (éd.), ''The Cambridge Companion to Arabic Philosophy'', Cambridge, Cambridge University Press, 2005, p. 10-31.</ref>. Une dernière mise en garde concerne la prédiction de l'éclipse et la chute du météorite d'Aigos Potamos, qui ont parfois été présentées comme des triomphes de la « méthode scientifique » naissante. En réalité, les sources qui attribuent à Anaxagore ces prouesses prédictives sont tardives et souvent légendaires ; les historiens des sciences contemporains, comme Daniel Graham ou Geoffrey Lloyd, se montrent prudents, voire sceptiques, sur l'authenticité de ces anticipations. L'importance historique d'Anaxagore ne tient pas à la précision de ses prédictions, mais à la cohérence et à l'ambition explicative de son système naturaliste, qui propose de rendre compte des phénomènes célestes par des principes physiques accessibles à la raison, sans recourir aux figures mythologiques traditionnelles. === Bilan === L'influence d'Anaxagore sur la postérité se caractérise par un contraste fondamental : d'un côté, son introduction du Noûs comme principe cosmique fut saluée comme une avancée majeure par Aristote lui-même, qui loue son caractère « sobre » par contraste avec les rêveries des premiers Ioniens ; de l'autre, son refus (ou son incapacité) à développer une explication par le « meilleur » fut jugée insuffisante par Socrate, Platon et Aristote. Cette dualité traverse toute l'histoire de sa réception : Anaxagore est à la fois le penseur qui a rendu pensable une cause intellectuelle du cosmos, et celui qui a laissé cette cause inemployée au goût de ses successeurs<ref>W. K. C. Guthrie, 1965, p. 327-331 ; Malcolm Schofield, 1980, p. 55-70 ; Daniel Graham, ''Science before Socrates'', Oxford, Oxford University Press, 2006, p. 152-158.</ref>. Cette limitation même fut paradoxalement féconde. En ouvrant une voie sans la parcourir jusqu'au bout, Anaxagore a invité ses successeurs à poursuivre le chemin, chacun à sa manière. Socrate s'est tourné vers la philosophie morale, en cherchant dans le Bien la cause que le Noûs anaxagoréen ne fournissait pas. Platon a développé, dans le ''Timée'' et ailleurs, une cosmologie téléologique dans laquelle le Démiurge contemple les Formes éternelles pour façonner le monde. Aristote a élaboré, contre Platon autant que contre Anaxagore, une doctrine systématique des quatre causes qui intègre la cause finale dans un schéma explicatif unifié. Tous trois ont puisé dans Anaxagore, chacun à sa manière, mais au prix d'une transformation qui leur appartient en propre. On peut donc parler d'une empreinte durable d'Anaxagore sur les orientations ultérieures de la philosophie grecque, sans pour autant soutenir que Socrate, Platon ou Aristote n'auraient pas été ce qu'ils furent sans lui : leurs doctrines ont leurs propres fondements, souvent en réaction à Anaxagore autant qu'en prolongement de lui, et la cause anaxagoréenne n'est, dans leur cas, jamais que partielle. Sur le plan scientifique, l'héritage d'Anaxagore est surtout celui d'un modèle d'explication naturaliste. Il propose des explications des phénomènes célestes et météorologiques en termes de substances et de processus physiques, sans recourir aux agents mythologiques qui peuplaient encore l'imaginaire grec traditionnel. Le soleil n'est plus Hélios mais une pierre incandescente ; la lune n'est plus une déesse mais un corps rocheux qui reçoit la lumière du soleil ; la foudre n'est plus le trait de Zeus mais le produit d'un phénomène atmosphérique. Cet héritage naturaliste n'est pas négligeable, et il a nourri durablement la tradition philosophique et scientifique grecque. Il serait pourtant excessif de lui attribuer à titre principal la fondation d'une « méthode scientifique » au sens moderne : l'élaboration de cette méthode suppose l'invention de la preuve démonstrative, le développement de la mathématisation de la nature, et bien d'autres étapes que la pensée d'Anaxagore n'a pas accomplies<ref>Daniel Gershenson et Daniel Greenberg, 1964, défendent une version forte de la thèse d'Anaxagore comme fondateur de la méthode scientifique, thèse qu'il convient de modérer. Cf. Geoffrey Lloyd, ''Early Greek Science : Thales to Aristotle'', Londres, Chatto & Windus, 1970, pour une perspective plus prudente.</ref>. En définitive, Anaxagore occupe une place singulière dans l'histoire de la philosophie : celle d'un pionnier qui ouvre une voie sans l'explorer entièrement, et qui a légué à ses successeurs à la fois une doctrine (dans ses fragments conservés) et la tâche philosophique de combler ce que cette doctrine laisse ouvert. Cette position intermédiaire entre la cosmologie ionienne, dont il est le dernier grand représentant à Athènes, et la philosophie classique, dont il est l'un des principaux préparateurs, fait d'Anaxagore une figure pivot, dont l'intérêt philosophique propre ne doit pas être dilué dans l'histoire des influences qu'il a exercées. == Notes et références == {{references}} == Bibliographie == === Textes anciens : éditions et traductions === ; Diels, Hermann & Kranz, Walther (éds.) : ''Die Fragmente der Vorsokratiker'', 3 vol., Berlin, Weidmann, 1951-1952 (6{{e}} éd.) : [Édition standard de référence pour les fragments présocratiques, avec le système de numérotation DK (Diels-Kranz) utilisé dans la présente étude] ; Laks, André & Most, Glenn W. (éds.) : ''Early Greek Philosophy'', 9 vol., Loeb Classical Library, Cambridge (Mass.), Harvard University Press, 2016 : [Édition plus récente avec traduction anglaise et nouveau système de numérotation, utile en complément de Diels-Kranz] ; Kirk, G. S., Raven, J. E. & Schofield, M. (éds.) : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 : [Traductions anglaises commentées des fragments] ; Curd, Patricia (éd.) : ''Anaxagoras of Clazomenae: Fragments and Testimonia'', Toronto, University of Toronto Press, 2007 : [Édition critique avec traductions anglaises commentées et analyses détaillées] ; Sider, David (éd.) : ''The Fragments of Anaxagoras: With a Commentary'', Sankt Augustin, Academia Verlag, 2005 : [Édition avec commentaire détaillé] ; Platon : ''Phédon'', trad. fr. Monique Dixsaut, Paris, GF-Flammarion, 1991 : [Dialogue contenant la critique socratique du Noûs d'Anaxagore] ; Platon : ''Apologie de Socrate'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1997 ; Platon : ''Timée'', trad. fr. Luc Brisson, Paris, GF-Flammarion, 1992 ; Platon : ''Philèbe'', trad. fr. Alfred Diès, Paris, Les Belles Lettres, 1941 ; Platon : ''Lois'', trad. fr. Édouard des Places, Paris, Les Belles Lettres, 1951-1956 ; Aristote : ''Métaphysique'', trad. fr. Jean Tricot, Paris, Vrin, 1933 ; Aristote : ''Physique'', trad. fr. Jean Tricot, Paris, Vrin, 1936 ; Aristote : ''Du Ciel'', trad. fr. Jean Tricot, Paris, Vrin, 1949 ; Aristote : ''Génération et corruption'', trad. fr. Jean Tricot, Paris, Vrin, 1950 ; Aristote : ''Génération des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Histoire des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''Parties des animaux'', trad. fr. Jean Tricot, Paris, Vrin, 1957 ; Aristote : ''De l'âme'', trad. fr. Richard Bodéüs, Paris, GF-Flammarion, 1993 ; Diogène Laërce : ''Vies et doctrines des philosophes illustres'', sous la dir. de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche (La Pochothèque), 1999 ; Théophraste : ''De Sensibus'' (''On Sense Perception''), trad. angl. dans Kirk, Raven & Schofield, 1983 ; Simplicius : ''In Aristotelis Physicorum libros commentaria'', éd. Hermann Diels, Berlin, Reimer, 1882-1895 : [Source principale pour la transmission des fragments d'Anaxagore] ; Hippolyte : ''Réfutation de toutes les hérésies'', trad. angl. dans Curd, 2007 ; Lucrèce : ''De la nature'', trad. fr. Alfred Ernout, Paris, Les Belles Lettres, 1920 ; Cicéron : ''De la nature des dieux'', trad. fr. Clara Auvray-Assayas, Paris, Les Belles Lettres, 2002 ; Plutarque : ''Vies parallèles'' (''Vie de Périclès'', ''Vie de Lysandre''), trad. fr. Anne-Marie Ozanam, Paris, Gallimard, Bibliothèque de la Pléiade, 2001 ; Xénophon : ''Mémorables'', trad. fr. Louis-André Dorion et Michele Bandini, Paris, Les Belles Lettres, 2000-2011 === Études modernes : histoire et philosophie antiques === ; Schofield, Malcolm : ''An Essay on Anaxagoras'', Cambridge, Cambridge University Press, 1980 : [Monographie majeure : étude exhaustive de la pensée anaxagoréenne avec analyse textuelle détaillée] ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', publié 2007, révision substantielle 2019 : [Synthèse de référence, avec bibliographie à jour] ; Guthrie, W. K. C. : ''A History of Greek Philosophy'', vol. II : ''The Presocratic Tradition from Parmenides to Democritus'', Cambridge, Cambridge University Press, 1965 ; Barnes, Jonathan : ''The Presocratic Philosophers'', 2 vol., Londres, Routledge, 1982 (révisé 2006) ; Kirk, G. S., Raven, J. E. & Schofield, M. : ''The Presocratic Philosophers: A Critical History with a Selection of Texts'', 2{{e}} édition, Cambridge, Cambridge University Press, 1983 ; Vlastos, Gregory : « The Physical Theory of Anaxagoras », ''Philosophical Review'', vol. 59, 1950, p. 31-57 ; Peck, Arthur L. : « Anaxagoras: Predication as a Problem in Physics », ''Classical Quarterly'', vol. 25, 1931, p. 27-37 et p. 112-120 ; Strang, Colin : « The Physical Theory of Anaxagoras », ''Archiv für Geschichte der Philosophie'', vol. 45, 1963, p. 101-118 ; Cornford, F. M. : « Anaxagoras' Theory of Matter », ''Classical Quarterly'', vol. 24, 1930, p. 14-30 ; Graham, Daniel W. : « Was Anaxagoras a Reductionist? », ''Ancient Philosophy'', vol. 24, 2004, p. 1-18 ; Graham, Daniel W. : ''Science before Socrates: Parmenides, Anaxagoras, and the New Astronomy'', Oxford, Oxford University Press, 2006 ; Curd, Patricia : ''The Legacy of Parmenides: Eleatic Monism and Later Presocratic Thought'', Princeton, Princeton University Press, 1998 ; Owen, G. E. L. : « The Place of the Timaeus in Plato's Dialogues », ''Classical Quarterly'', vol. 3, 1953, p. 79-95 ; repris dans ''Logic, Science and Dialectic'', Londres, Duckworth, 1986 ; Raven, J. E. : « The Basis of Anaxagoras' Cosmology », ''Classical Quarterly'', vol. 4, 1954, p. 123-137 ; Kerferd, George B. : « Anaxagoras and the Concept of Matter before Aristotle », ''Bulletin of the John Rylands Library'', vol. 52, 1969, p. 129-143 ; Lloyd, David : « Anaxagoras on Life and Mind », ''Phronesis'', vol. 14, 1969, p. 246-251 ; Deichgräber, Karl : « Anaxagoras Stil », ''Philologus'', vol. 87, 1933, p. 15-26 ; Norden, Eduard : ''Agnostos Theos: Untersuchungen zur Formengeschichte religiöser Rede'', Leipzig, Teubner, 1913 ; Taylor, A. E. : « On the Date of the Trial of Anaxagoras », ''Classical Quarterly'', vol. 11, 1917, p. 81-87 ; Kahn, Charles H. : ''Anaximander and the Origins of Greek Cosmology'', New York, Columbia University Press, 1960 ; Inwood, Brad : « Anaxagoras and Infinite Divisibility », ''Illinois Classical Studies'', vol. 11, 1986, p. 17-33 ; Sedley, David : ''Creationism and Its Critics in Antiquity'', Berkeley, University of California Press, 2007 ; Sedley, David : « Teleology and Myth in the ''Phaedo'' », ''Proceedings of the Boston Area Colloquium in Ancient Philosophy'', vol. 5, 1989, p. 359-383 ; Betegh, Gábor : « Archelaus on Cosmogony and the Origins of Social Institutions », ''Oxford Studies in Ancient Philosophy'', vol. 51, 2016, p. 1-40 ; Sider, David : « Anaxagoras, Socrates, and the History of "Philosophy" », ''Research Bulletin of the Center for Hellenic Studies'', 31 octobre 2016 ; Furley, David L. : ''Two Studies in the Greek Atomists'', Princeton, Princeton University Press, 1967 ; Furley, David L. : « Anaxagoras, Plato and Naming of Parts », dans ''Presocratic Philosophy: Essays in Honour of Alexander Mourelatos'', éd. Victor Caston et Daniel Graham, Aldershot, Ashgate, 2002, p. 119-126 ; Furth, Montgomery : « A Philosophical Hero? Anaxagoras and the Eleatics », ''Oxford Studies in Ancient Philosophy'', vol. 9, 1991, p. 95-129 ; Lesher, James : « Mind's Knowledge and Powers of Control in Anaxagoras », ''Phronesis'', vol. 40, 1995, p. 125-142 ; Marmodoro, Anna : « Anaxagoras's Qualitative Gunk », ''British Journal for the History of Philosophy'', vol. 23, 2015, p. 402-422 ; Marmodoro, Anna & Morison, Benjamin (éds.) : ''Everything in Everything: Anaxagoras's Metaphysics'', Oxford, Oxford University Press, 2019 ; Vassallo, Christian : « Nous, Motion, and Teleology in Anaxagoras », ''Oxford Studies in Ancient Philosophy'', vol. 50, 2016, p. 1-32 === Études modernes : biologie, physiologie et philosophie naturelle === ; Gershenson, Daniel E. & Greenberg, Daniel A. : ''Anaxagoras and the Birth of Scientific Method'', New York, Blaisdell, 1964 : [À utiliser avec précaution : la thèse centrale sur la « naissance de la méthode scientifique » doit être tempérée] ; Meyer, Arthur William : ''Essays on the History of Embryology'', Stanford, Stanford University Press, 1939 ; Preus, Anthony : « The Techne of Nutrition in Ancient Greek Philosophy », ''Apeiron'', vol. 53, 2020, p. 97-124 ; Kember, Oliver : « Anaxagoras' Theory of Sex Differentiation and Heredity », ''Phronesis'', vol. 18, 1973, p. 1-14 ; Mittwoch, Ursula : « Sex Determination: Science & Society Series on Sex and Science », ''EMBO Reports'', vol. 14, 2013, p. 588-592 ; Kupreeva, Inna : « Sensing the World: Humans, Plants, and the Physicality of Life in Early Greek Philosophy », dans ''Physis and Psyche in Plato and Aristotle'', éd. S. D. Kolstrup et T. L. Kind, Londres, Bloomsbury, 2024, p. 95-114 === Études modernes : astronomie, cosmologie et météorologie === ; Theodossiou, Evangelos Th., Dimitrijevic, Milcho S., Mantarakis, Nikos A. & Georgakarakos, Nikolaos I. : « The Fall of a Meteorite at Aegos Potami in 467/6 BC », ''Journal of Astronomical History and Heritage'', vol. 5, 2002, p. 135-140 ; Graham, Daniel W. & Hintz, Eric : « Anaxagoras and the Comet », ''Apeiron'', vol. 40, 2007, p. 1-20 ; Couprie, Dirk L. : « Anaxagoras on the Milky Way and Lunar Eclipses », ''Rhizomata'', vol. 5, 2017, p. 127-147 ; Lloyd, Geoffrey E. R. : ''Early Greek Science: Thales to Aristotle'', Londres, Chatto & Windus, 1970 === Études modernes : influence et réception === ; Vlastos, Gregory : ''Socrates: Ironist and Moral Philosopher'', Ithaca, Cornell University Press, 1991 ; Morrow, Glenn R. : « Necessity and Persuasion in Plato's ''Timaeus'' », ''Philosophical Review'', vol. 59, 1950, p. 147-163 ; Brisson, Luc : ''Le Même et l'Autre dans la structure ontologique du Timée de Platon'', Paris, Klincksieck, 1974 ; Johansen, Thomas Kjeller : ''Plato's Natural Philosophy'', Cambridge, Cambridge University Press, 2004 ; Johansen, Thomas Kjeller : « From Craft to Nature: The Emergence of Natural Teleology », dans ''Plato and Hesiod'', éd. G. R. Boys-Stones et J. H. Haubold, Oxford, Oxford University Press, 2020, p. 100-125 ; Long, A. A. & Sedley, D. N. : ''The Hellenistic Philosophers'', vol. I, Cambridge, Cambridge University Press, 1987 ; White, Michael J. : « Stoic Natural Philosophy », dans ''The Cambridge Companion to the Stoics'', éd. Brad Inwood, Cambridge, Cambridge University Press, 2003, p. 124-152 ; Sedley, David : ''Lucretius and the Transformation of Greek Wisdom'', Cambridge, Cambridge University Press, 1998 ; Chalmers, Alan : « Atomism from the 17th to the 20th Century », ''Stanford Encyclopedia of Philosophy'', 2005 (révisé 2014) ; Pyle, Andrew : ''Atomism and its Critics: From Democritus to Newton'', Bristol, Thoemmes Press, 1997 ; Gilson, Étienne : ''L'esprit de la philosophie médiévale'', Paris, Vrin, 1932 ; Heisenberg, Werner : ''Physics and Philosophy'', New York, Harper, 1958 : [À consulter pour les rapprochements prudents entre présocratiques et physique moderne, à titre d'analogie heuristique] === Instruments de recherche et ressources === ; Curd, Patricia : « Anaxagoras », ''Stanford Encyclopedia of Philosophy'', 2007 (révision substantielle 2019) ; Graham, Daniel W. : « Presocratic Philosophy », ''Stanford Encyclopedia of Philosophy'', 2019 ; ''Oxford Classical Dictionary'' : s.v. « Anaxagoras », diverses éditions : [À consulter pour la mise en garde prudente sur la tradition biographique] === Dictionnaires et encyclopédies === ; Goulet, Richard (éd.) : ''Dictionnaire des philosophes antiques'', vol. I, Paris, CNRS Éditions, 1989 (2{{e}} éd. 2003) : [Entrée détaillée sur Anaxagore avec bibliographie] {{autocat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Anaxagore}} 4r2ihavjjbv8nek4i9dnt4dmwi5jhqr Dictionnaire de philosophie/Empédocle 0 83144 764915 758701 2026-04-25T06:06:50Z PandaMystique 119061 764915 wikitext text/x-wiki {{DicoPhilo|Empédocle}} == I. Biographie et contexte historique == Empédocle naît à Agrigente (en grec Akragas, en latin Agrigentum, l'actuelle Agrigento) vers 492-490 av. J.-C.<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 51-52 ; Apollodore, ''Chronologie'' (''FGrHist'' 244 F 33)</ref>. Les dates exactes de sa naissance et de sa mort demeurent incertaines, les témoignages anciens divergeant sur ces questions fondamentales. La datation communément admise place sa naissance autour de 492-490 av. J.-C., se fondant sur le témoignage d'Aristote rapporté par Simplicius, selon lequel Empédocle naquit peu après Anaxagore, lui-même né vers 500 av. J.-C.<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', 25, 19 (éd. Diels, ''CAG'' IX) ; Aristote, ''Métaphysique'', I, 3, 984a11</ref>. Cette datation s'accorde avec la victoire olympique remportée par son grand-père, également nommé Empédocle, lors de la 71{{e}} olympiade (496-495 av. J.-C.)<ref>Diogène Laërce, VIII, 51 ; Ératosthène cité par Apollodore</ref>, événement qui permet d'ancrer la famille d'Empédocle dans le temps avec une relative certitude. La cité d'Agrigente, fondée vers 580 av. J.-C. par des colons venus de Géla, eux-mêmes descendants de Rhodiens et de Crétois, constituait à l'époque d'Empédocle l'une des plus riches et des plus puissantes colonies grecques de Sicile, rivalisant avec Syracuse en splendeur et en influence<ref>Thucydide, ''Histoire de la guerre du Péloponnèse'', VI, 4, 1-4 ; Pindare, ''Pythiques'', XII, 1-2</ref>. Située sur la côte méridionale de la Sicile, entre deux fleuves, l'Hypsos et l'Akragas, la ville s'élevait sur une colline qui lui servait d'acropole naturelle. Pindare la qualifiait de « la plus belle des cités mortelles »<ref>Pindare, ''Pythiques'', XII, 2</ref>, témoignage de l'éclat qu'elle avait acquis au cours du V{{e}} siècle av. J.-C. La fertilité exceptionnelle du territoire environnant, produisant céréales, huile d'olive et vin en abondance, ainsi que l'élevage florissant, avaient contribué à l'enrichissement rapide de la cité. Selon certaines estimations rapportées par Diodore de Sicile, la population atteignait deux cent mille habitants, dont vingt mille citoyens à part entière<ref>Diodore de Sicile, ''Bibliothèque historique'', XIII, 84, 3 (ces chiffres sont considérés comme exagérés par les historiens modernes)</ref>. Empédocle appartient à une famille aristocratique d'Agrigente, dont la richesse et la notoriété sont solidement établies. Son grand-père paternel, Empédocle, s'était illustré dans les courses de chevaux, remportant la victoire dans l'épreuve du quadrige aux Jeux olympiques de 496 av. J.-C.<ref>Diogène Laërce, VIII, 51 ; Ératosthène cité par Apollodore</ref>. Cette victoire, qui conférait un prestige considérable à toute la famille, témoigne de la fortune dont disposaient les Emménides – le clan auquel appartenait Empédocle<ref>Héraclide du Pont, ''Des maladies'' (''περὶ νόσων''), cité par Diogène Laërce, VIII, 57</ref>. Son père, Méton, joua vraisemblablement un rôle important dans la vie politique agrigentine, participant probablement au renversement du tyran Thrasydée en 472-471 av. J.-C. et à l'établissement d'un gouvernement démocratique<ref>Diogène Laërce, VIII, 63-64 ; Timée de Tauroménion, ''Histoires de Sicile'', livres XI-XII (''FGrHist'' 566 F 93-94)</ref>. Le contexte politique dans lequel grandit Empédocle se caractérise par une succession de bouleversements majeurs. Après une période de domination du tyran Phalaris (vers 570-554 av. J.-C.), qui s'était rendu célèbre par sa cruauté légendaire, Agrigente connut une phase de gouvernement oligarchique dominé par une « Assemblée des Mille », institution aristocratique regroupant les citoyens les plus fortunés. En 488 av. J.-C., Théron, membre de la famille des Emménides, s'empara du pouvoir et instaura une tyrannie qui dura jusqu'à sa mort en 472 av. J.-C.<ref>Diodore de Sicile, XI, 48-53 ; Hérodote, VII, 165-166</ref>. Le règne de Théron fut généralement considéré comme éclairé, les sources littéraires grecques louant sa sagesse et sa modération<ref>Pindare, ''Olympiques'', II et III</ref>. Allié de Gélon, tyran de Syracuse, Théron contribua de manière décisive à la victoire des Grecs de Sicile sur les Carthaginois à la bataille d'Himère en 480 av. J.-C., victoire qui assura la sécurité et la prospérité d'Agrigente pour plusieurs décennies<ref>Hérodote, VII, 165-167 ; Diodore de Sicile, XI, 20-24</ref>. À la mort de Théron, son fils Thrasydée (en grec Thrasydaios) lui succéda. Contrairement à son père, Thrasydée se montra violent, despotique et incompétent<ref>Diogène Laërce, VIII, 66 ; Timée, ''Histoires'', livre XIV (''FGrHist'' 566 F 94)</ref>. Déjà gouverneur d'Himère sous l'autorité de son père, il s'était attiré la haine des populations locales par sa brutalité. Devenu maître d'Agrigente, il engagea inconsidérément une guerre contre Hiéron I{{er}} de Syracuse, guerre qui se solda par une défaite sanglante<ref>Diodore de Sicile, XI, 53, 1-5</ref>. Profitant de ce désastre militaire, les Agrigentins se soulevèrent et chassèrent Thrasydée en 472-471 av. J.-C. Le tyran déchu s'enfuit en Grèce continentale, fut arrêté à Mégare et exécuté publiquement<ref>Diogène Laërce, VIII, 66 ; Polyen, ''Stratagèmes'', V, 6</ref>. C'est dans ce contexte de bouleversement politique et d'instauration d'un régime démocratique qu'Empédocle, alors âgé d'une vingtaine d'années, fit son entrée dans la vie publique. L'environnement intellectuel et culturel dans lequel se forma Empédocle était d'une richesse exceptionnelle. Agrigente attirait poètes, dramaturges et penseurs venus de toute la Grèce. Pindare, le plus célèbre poète lyrique de son temps, séjourna à Agrigente et y composa plusieurs odes en l'honneur de Théron<ref>Pindare, ''Olympiques'', II et III ; ''Pythiques'', VI</ref>. Eschyle, le grand tragique athénien, se rendit également en Sicile et mourut à Géla vers 456 av. J.-C.<ref>Vie anonyme d'Eschyle</ref>. Plus importante encore fut l'influence des courants philosophiques qui circulaient en Grande-Grèce et en Sicile au début du V{{e}} siècle av. J.-C. Bien qu'il soit chronologiquement improbable qu'Empédocle ait personnellement rencontré Xénophane de Colophon, il connut indubitablement son œuvre, qui critiquait vigoureusement l'anthropomorphisme religieux traditionnel<ref>Xénophane, fragments 11-16 (DK 21 B 11-16)</ref>. L'influence de Parménide d'Élée sur Empédocle fut considérable tant sur le plan stylistique que conceptuel : le poème de Parménide, avec sa distinction entre la voie de la vérité et la voie de l'opinion, fournit à Empédocle un modèle formel et un cadre problématique<ref>Théophraste cité par Diogène Laërce, VIII, 55-56</ref>. Les liens d'Empédocle avec le pythagorisme sont complexes et controversés. Selon Timée de Tauroménion, historien sicilien du IV{{e}}-III{{e}} siècle av. J.-C., Empédocle fut disciple de Pythagore, mais en fut exclu pour plagiat (logoklopia), accusé d'avoir divulgué publiquement des enseignements tenus secrets par l'école pythagoricienne<ref>Timée cité par Diogène Laërce, VIII, 54-55</ref>. Cependant, l'anachronisme chronologique rend impossible une telle filiation directe : Pythagore mourut vers 495 av. J.-C., année même où naquit probablement Empédocle. Il est néanmoins indubitable qu'Empédocle connut la doctrine pythagoricienne, soit par contact avec des pythagoriciens établis en Sicile et en Grande-Grèce, soit par la lecture d'écrits pythagoriciens, soit encore par transmission orale. L'interdiction de consommer des fèves, la croyance en la transmigration des âmes (métempsychose), le végétarisme strict et l'importance accordée aux nombres et aux proportions dans l'explication du cosmos témoignent d'une imprégnation pythagoricienne profonde, même si Empédocle reformula ces doctrines de manière originale<ref>Empédocle, fragments 117, 128, 136, 137, 139 (DK 31 B 117, 128, 136, 137, 139)</ref>. Sur la vie personnelle et l'activité politique d'Empédocle, nos informations proviennent principalement de Diogène Laërce et de Timée. Empédocle refusa la royauté ou la tyrannie qui lui furent offertes, préférant soutenir le parti démocratique et œuvrer en faveur du peuple<ref>Diogène Laërce, VIII, 63-66 ; Aristote cité par Diogène Laërce, VIII, 63</ref>. Plusieurs anecdotes illustrent son engagement politique égalitaire. Lors d'un banquet offert par un magistrat, Empédocle s'indigna qu'un convive fût désigné comme « roi du festin » avec pouvoir d'imposer aux autres invités des humiliations. Le lendemain, il fit citer en justice l'hôte et le « roi », les fit condamner et exécuter, y voyant une atteinte à l'égalité des citoyens<ref>Diogène Laërce, VIII, 64 ; Timée, ''Histoires'', livre XI (''FGrHist'' 566 F 93)</ref>. De même, lorsque le médecin Acron demanda au conseil l'autorisation d'ériger un monument à son père sur l'acropole, Empédocle s'opposa vigoureusement à ce privilège, prononçant un discours où il tourna en dérision cette prétention aristocratique en jouant sur les mots<ref>Diogène Laërce, VIII, 65</ref>. Plus tard, Empédocle fit dissoudre l'Assemblée des Mille, institution oligarchique qui limitait les droits politiques à un millier de citoyens fortunés, trois ans après sa fondation, démontrant ainsi qu'il appartenait certes à la classe des riches mais qu'il soutenait fermement les principes démocratiques<ref>Diogène Laërce, VIII, 66 ; Timée, ''Histoires'', livres XI-XII (''FGrHist'' 566 F 93-94)</ref>. Parallèlement à son action politique, Empédocle exerça la médecine et acquit une réputation de thaumaturge. On lui attribue des guérisons miraculeuses, notamment celle d'une femme nommée Panthéia, que les autres médecins avaient abandonnée, la croyant morte<ref>Héraclide du Pont, ''Des maladies'', cité par Diogène Laërce, VIII, 60-61, 67-69</ref>. Il aurait également délivré Sélinonte d'une épidémie de peste en faisant détourner le cours de deux rivières voisines pour assainir les eaux stagnantes responsables des miasmes pestilentiels<ref>Diogène Laërce, VIII, 70</ref>. À Agrigente, il aurait maîtrisé les vents étésiens qui menaçaient les récoltes en faisant fabriquer des outres en peau d'âne pour les capturer, exploit qui lui valut le surnom de « dompteur de vents » (kôlysanemas)<ref>Timée cité par Diogène Laërce, VIII, 60</ref>. Ces récits, qui mêlent histoire et légende, témoignent de l'aura extraordinaire dont Empédocle fut entouré de son vivant. L'apparence d'Empédocle frappait les contemporains. Il se présentait vêtu d'une robe de pourpre, ceint d'une ceinture d'or, chaussé de sandales de bronze, couronné de lauriers et portant les bandelettes sacrées delphiques<ref>Diogène Laërce, VIII, 73 ; Favorinus, ''Histoires diverses''</ref>. Cette mise en scène théâtrale, qui le distinguait de manière notable des autres citoyens, correspondait à la représentation qu'il donnait de lui-même dans ses poèmes, où il se présentait comme un dieu immortel circulant parmi les mortels<ref>Empédocle, fragment 112, 4-5 (DK 31 B 112)</ref>. Cette attitude fut diversement interprétée : certains y virent de l'arrogance et de la vanité, d'autres l'expression d'une authentique conscience de sa mission spirituelle<ref>Timée cité par Diogène Laërce, VIII, 66-67</ref>. Les circonstances et la date de la mort d'Empédocle demeurent entourées de mystère. Selon Aristote, il serait mort à l'âge de soixante ans, donc vers 432-430 av. J.-C.<ref>Aristote cité par Diogène Laërce, VIII, 52</ref>, mais d'autres sources lui prêtent un âge bien plus avancé, jusqu'à cent neuf ans<ref>Apollodore cité par Diogène Laërce, VIII, 52</ref>. Quant aux circonstances de sa mort, la légende la plus célèbre, rapportée par Héraclide du Pont et amplement diffusée dans l'Antiquité, raconte qu'Empédocle se serait jeté dans le cratère de l'Etna pour faire croire à son apothéose et convaincre ses disciples de sa divinité ; le volcan aurait cependant rejeté l'une de ses sandales de bronze, révélant ainsi la supercherie<ref>Héraclide du Pont cité par Diogène Laërce, VIII, 67-70 ; Horace, ''Art poétique'', 464-466</ref>. Timée de Tauroménion, historien plus soucieux d'exactitude, conteste vigoureusement cette version, affirmant qu'Empédocle quitta la Sicile pour le Péloponnèse et n'y revint jamais, de sorte que les modalités de sa mort demeurèrent inconnues<ref>Timée cité par Diogène Laërce, VIII, 71-72</ref>. D'autres traditions mentionnent qu'il serait mort d'une chute de char en se rendant à Messine, ou qu'il se serait pendu, ou encore qu'il se serait noyé<ref>Diogène Laërce, VIII, 73-74</ref>. L'incertitude même qui entoure sa fin contribua à renforcer le caractère quasi mythique du personnage, dont la figure hanta l'imaginaire occidental jusqu'à inspirer Hölderlin, Nietzsche et Matthew Arnold<ref>Hölderlin, ''La mort d'Empédocle'' (1798-1800) ; Nietzsche, ''Esquisses d'un drame d'Empédocle'' (fragments posthumes, 1870-1871) ; Matthew Arnold, ''Empedocles on Etna'' (1852)</ref>. == II. Les sources et la tradition textuelle == Notre connaissance de la pensée d'Empédocle repose sur une tradition textuelle d'une complexité remarquable, qui combine l'absence tragique de manuscrits directs continus, la richesse d'une tradition indirecte remontant à l'Antiquité, et l'excitation suscitée par des découvertes papyrologiques récentes. Cette situation impose une démarche philologique et herméneutique particulièrement rigoureuse, laquelle doit tenir compte à la fois de la fragmentation matérielle des sources et des déformations interprétatives qui se sont accumulées au fil des siècles<ref>Kingsley, Peter. ''Ancient Philosophy, Mystery, and Magic: Empedocles and Pythagorean Tradition''. Oxford University Press, 1995, p. 3-4</ref>. === L'absence de tradition directe et la dépendance à l'égard des citations === Contrairement aux œuvres de Platon, d'Aristote ou même d'Épicure, dont des manuscrits médiévaux ont assuré la transmission continue, aucun manuscrit complet des poèmes d'Empédocle ne nous est parvenu. La totalité de notre information textuelle provient de citations, de paraphrases et d'allusions préservées dans les écrits d'auteurs postérieurs, notamment chez les philosophes, les doxographes, les commentateurs néoplatoniciens et les Pères de l'Église<ref>Martin, Alain et Primavesi, Oliver. ''L'Empédocle de Strasbourg (P. Strasb. gr. Inv. 1665-1666). Introduction, édition et commentaire''. Walter de Gruyter, 1999, p. 3-5</ref>. Cette condition fragmentaire n'est nullement propre à Empédocle elle caractérise l'ensemble des présocratiques mais elle revêt une acuité particulière dans son cas, compte tenu de l'ampleur probable de son œuvre originale. Les sources principales de la tradition indirecte sont dispersées sur près d'un millénaire. Parmi les auteurs les plus anciens, Aristote (384-322 av. J.-C.) et son disciple Théophraste (vers 371-vers 287 av. J.-C.) occupent une place prépondérante. Aristote cite et discute Empédocle à de nombreuses reprises dans ses traités, notamment dans la ''Métaphysique'', le ''De Caelo'', le ''De Generatione et Corruptione'', et les ''Meteorologica''<ref>Aristote, ''Métaphysique'', I, 3, 984a ''De Generatione et Corruptione'', I, 1, 314a-315a</ref>. Théophraste, qui composa des monographies sur les physiciens antérieurs, aujourd'hui perdues mais abondamment utilisées par la tradition doxographique ultérieure, constitue une source d'information cruciale, bien que médiatisée<ref>Diels, Hermann. ''Doxographi Graeci''. Berlin, 1879</ref>. Cependant, comme l'a magistralement démontré Harold Cherniss dans son ouvrage fondateur ''Aristotle's Criticism of Presocratic Philosophy'' (1935), Aristote et Théophraste n'étaient nullement des témoins neutres ils interprétaient et réinterprétaient Empédocle à travers leurs propres cadres conceptuels, imposant souvent des schémas téléologiques qui faisaient de l'histoire philosophique une marche nécessaire vers le système aristotélicien<ref>Cherniss, Harold F. ''Aristotle's Criticism of Presocratic Philosophy''. Baltimore, 1935</ref>. La tradition doxographique, inaugurée par Théophraste et systématisée par des compilateurs ultérieurs tels qu'Aetius (I{{er}}-II{{e}} siècles apr. J.-C.), a transmis des résumés schématiques et souvent simplificateurs des doctrines empédocléennes. Le pseudo-Plutarque, dont les ''Placita Philosophorum'' dérivent d'Aetius, Stobée (V{{e}} siècle apr. J.-C.) et Hippolyte de Rome (vers 170-235 apr. J.-C.) dans sa ''Réfutation de toutes les hérésies'' constituent des relais essentiels, bien que leur fidélité aux formulations originales demeure sujette à caution<ref>Mansfeld, Jaap et Runia, David T. ''Aëtiana: The Method and Intellectual Context of a Doxographer''. Leiden, 1997</ref>. Les commentateurs néoplatoniciens, notamment Simplicius (VI{{e}} siècle apr. J.-C.) dans ses vastes commentaires sur Aristote, ont préservé de précieuses citations littérales d'Empédocle, souvent absentes des autres sources<ref>Simplicius, ''Commentaire sur la Physique d'Aristote'', notamment 157.25-158.1, 160.1-26 éd. Diels</ref>. Simplicius, mû par un souci de conservation des textes anciens face à la fermeture des écoles philosophiques païennes par Justinien en 529, a eu le mérite d'insérer dans ses commentaires de longues citations textuelles, qui constituent aujourd'hui nos sources les plus étendues pour plusieurs fragments majeurs. Plutarque (vers 46-vers 125 apr. J.-C.), dans ses ''Œuvres morales'', Sextus Empiricus (fin II{{e}}-début III{{e}} siècle apr. J.-C.), et Clément d'Alexandrie (vers 150-vers 215 apr. J.-C.) fournissent également des citations importantes, bien que souvent décontextualisées et adaptées à leurs propres finalités polémiques ou apologétiques<ref>Bollack, Jean. ''Empédocle. Les Origines''. Paris, Minuit, 1965-1969, vol. I, p. 15-28</ref>. Cette médiation par des autorités postérieures, aux agendas philosophiques, théologiques ou polémiques distincts, impose une vigilance herméneutique constante. Comme Peter Kingsley l'a souligné, le véritable obstacle à une intelligence correcte d'Empédocle ne réside pas tant dans la fragmentation matérielle que dans les distorsions interprétatives que la tradition a accumulées<ref>Kingsley, Peter. ''Ancient Philosophy, Mystery, and Magic'', p. 4-5</ref>. L'historien de la philosophie doit, autant que possible, dépouiller les citations de leurs gangues doxographiques pour tenter d'accéder au sens originel. === Les éditions modernes et l'établissement du corpus === L'entreprise moderne d'édition critique des fragments d'Empédocle commence véritablement au XIX{{e}} siècle, époque où la philologie classique atteint sa maturité scientifique. L'édition pionnière de Friedrich Wilhelm Sturz, ''Empedocles Agrigentinus'' (Leipzig, 1805), rassemble pour la première fois de manière systématique les fragments épars dans la tradition antique et médiévale, accompagnés d'une étude sur la vie et la philosophie du penseur d'Agrigente<ref>Sturz, Friedrich Wilhelm. ''Empedocles Agrigentinus''. Leipzig, 1805</ref>. Simon Karsten, dans ses ''Philosophorum Graecorum Veterum... Operum Reliquiae'' (Amsterdam, 1838), propose une édition plus ambitieuse, qui distingue déjà avec une certaine netteté les fragments attribuables aux ''Katharmoi'' des fragments du poème physique<ref>Karsten, Simon. ''Philosophorum Graecorum Veterum... Operum Reliquiae'', vol. II. Amsterdam, 1838</ref>. L'édition véritablement fondatrice demeure celle de Hermann Stein, ''Empedoclis Agrigentini Fragmenta'' (Bonn, 1852), qui établit des critères rigoureux de sélection et d'authentification des fragments, et dont la numérotation a longtemps fait autorité<ref>Stein, Hermann. ''Empedoclis Agrigentini Fragmenta''. Bonn, 1852</ref>. Cependant, c'est l'édition monumentale de Hermann Diels, d'abord publiée dans les ''Poetarum Philosophorum Fragmenta'' (Berlin, 1901), puis intégrée et considérablement développée dans ''Die Fragmente der Vorsokratiker'' (première édition 1903), qui est devenue la référence incontournable et qui a imposé le système de numérotation standard, universellement utilisé par les chercheurs<ref>Diels, Hermann. ''Die Fragmente der Vorsokratiker''. Berlin, 1903</ref>. La cinquième édition, remaniée par Walther Kranz (Berlin, 1934-1937), puis la sixième édition (1952), désormais connue sous le sigle « Diels-Kranz » ou « DK », constituent encore aujourd'hui la base de référence pour tout travail sur les présocratiques, bien que leurs limites et leurs présupposés interprétatifs soient désormais largement reconnus<ref>Diels, Hermann et Kranz, Walther. ''Die Fragmente der Vorsokratiker''. 6{{e}} éd. Berlin, 1952</ref>. Dans le système Diels-Kranz, chaque philosophe présocratique se voit attribuer un numéro Empédocle porte le numéro 31. Les témoignages indirects sur sa vie et sa doctrine sont classés sous la lettre A, suivie d'un numéro (31 A 1, 31 A 2, etc.). Les fragments littéraux, c'est-à-dire les citations textuelles considérées comme authentiques, sont classés sous la lettre B (31 B 1, 31 B 2, etc.). Une troisième catégorie, la lettre C, rassemble les imitations et les textes qui prennent Empédocle pour modèle<ref>Numérotation Diels-Kranz, dans ''Die Fragmente der Vorsokratiker''</ref>. Ce système, bien qu'imparfait et parfois arbitraire dans ses distinctions, a permis d'unifier les références et demeure l'instrument de travail indispensable. Les éditions ultérieures du XX{{e}} siècle ont apporté des améliorations significatives, tant sur le plan de l'établissement du texte que sur celui de l'interprétation. L'édition monumentale de Jean Bollack, ''Empédocle. Les Origines'' (Paris, Minuit, 1965-1969, 3 volumes), propose une reconstruction audacieuse et systématique du poème physique, en intégrant non seulement les fragments littéraux mais aussi les résumés doxographiques, dans une tentative de reconstituer l'architecture d'ensemble de l'œuvre<ref>Bollack, Jean. ''Empédocle. Les Origines. Introduction, édition et commentaire''. Paris, Minuit, 1965-1969, 3 vol.</ref>. Bollack numérote les unités textuelles de 1 à 699, dans un cadre ouvert qui accueille fragments, paraphrases et contextes citants. Cette entreprise, aussi admirable soit-elle par son ampleur et sa rigueur philologique, n'a pas supplanté le système Diels-Kranz, trop solidement ancré dans les habitudes scientifiques. L'édition de Brad Inwood, ''The Poem of Empedocles'' (Toronto, 1992, édition révisée 2001), offre un texte grec accompagné d'une traduction anglaise et d'un riche apparat de témoignages indirects<ref>Inwood, Brad. ''The Poem of Empedocles''. Toronto, University of Toronto Press, 1992 éd. rév. 2001</ref>. L'édition de M. R. Wright, ''Empedocles: The Extant Fragments'' (New Haven, Yale University Press, 1981), remarquable par son commentaire détaillé et ses notes philologiques, demeure un outil précieux<ref>Wright, M. R. ''Empedocles: The Extant Fragments''. New Haven, Yale University Press, 1981</ref>. Plus récemment, André Laks et Glenn W. Most ont proposé une refonte complète du corpus présocratique dans leur vaste entreprise éditoriale ''Early Greek Philosophy'' (Cambridge, Mass., Harvard University Press, 2016, Loeb Classical Library vol. 528), où Empédocle occupe le chapitre 22 du volume V, partie II<ref>Laks, André et Most, Glenn W. ''Early Greek Philosophy'', vol. V, part II. Cambridge (Mass.), Harvard University Press, 2016 (Loeb 528) traduction française ''Les Débuts de la philosophie''. Paris, Fayard, 2016, p. 659-819</ref>. Rompant avec la division traditionnelle en A et B, Laks et Most classent les textes en trois catégories P (informations concernant la Personne, la vie, le caractère et les dits du philosophe), D (Doctrine, fragments littéraux et témoignages sur le contenu de l'œuvre), R (histoire de la Réception de la doctrine dans l'Antiquité). Ce nouveau système, bien que novateur et fondé sur des critères méthodologiques explicites, n'a pas encore détrôné la numérotation Diels-Kranz, qui conserve sa primauté dans la pratique scientifique courante. === La découverte du papyrus de Strasbourg et son importance === L'événement le plus marquant dans l'histoire récente des études empédocléennes fut incontestablement l'identification et la publication, en 1999, du papyrus de Strasbourg, qui bouleversa notre compréhension de la tradition textuelle et apporta des vers jusqu'alors inconnus<ref>Martin, Alain et Primavesi, Oliver. ''L'Empédocle de Strasbourg (P. Strasb. gr. Inv. 1665-1666). Introduction, édition et commentaire''. Berlin, Walter de Gruyter, 1999</ref>. L'histoire de cette découverte mérite d'être contée, car elle illustre les aléas de la transmission des textes antiques et les hasards heureux de la recherche papyrologique. En novembre 1904, l'archéologue allemand Otto Rubensohn fouillait le site d'Akhmîm, l'antique Panopolis, en Haute-Égypte, lieu réputé pour avoir été un centre intellectuel et littéraire aux premiers siècles de notre ère. Il découvrit un objet funéraire singulier une bande ornementale, vraisemblablement destinée à orner une momie, constituée de feuilles de cuivre doré collées sur des morceaux de papyrus pliés<ref>Martin et Primavesi, 1999, p. 1-3</ref>. Rubensohn extrait les bribes de papyrus et les emporta en Europe. En 1905, la Bibliothèque nationale et universitaire de Strasbourg fit l'acquisition de ce manuscrit fragmentaire. Pendant près d'un siècle, le papyrus demeura inexploité, enfoui dans les collections strasbourgeoises, attendant qu'un regard expert s'y intéressât<ref>Martin et Primavesi, 1999, p. 3-4</ref>. C'est en 1994 qu'Alain Martin, papyrologue de l'Université libre de Bruxelles, identifia le papyrus comme contenant des vers d'Empédocle. Collaborant avec Oliver Primavesi, philologue de l'Université de Munich, spécialiste d'Empédocle et de Parménide, Martin entreprit une reconstitution minutieuse des fragments. Le travail, d'une complexité extrême, exigeait de déplier virtuellement les morceaux, de reconstituer l'ordre des colonnes, d'identifier les correspondances entre les divers ensembles désignés par les lettres a à k, et de déterminer leur place dans l'œuvre empédocléenne<ref>Martin et Primavesi, 1999, p. 5-15</ref>. En 1999, les deux chercheurs publièrent ''L'Empédocle de Strasbourg'', ouvrage qui fit date dans le domaine de la papyrologie et de l'histoire de la philosophie antique. Le papyrus, daté paléographiquement de la fin du I{{er}} siècle apr. J.-C., constitue le seul témoignage de transmission directe d'un texte d'Empédocle, par opposition aux citations indirectes chez les auteurs postérieurs<ref>Martin et Primavesi, 1999, p. 15-20</ref>. Il s'agit d'un manuscrit de qualité, copié professionnellement, comme en témoigne la présence d'une indication stichométrique en marge de la colonne a la lettre Γ (gamma), qui signale que le copiste a déjà transcrit 300 lignes<ref>Martin et Primavesi, 1999, p. 18</ref>. Cette indication suggère que le papyrus provient d'un centre de copie professionnel, et non d'une copie privée ou scolaire. Le fait que le manuscrit ait été trouvé dans un contexte funéraire soulève des questions fascinantes sur les usages rituels ou symboliques auxquels les textes philosophiques pouvaient être soumis dans l'Égypte gréco-romaine<ref>Carlig, Nathan. « Des papyri grecs en contexte funéraire le cas de l'Empédocle de Strasbourg ». ''Philosophie antique'', 10, 2010, p. 93-111</ref>. Le papyrus apporte des vers inconnus et, surtout, atteste la coexistence, au sein d'un même rouleau, de développements cosmologiques et de récits daïmonologiques à la première personne. Il fournit ainsi un argument très puissant en faveur d'une articulation étroite entre ces deux registres, sans pour autant lever définitivement le débat sur l'unité ou la dualité des poèmes empédocléens.<ref>Alain Martin et Oliver Primavesi, ''L'Empédocle de Strasbourg. (P. Strasb. gr. inv. 1665–1666)'', Berlin / New York, de Gruyter, 1999.</ref> En particulier, le papyrus montre que le célèbre fragment sur le « démon » exilé des dieux (B 115 Diels-Kranz) et le récit des expériences de réincarnation (B 117 Diels-Kranz) s'inséraient dans un contexte qui contenait également des développements cosmologiques sur la séparation et la recombinaison des éléments. Cette découverte a largement conforté l'hypothèse, avancée dès 1987 par Catherine Rowett (alors Osborne), selon laquelle une partie au moins de ces fragments provenait d'un seul et même poème, désigné sous divers titres par les sources antiques.<ref>Catherine Osborne, « Empedocles Recycled », ''Classical Quarterly'', 37, 1987, p. 24-50.</ref> === La découverte récente du papyrus du Caire === L'histoire ne s'arrête pas là. En 2023, Nathan Carlig, chercheur en papyrologie à l'Université de Liège, découvrit dans les collections de l'Institut français d'archéologie orientale (IFAO) du Caire un fragment de papyrus contenant les restes de trente vers inédits du philosophe présocratique<ref>Carlig, Nathan. Annonce de la découverte, présentée lors de la journée d'études « De Strasbourg au Caire la redécouverte d'Empédocle », Université de Liège, 13 février 2023</ref>. Ce fragment, désormais connu sous le nom d'« Empédocle du Caire », complète l'« Empédocle de Strasbourg ». Daté également de la fin du I{{er}} siècle apr. J.-C., il provient vraisemblablement de la même région d'Égypte, sinon du même manuscrit ou d'une copie apparentée. La publication complète de cette nouvelle découverte, attendue avec impatience par la communauté scientifique, promet d'éclairer davantage la doctrine empédocléenne et de relancer les débats interprétatifs sur des questions encore irrésolues. === Les problèmes herméneutiques posés par la tradition fragmentaire === La fragmentation matérielle et la médiation doxographique imposent des défis herméneutiques considérables. Premièrement, l'ordre originel des fragments demeure largement inconnu. Les éditeurs modernes, de Diels à Bollack, ont proposé des reconstructions hypothétiques de la structure des poèmes, mais ces reconstructions demeurent conjecturales, fondées sur des critères thématiques, stylistiques ou logiques qui ne garantissent nullement la fidélité à l'ordre de composition originel<ref>Bollack, 1965-1969, vol. I, p. 97-124</ref>. Deuxièmement, la décontextualisation des fragments rend souvent difficile la compréhension de leur sens précis. Un vers cité isolément peut prendre des significations divergentes selon le contexte argumentatif dans lequel il s'insérait. Troisièmement, les citations elles-mêmes ne sont pas toujours textuellement fiables les copistes médiévaux ont introduit des corruptions, et les auteurs anciens citaient parfois de mémoire ou adaptaient les vers à leurs propres besoins rhétoriques<ref>Wright, M. R. ''Empedocles: The Extant Fragments'', p. 1-5</ref>. À ces difficultés matérielles s'ajoutent les biais interprétatifs de la tradition. Aristote, source majeure de notre information, lit Empédocle à travers le prisme de sa propre téléologie et de sa théorie des quatre causes. Les doxographes schématisent et simplifient, réduisant souvent la richesse de la pensée empédocléenne à des formules commodes mais réductrices. Les néoplatoniciens, tels Simplicius ou Proclus, projettent sur Empédocle leurs propres catégories métaphysiques, voyant dans le Sphairos une préfiguration de l'Un plotinien ou dans les daimones des âmes platoniciennes déchues<ref>Kingsley, 1995, p. 3-7</ref>. Les Pères de l'Église, en quête de précurseurs de la doctrine chrétienne ou, au contraire, d'hérésiarques à réfuter, instrumentalisent Empédocle à des fins apologétiques. Face à ces obstacles, l'historien de la philosophie doit adopter une méthode critique rigoureuse. Il convient, autant que possible, de croiser les témoignages, de comparer les versions divergentes d'un même fragment, de tenir compte du contexte citant, et de demeurer conscient des agendas philosophiques ou théologiques des sources. La découverte des papyrus égyptiens, en fournissant un accès direct, quoique fragmentaire, au texte empédocléen, offre un contrepoids salutaire aux déformations de la tradition indirecte. Néanmoins, même ces papyrus ne nous livrent pas Empédocle dans sa pureté originelle ils nous donnent des copies tardives, réalisées plusieurs siècles après la composition, dans un milieu culturel éloigné de la Sicile du V{{e}} siècle av. J.-C. En définitive, notre connaissance d'Empédocle demeure irrémédiablement médiatisée, fragmentaire et problématique. Mais cette condition ne condamne nullement l'entreprise herméneutique à l'échec au contraire, elle l'oblige à une vigilance accrue, à une rigueur philologique maximale, et à une humilité épistémologique qui reconnaît les limites de notre savoir. Les progrès accomplis au cours du dernier siècle, grâce aux découvertes papyrologiques et aux réévaluations critiques de la tradition doxographique, ont considérablement enrichi notre compréhension d'Empédocle. Les décennies à venir, avec la publication de l'« Empédocle du Caire » et la poursuite des recherches papyrologiques, promettent d'apporter de nouvelles lumières sur l'une des figures les plus fascinantes et les plus énigmatiques de la pensée antique. == III. Les quatre racines et la composition du monde == La théorie des quatre racines constitue la contribution la plus célèbre et la plus durable d'Empédocle à l'histoire de la pensée occidentale. En postulant l'existence de quatre principes matériels fondamentaux — le feu, l'air, l'eau et la terre — dont les combinaisons variables engendrent toutes les substances du monde sensible, l'Acragentin élabora un système à la fois simple et puissant qui marqua la physique et la médecine pendant plus de deux millénaires<ref>Aristote, ''Métaphysique'', I, 3, 984a8-11 ; Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 76</ref>. Cette doctrine représente une tentative ingénieuse de réconcilier les positions apparemment inconciliables de Parménide d'Élée et d'Héraclite d'Éphèse : elle sauvegarde à la fois l'immuabilité de l'être proclamée par le premier et la réalité du devenir observée par le second. === Le problème philosophique hérité de Parménide === Pour saisir pleinement l'originalité de la solution empédocléenne, il convient de rappeler l'aporie dans laquelle la philosophie éléate avait plongé la réflexion sur la nature. Parménide avait démontré, dans son poème fondateur ''Sur la nature'', que l'être est nécessairement un, éternel, immuable et homogène. Tout devenir, toute génération, toute corruption, toute pluralité ne peuvent être, selon lui, que des illusions et erreurs des sens<ref>Parménide, fragment 8 DK ; Simplicius, ''Commentaire sur la Physique d'Aristote'', 145.1-146.25</ref>. La rigueur de l'argumentation parménidéenne s'impose à l'esprit : rien ne peut naître de ce qui n'est pas, car le non-être est impensable et indicible ; rien ne peut périr en se résolvant dans le non-être, pour la même raison. Dès lors, affirmer que quelque chose commence d'exister ou cesse d'exister équivaut à dire que l'être provient du non-être ou retourne au non-être — deux propositions contradictoires et absurdes<ref>Parménide, fragment 8, versets 6-9 DK</ref>. Cependant, cette conclusion métaphysique se heurte violemment au témoignage immédiat et constant des sens. Les choses naissent, croissent, se transforment, dépérissent et meurent sous nos yeux. Le monde sensible est le théâtre d'un perpétuel devenir. Comment concilier l'évidence rationnelle de l'immuabilité de l'être avec l'évidence empirique du changement universel ? Telle était la question pressante à laquelle les penseurs postérieurs à Parménide durent se confronter. Empédocle, comme Anaxagore son contemporain, s'efforça de résoudre ce dilemme en dissociant le niveau des principes élémentaires, éternels et immuables, du niveau des composés, transitoires et changeants<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314a6-15</ref>. === La doctrine des quatre racines === Empédocle n'emploie pas le terme d'éléments (''stoikheia'') — terme technique qui ne fut introduit qu'ultérieurement dans le vocabulaire philosophique. Il désigne les quatre principes matériels sous le nom pittoresque de ''rhizômata'', c'est-à-dire « racines » de toutes choses, empruntant une image botanique qui suggère à la fois la permanence, la fécondité et le rôle fondateur<ref>Empédocle, fragment 6 DK</ref>. Ce choix terminologique n'est nullement fortuit : il s'inscrit dans la tradition pythagoricienne, où le terme ''rhiza'' désignait les principes premiers dont dérivent toutes choses, de même que les nombres dérivent de l'unité et de la dyade<ref>Jean Bollack, ''Empédocle. Les Origines'', Paris, Éditions de Minuit, 1965, vol. I, p. 155-158</ref>. Empédocle identifie ces quatre racines en recourant à une nomenclature théologique : Zeus pour le feu, Héra pour l'air, Aidôneus (c'est-à-dire Hadès) pour la terre, et Nestis pour l'eau<ref>Empédocle, fragment 6 DK ; Aétius, I, 3, 20</ref>. L'emploi de noms divins pour désigner les éléments n'est pas une simple ornementation poétique : il exprime la conviction que les racines possèdent une dignité ontologique supérieure, qu'elles sont douées d'une forme de vie et de pensée, qu'elles sont, en un sens, divines<ref>Peter Kingsley, ''Ancient Philosophy, Mystery, and Magic'', Oxford University Press, 1995, p. 48-52</ref>. L'identification précise de chaque divinité à chaque élément a donné lieu à des divergences entre les traditions doxographiques. La version la plus anciennement attestée, conservée par Diogène Laërce et Aétius, attribue le feu à Zeus le lumineux, l'air à Héra vivifiante, la terre à Aidôneus, et l'eau à Nestis, divinité aquatique sicilienne dont les larmes engendrent la source des mortels<ref>Diogène Laërce, VIII, 76 ; Aétius, I, 3, 20</ref>. D'autres traditions doxographiques, notamment celle conservée par Stobée, proposent des correspondances différentes, attribuant à Héra la terre et à Aidôneus l'air<ref>Stobée, ''Éclogues'', I, 10, 11b</ref>. Ces divergences secondaires reflètent les difficultés d'interprétation du texte original d'Empédocle. L'essentiel du système demeure : les quatre racines sont coéternelles, équivalentes en dignité ontologique, irréductibles les unes aux autres, et elles constituent les briques élémentaires dont tous les corps composés sont formés. Aristote, dans sa ''Métaphysique'', reconnaît à Empédocle le mérite d'avoir été le premier à distinguer clairement quatre éléments de nature matérielle, là où ses prédécesseurs ioniens n'en avaient retenu qu'un seul : l'eau pour Thalès, l'air pour Anaximène, le feu pour Héraclite, ou une substance indéterminée (''apeiron'') pour Anaximandre<ref>Aristote, ''Métaphysique'', I, 3, 984a8-11</ref>. Cependant, le Stagirite ajoute une critique importante : Empédocle, bien qu'il pose quatre éléments, ne les utilise pas vraiment comme s'ils étaient quatre, mais plutôt comme s'ils étaient deux — le feu d'une part, et ses contraires (terre, eau, air) d'autre part<ref>Aristote, ''Métaphysique'', I, 4, 985a31-33</ref>. Cette observation suggère que, dans certains passages du poème, Empédocle privilégie une opposition binaire entre le chaud (feu) et le froid (les trois autres éléments), opposition qui joue un rôle déterminant dans la cosmogonie et la formation des êtres vivants. Néanmoins, la structure quaternaire demeure fondamentale et constitue l'architecture conceptuelle du système. === L'immuabilité des racines et l'explication du changement === Les quatre racines possèdent, selon Empédocle, les attributs que Parménide avait réservés à l'être unique : elles sont inengendrées et impérissables, elles ne croissent ni ne décroissent en quantité, elles demeurent qualitativement identiques à elles-mêmes à travers tous les changements du cosmos<ref>Empédocle, fragments 8, 11, 12, 17 DK</ref>. Ainsi, Empédocle sauvegarde le principe éléate de l'immuabilité de l'être, mais en le distribuant sur quatre substances distinctes au lieu de le concentrer sur un être unique et monolithique. Cette pluralisation de l'être parménidien constitue la clé de voûte de la solution empédocléenne au problème du devenir. Comment, dès lors, expliquer le changement, la naissance et la mort des êtres particuliers ? Empédocle répond par une théorie du mélange (''mixis'', ''krasis'') et de la séparation (''dialysis'', ''diakrisis'') des éléments. Ce que le langage ordinaire nomme « naissance » n'est qu'un assemblage, une union, une combinaison de parcelles des quatre racines ; ce que l'on nomme « mort » n'est que la dissolution, la désagrégation de cet assemblage, le retour des parcelles élémentaires à leur état dispersé<ref>Empédocle, fragment 8 DK</ref>. Rien ne naît véritablement au sens strict, rien ne périt véritablement : il y a seulement mélange et séparation de choses qui existent toujours. Les mots « naissance » et « mort » sont donc, à strictement parler, impropres et mensongers — ils relèvent de la convention humaine plutôt que de la vérité philosophique<ref>Empédocle, fragment 9 DK</ref>. Empédocle lui-même déclare qu'il se conforme à l'usage linguistique établi, tout en sachant que celui-ci ne correspond pas à la réalité ontologique profonde. Cette théorie du mélange et de la séparation permet de rendre compte de l'infinie diversité des êtres du monde sensible. Selon les proportions dans lesquelles les quatre racines se combinent, selon la configuration géométrique de leurs assemblages, naissent des substances aux propriétés extrêmement variées. Empédocle compare ce processus à l'art du peintre, qui, à partir de quatre couleurs fondamentales — le blanc, le noir, le jaune et le rouge — produit une infinité de nuances et représente tous les êtres visibles<ref>Empédocle, fragment 23 DK</ref>. De même, les quatre racines, par leurs combinaisons innombrables, engendrent les arbres, les hommes, les femmes, les bêtes sauvages, les oiseaux, les poissons, et même les dieux qui vivent longtemps<ref>Empédocle, fragment 21 DK</ref>. === Les propriétés des quatre racines === Chaque racine possède des propriétés spécifiques qui la distinguent des trois autres. Le feu se caractérise par la chaleur, la légèreté, la luminosité et le mouvement ascendant. L'air, quoique moins bien défini dans les fragments conservés, semble associé au souffle vital, à la respiration, et à l'intermédiaire entre le feu et l'eau. L'eau se signale par la froideur, l'humidité, la fluidité et la tendance à descendre. La terre se définit par la sécheresse, la densité, la stabilité et la pesanteur<ref>Aétius, I, 3, 20 ; Aristote, ''De la génération et de la corruption'', II, 3, 330b19</ref>. Ces propriétés ne sont pas adventices : elles appartiennent essentiellement à chaque élément et expliquent son comportement dans les processus cosmiques et biologiques. Aristote, dans son traité ''De la génération et de la corruption'', critique Empédocle pour n'avoir pas expliqué de manière satisfaisante comment les propriétés sensibles des corps composés dérivent des propriétés des éléments simples<ref>Aristote, ''De la génération et de la corruption'', I, 1, 314b7-26</ref>. Selon le Stagirite, Empédocle se contente d'affirmer que les os, par exemple, sont composés de deux parts d'eau, de deux parts de terre et de quatre parts de feu, sans préciser le mécanisme par lequel cette proportion numérique détermine la dureté, la blancheur et les autres propriétés de l'os<ref>Aristote, ''Des parties des animaux'', I, 1, 642a18-24</ref>. Cette critique aristotélicienne, pour fondée qu'elle soit sur le plan de la rigueur explicative, ne doit pas occulter l'audace et la fécondité de l'intuition empédocléenne : l'idée que les propriétés macroscopiques des corps résultent de la proportion et de l'arrangement de leurs constituants microscopiques anticipe, dans une certaine mesure, les conceptions modernes de la chimie et de la physique des matériaux. === Le mélange et ses degrés === Empédocle distingue plusieurs types ou degrés de mélange entre les éléments. Le mélange peut être plus ou moins intime, plus ou moins homogène. Dans certains cas, les parcelles élémentaires demeurent simplement juxtaposées, sans interpénétration véritable. Dans d'autres cas, le mélange atteint un degré de finesse tel que les parcelles de chaque élément se trouvent entremêlées de manière extrêmement serrée, donnant naissance à des substances d'apparence homogène<ref>Aristote, ''De la génération et de la corruption'', I, 10, 327b22-328a5</ref>. Le sang constitue l'exemple paradigmatique d'un mélange équilibré et harmonieux des quatre racines en proportions à peu près égales<ref>Empédocle, fragment 98 DK ; Aristote, ''Des parties des animaux'', II, 2, 647b31-648a2</ref>. La perfection de ce mélange explique pourquoi le sang, et en particulier le sang qui entoure le cœur, est le siège de la pensée (''phronêsis'') chez l'homme<ref>Empédocle, fragment 105 DK</ref>. Cette doctrine sera reprise et développée par la médecine ultérieure. Inversement, les déséquilibres dans les proportions élémentaires expliquent les différences de tempérament, d'intelligence et de capacités entre les individus : ceux dont le mélange sanguin est harmonieux sont les plus intelligents, tandis que ceux dont le mélange est défectueux, où un élément domine excessivement les autres, sont obtus, paresseux ou impulsifs<ref>Théophraste, cité par Aétius, IV, 5, 12</ref>. Cette doctrine des mélanges élémentaires fonde la physiologie, la médecine et la psychologie empédocléennes. Elle annonce, de loin, la théorie des quatre humeurs (sang, phlegme, bile jaune, bile noire) qui dominera la médecine antique et médiévale, bien que cette théorie humorale ne se soit pleinement constituée qu'avec Hippocrate et Galien<ref>Galien, ''De elementis ex Hippocratis sententia''</ref>. L'influence d'Empédocle sur l'école médicale de Sicile et d'Italie du Sud fut considérable : Galien le reconnaît comme une figure fondatrice de la pensée médicale occidentale, même s'il n'utilise pas l'expression « fondateur » dans le passage de Diogène Laërce<ref>Galien, cité par les historiens modernes de la médecine antique</ref>. === La critique aristotélicienne et la postérité de la doctrine === Aristote, tout en reconnaissant l'apport décisif d'Empédocle à la physique, formule plusieurs objections contre la théorie des quatre éléments. Premièrement, il reproche à Empédocle de ne pas avoir clairement distingué la cause matérielle (les quatre racines) de la cause efficiente (Amour et Haine), distinction qui est essentielle pour une explication scientifique rigoureuse<ref>Aristote, ''Métaphysique'', I, 4, 985a21-29</ref>. Deuxièmement, il critique l'apparente incohérence de la théorie : dans certaines phases du cycle cosmique, c'est l'Amour qui unit toutes choses dans l'unité du Sphairos, mais c'est la Haine qui sépare et isole chaque élément — le feu se rassemblant avec le feu, la terre avec la terre — ce qui produit également une forme d'union<ref>Aristote, ''Métaphysique'', I, 4, 985a23-29</ref>. Troisièmement, Aristote juge insuffisant le recours à deux principes moteurs seulement pour rendre compte de la variété des mouvements observés dans la nature<ref>Aristote, ''Physique'', VIII, 1, 252a7-14</ref>. Malgré ces critiques, Aristote lui-même adopta, en la réinterprétant profondément, la doctrine des quatre éléments. Il leur attribua des lieux naturels et des mouvements naturels (vers le haut pour le feu et l'air, vers le bas pour l'eau et la terre), et surtout il les redéfinit non plus comme des substances ultimes mais comme des composés de matière première et de couples de qualités contraires (chaud-froid, sec-humide)<ref>Aristote, ''De la génération et de la corruption'', II, 1-4</ref>. Cette transformation conceptuelle permit d'intégrer la théorie empédocléenne dans le cadre de l'hylémorphisme aristotélicien, assurant ainsi sa survie et sa diffusion pendant des siècles. La postérité de la doctrine empédocléenne des quatre éléments fut immense. Elle s'imposa comme le cadre conceptuel fondamental de la physique, de la cosmologie, de la médecine, de l'alchimie et de l'astrologie jusqu'à la révolution scientifique du XVII{{e}} siècle. Galien, Avicenne, Averroès, Albert le Grand, Thomas d'Aquin acceptèrent tous, avec des nuances diverses, la théorie des quatre éléments comme une vérité établie<ref>David C. Lindberg, ''The Beginnings of Western Science'', University of Chicago Press, 1992, p. 50-65</ref>. Ce n'est qu'avec Boyle, Lavoisier et la chimie moderne que cette théorie fut définitivement abandonnée, remplacée par la conception des éléments chimiques définis par leurs propriétés atomiques. Mais l'idée empédocléenne fondamentale — selon laquelle la diversité du monde sensible résulte de combinaisons variables d'un petit nombre de constituants élémentaires — survit, transfigurée, dans la chimie et la physique contemporaines. Elle demeure une intuition profonde sur la structure de la matière. == IV. L'Amour et la Haine : forces cosmiques primordiales == Au cœur de la cosmologie d'Empédocle se trouve un antagonisme fondamental, plus vaste encore que celui des quatre racines : le combat éternel entre deux forces universelles, l'Amour (''philia'', ''erôs'') et la Haine (''neikos'').<ref>Empédocle, fragments 16, 17, 30 DK ; Aristote, ''Métaphysique'', I, 4, 985a21-29</ref> Empédocle affirme avec force que l'Amour et la Haine existent depuis l'éternité : « Car elles ont été auparavant, elles seront plus tard, et je ne crois pas qu'aucune des deux manque jamais dans le temps infini ».<ref>Empédocle, fragment 16 DK</ref> Si les quatre racines constituent l'infrastructure matérielle du cosmos, c'est l'Amour et la Haine qui en animent le devenir, qui organisent leurs rapports, qui produisent l'alternance infinie des phases d'union et de séparation. Ces deux forces ne sont nullement des principes abstraits ou immatériels ; elles sont, au contraire, du même statut ontologique que les quatre éléments, de véritables composantes de l'être, quoique de nature qualitativement distincte.<ref>Théophraste, rapporté par Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 55-56</ref> Empédocle qualifie l'Amour par plusieurs noms divins qui en soulignent l'essence : ''philia'' (amitié), ''erôs'' (amour), ''Aphrodite'' (Vénus), ''Harmonia'' (harmonie).<ref>Empédocle, fragments 17, 19, 20, 96 DK</ref> La Haine, elle, est désignée sous les noms de ''neikos'', ''Eris'' (discorde), et figurée comme une force de séparation centrifuge.<ref>Empédocle, fragments 16, 30, 35 DK</ref> Ces noms divins n'ont rien d'ornemental poétique ; ils expriment la conviction empédocléenne que les forces cosmiques fondamentales possèdent une nature divine, une puissance créatrice incomparable.<ref>Jean Bollack, ''Empédocle. Les Origines'', Minuit, Paris, 1965-1969, t. I, p. 98-110</ref> === La nature dialectique du cosmique === L'Amour et la Haine ne se déploient pas simultanément et avec la même intensité en tous lieux et en tous temps. Au contraire, elles entrent dans une alternance cyclique réglée par une ''ananké'' (nécessité) suprême, scellée par un « vaste serment » (''horkos'').<ref>Empédocle, fragment 30 DK ; voir aussi Diogène Laërce, ''Vies et doctrines des philosophes illustres'', VIII, 76-77</ref> Cette Nécessité, cette loi inviolable garantit le déroulement éternel du cycle cosmique et, par conséquent, l'éternité du devenir lui-même. C'est une caractéristique remarquable du système empédocléen que le devenir ne soit jamais sujet à l'annihilation : il est au contraire assuré par un décret cosmique que l'alternance entre union et séparation ne connaîtra jamais de terme.<ref>Empédocle, fragment 16 DK ; Aristote, ''Physique'', VIII, 1, 250b15-22</ref> L'Amour se caractérise principalement par sa fonction unificatrice. Chaque fois qu'il prédomine, il attire vers lui l'ensemble des racines élémentaires, cherchant à les fusionner en une totalité homogène. Empédocle le célèbre en des termes sublimes : « Contemple-le par l'esprit et non avec des yeux hébétés. C'est lui qu'on regarde comme incorporé dans les membres des mortels, c'est grâce à lui qu'ils aiment et accomplissent les œuvres de l'union, lui donnant alors le nom de Joie et celui d'Aphrodite ; mais il circule aussi dans tout l'univers ».<ref>Empédocle, fragment 17 DK</ref> L'Amour « est égal en longueur et en largeur »,<ref>Empédocle, fragment 17 DK, vers 20</ref> manifestant sa présence intime en chaque lieu du cosmos. Lorsqu'il se retire, c'est-à-dire lorsque l'Amour recule devant l'assaut de la Haine, le chaos menace l'ordre établi.<ref>Empédocle, fragment 35 DK</ref> La Haine, inversement, opère par séparation et désagrégation. Elle est qualifiée comme la force sinistre, distincte de toute autre réalité, « de poids égal partout ».<ref>Empédocle, fragment 17 DK, vers 18</ref> Là où l'Amour cherche à unir les dissemblables — ce qui constitue sa fonction cruciale, puisqu'elle agit précisément en favorisant les unions entre éléments naturellement séparés —, la Haine « sépare et isole », attirant chaque racine vers ce qui lui ressemble. Empédocle souligne cette ségrégation : « Dans la Haine, ils sont tous isolés et défigurés, mais l'Amour les réunit par un désir réciproque ».<ref>Empédocle, fragment 21 DK</ref> C'est une ségrégation progressive qui culmine, à l'extrême, en une complète stratification cosmique où les quatre racines forment quatre sphères concentriques immuables. === Le Sphairos : le moment d'harmonie absolue === Le plus haut accomplissement de l'Amour se manifeste dans le Sphairos (Sphère), moment cosmique où l'union est si totale, si intégrale, que le cosmos devient une unité sphérique indivisible, parfaite dans toutes ses dimensions.<ref>Empédocle, fragments 27, 28, 29 DK</ref> En cet instant propice, Empédocle dépeint un univers transfiguré : « Alors ne se discernent pas les membres rapides du Soleil, ni la puissance velue de la terre, ni la mer — mais au sein de la stable harmonie, reposait le Sphairos, immobile ».<ref>Empédocle, fragment 27 DK</ref> Les trois mondes distincts du cosmos actuel s'abolissent dans une fusion si complète que les réalités élémentaires qui les composent perdent leurs individualités. Ce moment cosmique possède une qualité divine insigne. Empédocle le décrit comme un état de béatitude absolue, sans souffrance, sans conflit, sans le poids du devenir.<ref>Empédocle, fragment 27 DK</ref> Aucune distinction n'existe au sein du Sphairos : Empédocle le précise ainsi : « Pour tous les côtés il était égal, infiniment vaste, se forma le Sphairos. Il était arrondi ».<ref>Empédocle, fragment 28 DK</ref> Le Sphairos ne possède pas de différenciation interne. Cette caractérisation s'inspire du Parménide du poète éléate, dont Empédocle emprunte le modèle d'un être unique, indivisé et complet ; cependant, Empédocle le pluralise en reconnaissant que l'univers en bloc possède ces attributs.<ref>Peter Kingsley, ''Ancient Philosophy, Mystery, and Magic. Empedocles and Pythagorean Tradition'', Clarendon Press, Oxford, 1995, p. 50-60</ref> === Le cycle cosmique et ses phases === Selon le témoignage d'Aristote et les fragments conservés, le cosmos traverse quatre phases discernables : '''La première phase''' est celle du Sphairos intact, où l'Amour domine sans partage et la Haine reste reléguée aux extrêmes limites.<ref>Empédocle, fragment 35 DK</ref> Cette phase ne peut produire aucune réalité composite distincte puisque la complète uniformité interdit la génération.<ref>Empédocle, fragment 26 DK</ref> '''La deuxième phase''' s'inaugure quand la Haine commence à pénétrer le Sphairos, l'imprègne peu à peu, déclenchant le devenir. C'est dans cette phase que naît notre monde, celui des êtres multiples, des créatures composées, du devenir incessant. Empédocle en décrit le commencement : « Quand la Haine se fut retirée à l'extrémité du tourbillon, et qu'au centre fut venue résider l'Amitié, dès lors toutes choses se réunirent pour former un seul ensemble, mais ce n'est pas d'un seul coup ».<ref>Empédocle, fragment 35 DK</ref> L'Amour réagit immédiatement à l'assaut de la Haine, tentant de maintenir certaines unions et de créer de nouveaux équilibres.<ref>Empédocle, fragments 20, 21, 26 DK</ref> C'est le cosmos du devenir perpétuel, caractérisé par une lutte entre les deux forces antagonistes.<ref>Empédocle, fragment 26 DK</ref> '''La troisième phase''' intervient quand la Haine atteint sa plénitude de puissance. Elle a achevé la séparation complète des quatre racines, repoussant l'Amour aux extrêmes limites du cosmos. À ce stade extrême, les quatre éléments forment quatre sphères concentriques isolées les unes des autres, incapables de toute interaction.<ref>Aristote, ''De la génération et de la corruption'', II, 3, 330a25-30</ref> C'est un moment de parfaite séparation, aussi extrême dans son opposition que le Sphairos l'était dans son union. '''La quatrième phase''' voit l'Amour reprendre son offensive. Graduellement, avec lenteur et constance, il commence à réunir les quatre racines éparses, à former d'abord des composés simples, puis de plus en plus complexes, jusqu'à éventuellement reconstituer le Sphairos. Empédocle souligne que ce retour s'accomplit avec mesure : « De ce qui s'unit ainsi naissent les innombrables races des êtres mortels ; mais en face de ce qui était associé, beaucoup reste isolé ».<ref>Empédocle, fragment 35 DK</ref> Et le cycle recommence, sans fin. === L'héritage philosophique et théorique === Aristote reconnaît, non sans une certaine perplexité, que l'introduction de deux forces motrices distinctes constitue un progrès considérable par rapport à la physique ionienne.<ref>Aristote, ''Métaphysique'', I, 4, 985a21-29</ref> Cependant, il adresse à Empédocle plusieurs critiques majeures. Premièrement, l'Amour et la Haine sont présentés à la fois comme des causes efficientes (elles produisent du mouvement) et comme des causes matérielles (elles composent l'être), distinction que le Stagirite juge intolérable.<ref>Aristote, ''Métaphysique'', I, 4, 985a25-29</ref> Deuxièmement, Aristote note une asymétrie troublante : la Haine est parfaitement destructrice, tandis que l'Amour ne cesse d'opérer même dans la séparation, puisque la Haine elle-même unit ce qui est semblable. Dès lors, comment affirmer qu'elle soit réellement démiurgique au sens plein ?<ref>Aristote, ''Physique'', II, 8, 198b34-199a2</ref> Ces critiques aristotéliciens, bien que sévères, méconnaissent la subtilité du système empédocléen. Chez Empédocle, en effet, la distinction entre cause matérielle et cause efficiente n'existe pas encore au sens aristotélicien. Les deux forces sont matérielles et motrices en même temps parce que, dans la conception empédocléenne, la matière elle-même est vivante, douée d'une forme d'intentionnalité. L'Amour et la Haine ne sont pas des principes transcendants qui agiraient du dehors sur une matière passive ; ils sont immanents au cosmos, en constituent les fibres mêmes.<ref>Jean Bollack, ''Empédocle. Les Origines'', Minuit, Paris, 1965-1969, t. I, p. 110-115</ref> L'influence de cette conception des forces cosmiques s'étendra bien au-delà de l'Antiquité. Schopenhauer reconnaîtra en Empédocle un précurseur majeur de sa propre métaphysique du Vouloir, où une impulsion universelle, tantôt attractive, tantôt répulsive, anime le cosmos entier.<ref>Arthur Schopenhauer, ''Le Monde comme volonté et représentation'', Livre II, Supplément (trad. Auguste Burdeau), Félix Alcan, Paris, 1890</ref> Freud mentionnera explicitement Empédocle comme source d'inspiration pour sa théorie des pulsions érotiques (Éros) et des pulsions de mort (Thanatos), montrant comment ces deux forces antagonistes et complémentaires gouvernent tous les phénomènes de la vie.<ref>Sigmund Freud, ''Au-delà du principe du plaisir'' (trad. française), Payot, Paris, 1920, p. 36-40</ref> C'est ainsi que le penseur d'Agrigente, philosophe présocratique dont l'œuvre ne nous est connue que par fragments, a jeté les bases conceptuelles pour toute une tradition occidentale de pensée organique et dynamique, résolument contraire à tout réductionnisme mécaniste. == V. La perception et la théorie de la connaissance == La théorie de la connaissance d'Empédocle repose sur un principe simple mais d'une profondeur remarquable : '''le semblable connaît le semblable''' (''homoion gignôskei homoion'')<ref>Empédocle, fragment 109 DK Théophraste chez Aetius IV, 9, 15</ref>. Ce principe, fondamental à toute sa physique, établit une consubstantialité entre l'organe percevant et l'objet perçu, une intrinsèque affinité qui rend possible la connaissance en supprimant temporairement la distance qui sépare le sujet de l'objet. Contrairement aux penseurs qui l'ont précédé, notamment Parménide et Héraclite, Empédocle construit une théorie unifiée de la perception qui englobe l'ensemble des modalités sensorielles et qui s'articule à la cosmologie des quatre racines et à l'action de l'Amour et de la Haine<ref>Théophraste, ''De la sensation'', I sq., cité dans Diogène Laërce, VIII, 55-56</ref>. === Les organes des sens et la théorie des pores === Empédocle imagine que tous les corps, aussi bien externes qu'internes, possèdent des pores (''póroi'') de dimensions variables, et que ces pores se correspondent en vertu d'affinités élémentaires. La sensation est produite par l'entrée de particules minuscules, appelées ''effleuves'' ou ''aporrhóiai'', qui se détachent de tous les corps et pénètrent dans ces pores<ref>Empédocle, fragments 89, 92 DK Aetius IV, 13, 4-5</ref>. Cette théorie des effleuves explique pourquoi certaines sensations sont possibles tandis que d'autres ne le sont pas : les pores de l'œil ne peuvent admettre que les effleuves de la lumière, tandis que les pores de l'oreille ne reçoivent que les effleuves du bruit. Chaque sens dispose ainsi d'une spécificité structurelle qui le limite à la perception des objets pour lesquels ses pores présentent la bonne configuration<ref>Empédocle, fragment 86 DK Théophraste chez Plutarque, ''De la vertu morale'', 446e</ref>. Cette doctrine des pores révèle une compréhension remarquablement sophistiquée de la sélectivité sensorielle. Empédocle l'explicite en affirmant que ''il n'est pas possible qu'un sens juge des objets d'un autre, car les pores de quelques-uns d'entre eux sont trop larges, et ceux des autres trop étroits pour l'objet sensible''<ref>Empédocle, fragment 86 DK</ref>. La vue, l'ouïe, l'odorat, le goût et le toucher ne se concurrencent ni ne se remplacent les uns les autres ; ils forment plutôt un ensemble de canaux distincts, chacun spécialisé dans l'interception de certaines catégories d'effleuves. Empédocle recommande même à son disciple Pausanias d'accorder confiance à tous les sens de manière équitable : ''Va, examine de toutes façons comment chaque chose se manifeste / Mais n'accorde pas plus de confiance à la vue qu'à l'ouïe''<ref>Empédocle, fragment 3 DK</ref>. === La vision : la lumière émanée du feu intérieur === Pour la vision, Empédocle propose une théorie originale où l'acte de voir résulte de la rencontre entre le feu interne à l'œil et le feu externe provenant des objets. L'œil est composé de quatre éléments, mais le feu y prédomine. Il est entouré d'eau, de terre et d'air qui forment une enveloppe protectrice. Le feu intérieur s'écoule à travers cette enveloppe comme la lumière traverse une lanterne, rencontrant le feu externe du monde, et cette union produit la vision<ref>Théophraste chez Aetius IV, 14, 1-2 Empédocle, fragment 84 DK</ref>. La couleur des yeux détermine les conditions de visibilité : les yeux riches en feu voient mieux la nuit, car ils compensent le manque de lumière externe, tandis que les yeux riches en eau voient mieux le jour<ref>Empédocle, fragment 91 DK</ref>. Cette doctrine anticipe certains éléments de la théorie moderne de la vision, bien que ses fondements soient radicalement différents. === L'audition et l'analogie de la cloche === Pour l'ouïe, Empédocle la compare à une cloche. Le son est produit par le choc de l'air extérieur mû par la voix sur le cartilage suspendu à l'intérieur de l'oreille, cartilage qui tinte comme le battant d'une cloche<ref>Empédocle, fragment 93 DK Aetius IV, 16, 1</ref>. L'audition est donc essentiellement un phénomène de résonance : l'air intérieur de l'oreille entre en vibration sympathique avec l'air extérieur qui porte le son. C'est une parfaite illustration du principe du semblable connaissant le semblable : l'air intérieur reconnaît l'air extérieur en entrant en harmonie vibrante avec lui<ref>Théophraste chez Diogène Laërce, VIII, 55</ref>. === L'olfaction et la respiration === L'odorat s'accomplit par la respiration, ce qui explique pourquoi ceux qui sentent le mieux possèdent les mouvements respiratoires les plus violents<ref>Empédocle, fragment 102 DK</ref>. Le chien de chasse qui suit une trace cherche les particules que l'animal a laissées en se déplaçant, des parcelles de matière qui pénètrent les narines du chasseur au rythme de sa respiration<ref>Empédocle, fragment 101 DK</ref>. Ainsi, l'odeur porte en elle les éléments constituants de la chose odorante et entre en contact avec les éléments semblables présents dans l'organe olfactif du percevant. === La théorie unifiée de la sensation === Ces modalités sensorielles distinctes convergent en une théorie générale selon laquelle ''la sensation naît de l'adaptation aux pores''<ref>Théophraste, ''De la sensation'', 1 sq.</ref>. Plutôt que de considérer chaque sens comme un mécanisme entièrement distinct, Empédocle les intègre tous dans un schéma unifié : en chaque lieu du corps, existent des pores ; dans chaque corps du monde environnant, se dégagent des effleuves ; quand les dimensions des pores correspondent aux dimensions des effleuves, la sensation a lieu. Cette correspondance n'est jamais fortuite : elle repose sur une affinité élémentaire profonde. La sensation est ainsi une forme d'union, une communion temporaire entre ce qui perçoit et ce qui est perçu<ref>Empédocle, fragment 90 DK : « Ainsi le doux se saisit du doux, l'amer se précipite vers l'amer, / L'acide va vers l'acide et le chaud s'unit au chaud »</ref>. === La respiration et la physiologie === L'explication empédocléenne de la respiration, illustrée par la célèbre analogie de la clepsydre, révèle la profondeur de sa pensée physiologique<ref>Empédocle, fragment 100 DK</ref>. La clepsydre, ce récipient antique destiné à verser des liquides, possède une imbouchure supérieure et un fond percé de nombreux petits trous formant un crible. Quand on la plonge vide dans l'eau en tenant l'imbouchure fermée, l'eau n'y pénètre pas, car l'air interne repousse le liquide. Dès qu'on retire la main de l'imbouchure, l'eau s'y précipite. De même, dans l'organisme vivant, le sang et l'air effectuent une danse alternative : quand le sang se retire des capillaires, l'air y pénètre ; quand le sang y retourne, l'air en sort. Ce mécanisme explique la respiration pulmonaire : l'air externe s'engouffre dans les poumons en empruntant les trachées et bronches pour occuper l'espace évacué par le sang qui reflue vers le cœur<ref>Empédocle, fragment 100 DK</ref>. Cette conception du poumon comme siège d'échanges régulés entre deux fluides incompressibles constitue une intuition physiologique remarquable, même si les détails anatomiques ne pouvaient être correctement établis à l'époque. === Le sang, siège de la pensée === La cognition elle-même, pour Empédocle, s'inscrit dans ce cadre physiologique. Le sang, particulièrement le sang circulant autour du cœur, constitue le siège de la pense (''nous''). Ceci découle de sa composition unique : le sang contient les quatre racines élémentaires en proportions à peu près égales, ce qui en fait le mélange le plus harmonieux et le plus intelligent<ref>Empédocle, fragment 105 DK : « Car le sang qui entoure le cœur est la Pensée chez l'espèce humaine »</ref>. La qualité de la pensée dépend directement de la qualité du mélange sanguin : ''Tous ceux chez lesquels le mélange est égal, ou peu pres, et chez qui les éléments ne sont ni de trop grands intervalles, ni trop petits, ni trop grands, sont les plus intelligents''<ref>Empédocle, fragment 107 DK Théophraste chez Aetius IV, 5, 12</ref>. À l'inverse, ceux dont le mélange sanguin est déséquilibré, où un élément prédomine excessivement, sont obtus, paresseux ou impulsifs<ref>Théophraste chez Aetius IV, 5, 12</ref>. Cette doctrine établit une continuité remarquable entre la sensation et la pensée. Comme le rapporte Théophraste, ''la pense naît de ce qui est semblable, l'ignorance de ce qui est dissemblable, si bien que la pense est la même chose, ou peu s'en faut, que la sensation''<ref>Théophraste, ''De la sensation'', 1 sq., cité par Aetius IV, 9, 11</ref>. La cognition n'est donc pas une faculté transcendantale détachée de la sensation elle en constitue l'achèvement et l'approfondissement. Penser, c'est continuer à percevoir, mais de manière plus stable et plus intègre. === Le principe gnoséologique et ses implications === Le principe ''le semblable connaît le semblable'' possède des implications gnoséologiques profondes. Il signifie que le sujet percevant ne peut connaître que ce dont il partage la nature. L'homme, composé des quatre racines élémentaires, ne peut connaître le monde extérieur que parce que ce monde est fait des mêmes racines : ''Nous voyons la terre par la terre, l'eau par l'eau, / L'air divin par l'air et le feu destructeur par le feu''<ref>Empédocle, fragment 87 DK</ref>. Cette doctrine implique une consubstantialité fondamentale entre le connaissant et le connu, une osmose perpétuelle entre l'intérieur et l'extérieur. L'Amour, en unissant les semblables, crée le condition même de la connaissance. C'est pourquoi la sensation est toujours accompagnée d'une forme de plaisir : ''Le plaisir est procuré au semblable par le semblable dans l'addition de ce qui lui fait défaut''<ref>Empédocle, fragment 95 DK</ref>. Empédocle reconnaît aussi que la connaissance comporte un élément irréductiblement limité. Les pouvoirs répandus dans les membres des hommes sont circonscrits ; nous ne voyons pendant notre existence qu'une brève part de la vie<ref>Empédocle, fragment 2 DK</ref>. Néanmoins, celui qui s'applique avec rigueur et qui cultive son intelligence peut accéder à une compréhension plus vaste. L'apprentissage consiste à se rapprocher progressivement de la totalité des choses, même si cette totalité demeure définitivement inaccessible à un mortel individuel. C'est peut-être pourquoi Empédocle valorise tellement la transmigration des âmes : en vivant successivement sous différentes formes, en parcourant les règnes animal, végétal et humain, l'âme accumule une connaissance pancosmique, une intelligence qui embrasse les vicissitudes de tous les êtres<ref>Empédocle, fragment 117 DK</ref>. === La critique aristotélicienne et l'héritage ultérieur === Aristote, malgré son admiration pour l'ingéniosité d'Empédocle, formule plusieurs critiques contre sa théorie de la perception. Il reproche notamment à l'Acragentin l'absence de clarté quant aux mécanismes précis par lesquels les effleuves pénètrent les pores, ainsi que l'incohérence apparente de maintenir que la sensation résulte à la fois d'une ressemblance (le semblable connaît le semblable) et de contacts physiques (les effleuves pénétrant les pores)<ref>Aristote, ''De la sensation'', II, 437b10-438a5</ref>. Néanmoins, la théorie empédocléenne de la perception exerça une influence considérable sur la philosophie ultérieure. Platon s'inspira de certains éléments de cette théorie lorsqu'il élabora sa propre doctrine de la vision dans le ''Timée''<ref>Platon, ''Timée'', 45b-c Laks et Most, 2016, p. 703-704</ref>. Plus tardivement, les stoïciens intégreront la théorie empédocléenne des effleuves dans leur propre pneumatologie. La conception empédocléenne selon laquelle la matière elle-même possède une forme d'intention et que les contacts sensoriels unissent essentiellement le percevant et le perçu allait exercer une fascination durable sur les alchimistes médiévaux et la Naturphilosophie romantique. == VI. La génération des êtres vivants et la physiologie == La théorie empédocléenne de la génération des êtres vivants représente l'une des contributions les plus audacieuses de la pensée présocratique à la biologie et à la physiologie. Fondée sur les principes du mélange et de la séparation des quatre racines élémentaires, auxquels s'ajoutent l'action de l'Amour et de la Haine, cette théorie s'efforce de rendre compte de l'infinie variété des vivants, de la simplicité des végétaux à la complexité des animaux et des humains<ref>Empédocle, fragments 20, 21, 26, 62, 63 DK Aetius, V, 19, 5 Aristote, ''De partibus animalium'', I, 1, 642a17</ref>. === Les phases de la zoogenèse === Selon le témoignage d'Aétius et de plusieurs auteurs anciens, Empédocle décrit la genèse des êtres vivants comme une succession de phases où se reconfigurent les combinaisons des quatre racines sous l'action de l'Amour et de la Haine.<ref>Aétius, V, 19, 4 = Empédocle, 31 B 57 DK.</ref> La recherche moderne a souvent rapproché ce schéma d'un modèle « évolutif », mais il ne s'agit pas d'une théorie de l'évolution au sens biologique contemporain : Empédocle ne parle ni d'ascendance commune, ni de transmission héréditaire de caractères, ni d'adaptation graduelle à un milieu. Il met en scène des configurations successives du vivant dans le cadre d'un cycle cosmique gouverné par des forces cosmiques. La première phase est caractérisée par l'apparition de membres et d'organes isolés, entièrement désagrégés, errant solitairement sur la terre sans cohésion organique : « Sur la terre naquirent de nombreuses têtes privées de cou, / Et des bras erraient séparés du tronc, sans épaules, / Et des yeux allaient ici et là privés de front. »<ref>Empédocle, 31 B 57 DK.</ref> Ces membres épars constituent le résidu de la désagrégation progressive du Sphairos sous l'action croissante de la Haine. La deuxième phase voit ces membres commencer à se rencontrer et à s'assembler de façon aléatoire et chaotique. C'est le moment où naissent les monstres terrifiants, créatures hybrides dépourvues de toute harmonie : « Des êtres aux pieds tournés, aux mains innombrables, / De nombreuses créatures naquirent avec un visage et une poitrine des deux côtés, / Des bovins à figure humaine naquirent et inversement, / Des enfants d'hommes avec des têtes bovines. »<ref>Empédocle, 31 B 61 DK.</ref> Empédocle ne précise pas systématiquement le destin de ces êtres, mais la tradition doxographique indique que ces unions chaotiques étaient le plus souvent stériles ou non viables.<ref>Aristote, ''Physique'', II, 8, 198b-199b.</ref> Dans une troisième phase, l'entrée décisive de l'Amour dans le processus permet la constitution d'organismes plus complets, dotés de proportions plus harmonieuses : « Tirant des formes indistinctes de la terre, / Mais ayant également une part d'humidité et de feu. »<ref>Empédocle, 31 B 62 DK.</ref> Ces créatures « ne montraient pas encore un corps charmant doué de membres / Ni la voix, ni les organes propres aux hommes » : elles demeurent des ébauches, où la Haine continue de maintenir les formes dans une incomplétude essentielle, tandis que l'Amour commence déjà à créer des liaisons stables. La quatrième phase correspond au régime de la génération « normale », sexuelle, où les individus nés par reproduction se transmettent la vie selon les lois de la procréation. C'est le monde que nous habitons, où la génération procède de l'accouplement du mâle et de la femelle et où la transmission héréditaire assure la continuité des lignées.<ref>Aétius, V, 19, 5.</ref> === Les monstres et la sélection naturelle === La vision empédocléenne du monde vivant primordial est l'un de ses aspects les plus étonnants et les plus débattus. Les êtres « convenablement constitués », possédant une harmonie suffisante entre leurs parties et une réelle aptitude à vivre, survivent et se multiplient, tandis que les monstres inaptes, les hybrides dysharmoniques, les créatures défectueuses disparaissent et ne se reproduisent pas.<ref>Aristote, ''Physique'', II, 8, 198b-199b.</ref> C'est ce motif, transmis notamment par Aristote, qui a conduit plusieurs historiens à rapprocher Empédocle d'une sorte de préhistoire de la sélection naturelle. Depuis le XIX{{e}} siècle, certains commentateurs, à la suite de Zeller, n'ont pas hésité à présenter Empédocle comme « le plus ancien précurseur de Darwin ».<ref>Eduard Zeller, ''Die Philosophie der Griechen in ihrer geschichtlichen Entwicklung'', Leipzig, 1844-1852.</ref> Une telle assimilation, bien qu'instructive par certains côtés, demeure pourtant superficielle. Empédocle n'élabore ni une théorie mécaniste de la variation aléatoire, ni un modèle d'adaptation graduelle à un environnement changeant. Chez lui, la disparition des monstres reflète, au niveau biologique, le triomphe progressif de l'Amour sur la Haine plutôt qu'une optimisation statistique des formes de vie. On peut dire, avec prudence, que la notion empédocléenne d'une succession de formes plus ou moins harmonieuses fournit un précédent antique que la pensée transformiste moderne a pu reconnaître rétrospectivement comme un « analogue » lointain, sans qu'il y ait pour autant continuité doctrinale avec les théories darwiniennes. === La physiologie humaine et le rôle du sang === Empédocle accorde une attention particulière à la composition et aux fonctions du corps humain. Selon le témoignage d'Aetius, le corps humain est formé « du mélange en parties à peu près égales des quatre éléments »<ref>Aetius, V, 22, 1 ap. Diogène Laërce, VIII, 76</ref>. Plus précisément, Empédocle fournit des proportions exactes pour différents tissus : « Les chairs naissent du mélange en parties égales des quatre éléments, les nerfs de feu et de terre unis au double d'eau, les ongles viennent aux vivants des nerfs qui se refroidissent au contact de l'air, les os sont formés d'un mélange de deux parties d'eau et de terre et de quatre de feu »<ref>Empédocle, fragment 96 DK Aetius, V, 22, 1</ref>. Cette présentation numérique témoigne de l'effort empédocléen pour donner une explication rationnelle et quantifiable de la structure des corps organisés. Le rôle du sang revêt, dans cette physiologie, une importance exceptionnelle. Le sang, particulièrement celui qui circule autour du cœur, constitue le siège de la pensée, du sentiment et de la vie intellectuelle : « Tous ceux chez lesquels le mélange est égal, ou à peu près, et chez qui les éléments ne sont ni de trop grands intervalles, ni trop petits, ni trop grands, sont les plus intelligents »<ref>Empédocle, fragment 107 DK Théophraste chez Aetius, IV, 5, 12</ref>. Car « le sang qui entoure le cœur est la Pensée chez l'espèce humaine »<ref>Empédocle, fragment 105 DK</ref>. Cette doctrine établit une continuité remarquable entre le physique et le mental, entre le matériel et le cognitif, en affirmant que l'intelligence et la pensée sont le produit direct de la qualité et de la proportion du mélange sanguin<ref>Théophraste chez Aetius, IV, 5, 12</ref>. Inversement, ceux dont le mélange sanguin est déséquilibré, où un ou plusieurs éléments prédominent excessivement, possèdent une capacité intellectuelle diminuée. Les différences individuelles de talent, de capacité, de tempérament résultent directement des variations dans la composition élémentaire du sang et des autres humeurs du corps<ref>Théophraste chez Aetius, IV, 5, 12</ref>. Cette théorie préfigure la physiognomonie et la théorie des tempéraments qui dominèrent la médecine ancienne et médiévale. === La respiration et la clepsydre === L'explication empédocléenne de la respiration, illustrée par la célèbre analogie de la clepsydre, constitue un chef-d'œuvre de pédagogie scientifique et une préfiguration géniale des mécanismes ventilatoires modernes<ref>Empédocle, fragment 100 DK</ref>. Une clepsydre est un récipient destiné à verser des liquides, possédant une embouchure supérieure et un fond percé de nombreux petits trous. Quand on la plonge vide dans l'eau en tenant l'embouchure fermée, l'eau n'y pénètre pas, car l'air intérieur repousse le liquide. Dès qu'on retire la main de l'embouchure, l'eau s'y précipite. De même, dans le corps vivant, le sang et l'air effectuent une danse alternative : quand le sang se retire des capillaires cutanés, l'air y pénètre ; quand le sang y retourne, l'air en sort<ref>Empédocle, fragment 100 DK</ref>. Ce mécanisme explique la respiration pulmonaire et cutanée. L'air externe s'engouffre dans les poumons en empruntant les trachées et bronches pour occuper l'espace évacué par le sang qui reflue vers le cœur. À l'inverse, quand le sang se retire du cœur pour irriguer la périphérie, l'air sortant des poumons est expulsé par les narines<ref>Théophraste chez Aetius, IV, 22, 1</ref>. Ce cycle d'inspiration et d'expiration se reproduit à chaque battement cardiaque. Empédocle conçoit donc la respiration non comme un simple phénomène d'échange gazeux, mais comme une oscillation volumétrique et une compénétration harmonieuse du blood et de l'air<ref>Empédocle, fragment 100 DK</ref>. === La génération, le sexe et l'hérédité === Empédocle s'intéresse également aux questions de la détermination du sexe à la conception. Selon Aristote, qui rapporte sa doctrine, Empédocle pensait que « les germes qui entrent dans un utérus chaud deviennent mâles, ceux qui pénètrent dans un utérus froid deviennent femelles, ce froid et cette chaleur proviendraient du flux menstruel, suivant qu'il est plus froid ou plus chaud »<ref>Aristote, ''De generatione animalium'', IV, 1, 764a1 ; Aetius, V, 7, 1</ref>. Cette théorie thermique du sexe, quoique erronée dans ses mécanismes, témoigne d'une certaine reconnaissance du rôle des conditions intrautérines dans la différenciation sexuelle<ref>Aristote, ''De generatione animalium'', II, 8, 747a24</ref>. Sur la question de l'hérédité et de la ressemblance entre parents et enfants, Empédocle propose une théorie sophistiquée combinant des facteurs physiologiques et même psychologiques. Si « la chaleur est la même dans les semences des parents, il naît un mâle qui ressemble à son père ; si le froid est identique, il naît une femme qui ressemble à sa mère »<ref>Aetius, V, 7, 1 ; Aristote, ''De generatione animalium'', II, 8, 747a24</ref>. De plus, Empédocle affirme, de manière remarquable, que « la conformation du fœtus est soumise pendant la gestation à l'imagination de la mère : souvent, en effet, les femmes se prennent d'amour pour des statues ou des tableaux et ont ensuite des enfants qui ressemblent à ces objets »<ref>Aetius, V, 7, 1 ; Censorinus, 6, 6</ref>. Cette docrine, quoique basée sur des principes physiologiquement inacceptables pour nous, révèle une préoccupation pour le rôle de la vie émotionnelle et imaginative dans la transmission des caractères héréditaires. === La naissance, le cœur et la mort === Empédocle affirme, contrairement à d'autres penseurs, que « le cœur se forme avant toutes choses, parce qu'il contient la part essentielle de la vie de l'homme »<ref>Aetius, V, 24, 2 ; Censorinus, 7, 5</ref>. Cette affirmation manifeste une intuition remarquable du rôle central du cœur dans la vie physiologique. Au moment de la naissance, l'animal inspire pour la première fois quand le liquide amniotique est évacué et que l'air extérieur entre dans le vide créé par ce départ : « La chaleur interne, tendant à partir au-dehors, chasse l'air et il y a expiration ; lorsqu'elle cède à la pression de l'air et permet à celui-ci de rentrer, il y a une nouvelle inspiration »<ref>Théophraste chez Aetius, IV, 22, 1</ref>. Quant à la mort, Empédocle la conçoit non comme une anéantissement, mais comme une séparation des éléments : « La mort provient de la séparation de l'élément igné, de l'élément aérien, de l'élément humide et de l'élément terrestre, dont le mélange constitue l'homme »<ref>Aetius, V, 25, 4 ; Empédocle, fragment 98 DK</ref>. Le sommeil, état moins extrême que la mort, « provient d'un léger refroidissement de la chaleur du sang »<ref>Aetius, V, 24, 2</ref>, tandis que la mort résulte d'un « refroidissement complet »<ref>Aetius, V, 25, 4</ref>. Cette physiologie du repos et de la mort envisage ces états comme des variations quantitatives de la calorification plutôt que comme des changements qualitatifs radicaux. === La critique aristotélicienne === Aristote, tout en reconnaissant l'ingéniosité de certaines explications empédocléennes, les soumet à une critique serrée. Il reproche notamment à Empédocle de n'avoir pas clairement distingué entre les causes matérielles (les éléments) et les causes formelles ou organisant le tout<ref>Aristote, ''De partibus animalium'', I, 1, 642a17-31</ref>. Selon le Stagirite, Empédocle confond l'explication matérielle avec l'explication par la cause efficiente et par la cause finale. Les os ne sont pas des os simplement parce qu'ils contiennent deux parties d'eau, deux parties de terre et quatre parties de feu ; cette proportion matérielle ne suffit pas à expliquer la forme osseuse, sa densité caractéristique, sa résistance à la fracture, son rôle dans le squelette<ref>Aristote, ''Des parties des animaux'', I, 1, 642a17-31</ref>. Néanmoins, la physiologie empédocléenne, malgré ses lacunes et ses erreurs, constitue un apport durable à la pensée biologique occidentale. Son influence sur l'école médicale de Sicile et d'Italie du Sud fut considérable. Galien reconnaît explicitement Empédocle comme le fondateur de cette école médicale<ref>Galien cité dans Diogène Laërce, VIII, 75</ref>. Les théories des quatre humeurs, des tempéraments corporels, et de la prédominance du cœur dans la vie mentale et physique trouveront leurs racines dans le système empédocléen, qui sera progressivement raffiné et systématisé par les générations ultérieures de médecins et de philosophes. == Notes et références == {{references}} == Bibliographie == === Éditions critiques des fragments === ==== Éditions de référence ==== Hermann '''Diels''' et Walther '''Kranz''', ''Die Fragmente der Vorsokratiker'', Berlin, Weidmann, 1re éd. 1903, 6e éd. 1951-1952, 3 vol. Nombreuses rééditions. Cette édition, abrégée DK ou D.-K., constitue la référence classique pour la numérotation des fragments présocratiques. Empédocle y figure sous le numéro 31. Friedrich Wilhelm '''Sturz''', ''Empedocles Agrigentinus. De vita et philosophia ejus exposuit carminum reliquias ex antiquis scriptoribus collegit, recensuit, illustravit, praefationem et indices adjecit'', Leipzig, 1805. Première édition moderne des fragments. Simon '''Karsten''', ''Empedoclis Agrigentini carminum reliquiae'', Amsterdam, 1838. Édition avec commentaire philologique détaillé. ==== Éditions récentes avec les découvertes papyrologiques ==== Alain '''Martin''' et Oliver '''Primavesi''', ''L'Empédocle de Strasbourg P. Strasb. gr. Inv. 1665-1666. Introduction, édition et commentaire'', Strasbourg-Berlin-New York, Bibliothèque nationale et universitaire de Strasbourg - De Gruyter, 1999, xi-396 p. Édition princeps du papyrus de Strasbourg contenant environ 74 vers nouveaux ou partiellement nouveaux d'Empédocle, découvert dans les collections de la Bibliothèque nationale et universitaire de Strasbourg. Cette publication a profondément renouvelé les études empédocléennes. Oliver '''Primavesi''', ''Empedokles Physika I. Eine Rekonstruktion des zentralen Gedankengangs'', Berlin-New York, De Gruyter, Archiv für Papyrusforschung und verwandte Gebiete, Beiheft 22, 2008, 84 p. Reconstruction de la structure du poème ''Sur la Nature'' à partir du papyrus de Strasbourg. Nathan '''Carlig''', découverte récente d'un nouveau fragment de papyrus au Caire P. Fouad inv. 218 contenant une trentaine de vers inédits d'Empédocle, encore en cours d'édition. Publication annoncée. ==== Éditions avec traduction ==== André '''Laks''' et Glenn W. '''Most''' dir., ''Early Greek Philosophy'', 9 vol., Cambridge Mass.-Londres, Harvard University Press, Loeb Classical Library 524-532, 2016. Édition et traduction anglaise de l'ensemble des philosophes présocratiques, avec bibliographie mise à jour. Empédocle figure dans le volume V. Brad '''Inwood''', ''The Poem of Empedocles. A Text and Translation with an Introduction'', Toronto, University of Toronto Press, Phoenix Supplementary Volumes, 1re éd. 1992, éd. révisée 2001. Édition du texte grec avec traduction anglaise en vers et introduction substantielle. Inwood défend la thèse d'un poème unique contre la division traditionnelle en deux œuvres. M. R. '''Wright''', ''Empedocles the Extant Fragments'', New Haven-Londres, Yale University Press, 1re éd. 1981, 2e éd. avec bibliographie mise à jour, Bristol, Bristol Classical Press, 1995, 368 p. Édition du texte grec avec traduction anglaise, introduction et commentaire détaillé. Daniel W. '''Graham''', ''The Texts of Early Greek Philosophy. The Complete Fragments and Selected Testimonies of the Major Presocratics'', Cambridge, Cambridge University Press, 2010, 2 vol. Édition et traduction anglaise accessible des principaux présocratiques. === Éditions et études en français === ==== Éditions de Jean Bollack ==== Jean '''Bollack''', ''Empédocle'', Paris, Les Éditions de Minuit, collection « Le sens commun », 1965-1969, 3 vol. puis Paris, Gallimard, collection « Tel » n° 201-203, 1992, 3 vol. Réédition de l'ouvrage fondamental de Bollack : * Tome I : ''Introduction à l'ancienne physique'', 420 p. * Tome II : ''Les Origines. Édition et traduction des fragments et des témoignages'' * Tome III : ''Les Origines. Commentaires 1 et 2'' Jean '''Bollack''', ''Les Purifications. Un projet de paix universelle'', Paris, Éditions du Seuil, collection « L'ordre philosophique », 2003, 176 p. Réédition Paris, Points, collection « Points Essais », 2003. Édition, traduction et commentaire des fragments des ''Catharmes'' Purifications, intégrant les découvertes du papyrus de Strasbourg. ==== Autres traductions françaises ==== Jean '''Zafiropulo''', ''Empédocle d'Agrigente'', Paris, Les Belles Lettres, 1953. Traduction avec introduction et notes. Jean '''Voilquin''', ''Les Penseurs grecs avant Socrate. De Thalès de Milet à Prodicos'', Paris, Garnier-Flammarion, 1941, 2e éd. 1964. Traduction des principaux fragments présocratiques. Yves '''Battistini''', ''Trois contemporains Héraclite, Parménide, Empédocle'', traduction nouvelle et intégrale avec notices, Paris, Gallimard, 1955. Jean '''Brun''', ''Empédocle ou le Philosophe de l'Amour et de la Haine'', Paris, Éditions Seghers, collection « Philosophes de tous les temps », 1966. Présentation, choix de textes, traduction et bibliographie. ==== Études françaises récentes ==== Marwan '''Rashed''', ''La Jeune Fille et la Sphère. Études sur Empédocle'', Paris, Presses de l'Université Paris-Sorbonne, collection « Philosophies », 2017, 300 p. Réédition Sorbonne Université Presses, 2023. Étude conjuguant philologie et philosophie, proposant une nouvelle interprétation du cycle cosmique et mettant en lumière la présence cachée de Perséphone dans le poème. L'ouvrage exploite des sources manuscrites byzantines découvertes par l'auteur.<ref>web:f> Jean '''Bollack''', « Voir la Haine. Sur les nouveaux fragments d'Empédocle », ''Methodos'', 1, 2001, p. 173-185. André '''Laks''', « À propos de l'édition du nouvel Empédocle de Strasbourg par A. Martin et O. Primavesi », ''Methexis'', 14, 2001, p. 117-125. Compte rendu critique de l'édition du papyrus de Strasbourg. Xavier '''Gheerbrant''', « Traduire Empédocle, entre poésie et philosophie comparaison de dix traductions en cinq langues 1838-2016 », dans ''La traduction épistémique entre poésie et prose'', Arras, Artois Presses Université, 2020, p. 87-142. === Études en italien === Ettore '''Bignone''', ''Empedocle. Studio critico, traduzione e commento delle testimonianze e dei frammenti'', Turin, 1916. Réédition Rome, 1963. Étude critique monumentale avec traduction italienne et commentaire détaillé. === Études en allemand === Walther '''Kranz''', ''Empedokles. Antike Gestalt und romantische Neuschöpfung'', Zurich, Artemis Verlag, 1949. Étude sur Empédocle et sa réception romantique. Ulrich von '''Wilamowitz-Moellendorff''', « Die Katharmoi des Empedokles », ''Sitzungsberichte der Preussischen Akademie der Wissenschaften'', Philosophisch-historische Klasse, Berlin, 1929, p. 626-661. Réédition dans ''Kleine Schriften'', vol. I, Berlin, 1935, p. 473-521. Étude fondamentale sur les ''Purifications''. === Études en anglais === ==== Monographies ==== Clara Elizabeth '''Millerd''', ''On the Interpretation of Empedocles'', Chicago, University of Chicago Press, 1908. Première grande étude américaine. Peter '''Kingsley''', ''Ancient Philosophy, Mystery, and Magic Empedocles and Pythagorean Tradition'', Oxford, Clarendon Press, 1995. Traduction française par Grégoire Lacaze : ''Empédocle et la tradition pythagoricienne. Philosophie ancienne, mystère et magie'', Paris, Les Belles Lettres, collection « Vérité des mythes », 2010. Étude renouvelant l'approche d'Empédocle en le replaçant dans son contexte originel, où philosophie, mystères et magie sont étroitement liés.<ref>webef> Catherine '''Osborne''', ''Rethinking Early Greek Philosophy Hippolytus of Rome and the Presocratics'', Ithaca New York, Cornell University Press, 1987. Analyse de la réception d'Empédocle chez Hippolyte de Rome. ==== Articles et contributions ==== Denis '''O'Brien''', « Empedocles Revisited », ''Ancient Philosophy'', 15, 1995, p. 403-470. Réexamen critique de l'interprétation du cycle cosmique. Denis '''O'Brien''', « Hermann Diels on the Presocratics Empedocles' Double Destruction of the Cosmos Aetius II, 4, 8 », ''Phronesis'', 45, 2000, p. 1-18. Catherine '''Osborne''', « Empedocles Recycled », ''The Classical Quarterly'', 37, 1987, p. 24-50. Sur l'unité ou la dualité des poèmes d'Empédocle. Catherine '''Osborne''', « Rummaging in the Recycling Bins of Upper Egypt A Discussion of A. Martin and O. Primavesi, ''L'Empédocle de Strasbourg'' », ''Oxford Studies in Ancient Philosophy'', 18, 2000, p. 329-356. Compte rendu critique de l'édition du papyrus de Strasbourg. Oliver '''Primavesi''', « Empedocles Cosmic Cycle and the Pythagorean Tetractys », ''Rhizomata'', 4/1, 2016, p. 5-29. Analyse du cycle cosmique en relation avec la tétractys pythagoricienne. Oliver '''Primavesi''', « La Daimonologia della fisica empedoclea », ''Aevum Antiquum'', n. s. 1, 2001, sous presse. Sur la démonologie dans la physique d'Empédocle. Simon '''Trépanier''', « Empedocles on the Origin of Plants P. Strasb. gr. Inv. 1665-1666, Sections d, b and f », dans M. R. '''Wright''' dir., ''Reason and Necessity. Essays on Plato's Timaeus'', Londres, 2000. Reconstruction d'une section du papyrus de Strasbourg. Simon '''Trépanier''', « Empedocles on the Ultimate Symmetry of the World », ''Oxford Studies in Ancient Philosophy'', 24, 2003. Sur la structure symétrique du cosmos empédocléen. === Histoires de la philosophie et ouvrages généraux === ==== Ouvrages classiques ==== Hermann '''Ritter''', ''Histoire de la philosophie'', 1re partie, t. I, trad. par C.-J. Tissot, Paris, Ladrange, 1835. L'une des premières histoires de la philosophie à consacrer une étude détaillée à Empédocle. Eduard '''Zeller''', ''Die Philosophie der Griechen in ihrer geschichtlichen Entwicklung'', 1re partie, 2e section, 1re éd. 1855, 6e éd. complétée par Wilhelm Nestlé, Leipzig, 1920. Traduction française par E. Boutroux : ''La Philosophie des Grecs considérée dans son développement historique'', t. II, Paris, Hachette, 1882. Synthèse classique et toujours utile sur Empédocle. Theodor '''Gomperz''', ''Griechische Denker. Eine Geschichte der antiken Philosophie'', vol. I, 1re éd. 1895, 3e éd. Leipzig, 1911. Traduction française par Auguste Reymond : ''Les Penseurs de la Grèce. Histoire de la philosophie antique'', t. I, Lausanne-Paris, Payot, 1904. Empédocle y est présenté comme un précurseur de la chimie moderne. John '''Burnet''', ''Early Greek Philosophy'', 1re éd. 1892, 4e éd. Londres, A. & C. Black, 1930. Traduction française par Auguste Reymond : ''L'Aurore de la philosophie grecque'', Paris, Payot, 1919. Ouvrage fondamental sur la philosophie présocratique.<ref>webef> ==== Synthèses récentes ==== G. S. '''Kirk''' et J. E. '''Raven''', ''The Presocratic Philosophers. A Critical History with a Selection of Texts'', Cambridge, Cambridge University Press, 1957. Réédition révisée avec Malcolm '''Schofield''' : ''The Presocratic Philosophers'', 2e éd. 1983. Ouvrage de référence en langue anglaise sur les présocratiques. W. K. C. '''Guthrie''', ''A History of Greek Philosophy'', vol. II : ''The Presocratic Tradition from Parmenides to Democritus'', Cambridge, Cambridge University Press, 1965. Étude approfondie d'Empédocle dans son contexte historique. Patricia '''Curd''' et Daniel W. '''Graham''' dir., ''The Oxford Handbook of Presocratic Philosophy'', Oxford, Oxford University Press, 2008. Recueil d'articles par les meilleurs spécialistes, avec plusieurs contributions sur Empédocle. === Études thématiques === ==== Cosmologie et physique ==== Denis '''O'Brien''', ''Empedocles' Cosmic Cycle. A Reconstruction from the Fragments and Secondary Sources'', Cambridge, Cambridge University Press, Cambridge Classical Studies, 1969, 470 p. Reconstruction du cycle cosmique à partir des fragments et des témoignages. Friedrich '''Solmsen''', « Love and Strife in Empedocles' Cosmology », ''Phronesis'', 10, 1965, p. 109-148. Oliver '''Primavesi''', « Empedocles On the Ultimate Symmetry of the World », dans Patricia '''Curd''' et Daniel W. '''Graham''' dir., ''The Oxford Handbook of Presocratic Philosophy'', Oxford, 2008, p. 250-277. ==== Biologie et zoogonie ==== M. R. '''Sulzberger''', « La Physique d'Empédocle », dans ''Mélanges Bidez'', Bruxelles, 1934. W. K. C. '''Guthrie''', ''In the Beginning Some Greek Views on the Origins of Life and the Early State of Man'', Ithaca, Cornell University Press, 1957. Walter '''Spoerri''', ''Späthellenistische Berichte über Welt, Kultur und Götter. Untersuchungen zu Diodor von Sizilien'', Bâle, F. Reinhardt, 1959. Sur la réception d'Empédocle dans les théories de l'origine de la vie. ==== Théorie de la connaissance ==== John I. '''Beare''', ''Greek Theories of Elementary Cognition from Alcmaeon to Aristotle'', Oxford, Clarendon Press, 1906. G. M. '''Stratton''', ''Theophrastus and the Greek Physiological Psychology before Aristotle'', Londres-New York, George Allen & Unwin - The Macmillan Company, 1917. ==== Religion, pythagorisme et orphisme ==== Joseph '''Bidez''', ''La Biographie d'Empédocle'', Gand, Université de Gand, 1894. Étude fondamentale sur la vie d'Empédocle et les traditions biographiques. Erwin '''Rohde''', ''Psyche. Seelencult und Unsterblichkeitsglaube der Griechen'', 1re éd. Fribourg-en-Brisgau, 1894, 2e éd. révisée en 2 vol. 1898. Traduction française par Auguste Reymond : ''Psyché. Le culte de l'âme chez les Grecs et leur croyance à l'immortalité'', Paris, Payot, 1928. Réimpressions 1952, 1999. Ouvrage classique sur la religion grecque, avec d'importants développements sur Empédocle. Marcel '''Detienne''', ''La Notion de daïmôn dans le pythagorisme ancien. De la pensée religieuse à la pensée philosophique'', Paris, Les Belles Lettres, 1963. Étude sur la démonologie pythagoricienne et empédocléenne. Walter '''Burkert''', ''Weisheit und Wissenschaft. Studien zu Pythagoras, Philolaos und Platon'', Nuremberg, Hans Carl, 1962. Traduction anglaise révisée par Edwin L. Minar Jr. : ''Lore and Science in Ancient Pythagoreanism'', Cambridge Mass., Harvard University Press, 1972. Étude fondamentale sur le pythagorisme et ses rapports avec Empédocle. Christoph '''Riedweg''', « Orphisches bei Empedokles », ''Antike und Abendland'', 41, 1995, p. 34-59. Sur les éléments orphiques chez Empédocle. André '''Laks''' et Glenn W. '''Most''' dir., ''Studies on the Derveni Papyrus'', Oxford, Clarendon Press, 1997. Recueil d'études sur le papyrus de Derveni, avec des implications pour la compréhension d'Empédocle. ==== Sacrifice et végétarisme ==== Johannes '''Haussleiter''', ''Der Vegetarismus in der Antike'', Religionsgeschichtliche Versuche und Vorarbeiten 24, Berlin, Töpelmann, 1935. Marcel '''Detienne''', « La cuisine de Pythagore », ''Archives de Sociologie des Religions'', 29, 1970, p. 141-162. Dirk '''Obbink''', « The Origin of Greek Sacrifice Theophrastus on Religion and Cultural History », dans William W. '''Fortenbaugh''' et Robert W. '''Sharples''' dir., ''Theophrastean Studies'', New Brunswick, Transaction Publishers, Rutgers Studies in Classical Humanities 3, 1988, p. 272-295. Jean-François '''Balaud''', « Parenté du vivant et végétarisme radical », dans Barbara '''Cassin''' et Jean-Louis '''Labarrière''' dir., ''L'Animal dans l'Antiquité'', Paris, Vrin, 1997, p. 31-53. John '''Rundin''', « The Vegetarianism of Empedocles in Its Historical Context », ''The Ancient World'', 29, 1998, p. 19-36. ==== Métempsychose ==== E. R. '''Dodds''', ''The Greeks and the Irrational'', Berkeley, University of California Press, 1951. Traduction française par Michel Gibson : ''Les Grecs et l'irrationnel'', Paris, Aubier, 1965. Avec un chapitre important sur Empédocle et la métempsychose. R. S. '''Bluck''', « Transmigration and Recollection before Plato », dans ''Plato's Meno'', Cambridge, Cambridge University Press, 1961. ==== Poétique et rhétorique ==== B. A. van '''Groningen''', « Empédocle, poète », ''Mnemosyne'', 4e série, 24, 1971, p. 169-188. Antonio '''Traglia''', ''Studi sulla lingua di Empedocle'', Bari, Adriatica, 1952. Étude linguistique et stylistique. === Réception et influence === ==== Antiquité ==== A. O. '''Lovejoy''' et George '''Boas''', ''Primitivism and Related Ideas in Antiquity'', Baltimore, Johns Hopkins Press, 1935. Réédition New York, Octagon Books, 1965. Sur l'idée de l'âge d'or et sa réception. Thomas '''Cole''', ''Democritus and the Sources of Greek Anthropology'', Cleveland, Western Reserve University, 1967. Sur l'influence d'Empédocle dans l'anthropologie grecque. J. P. '''Hershbell''', « Plutarch as a Source for Empedocles Re-examined », ''American Journal of Philology'', 92, 1971, p. 156-184. J. P. '''Hershbell''', « Hippolytus' ''Elenchos'' as a Source for Empedocles Re-examined », ''Phronesis'', 18, 1973, p. 97-114 et 187-203. Victor '''Goldschmidt''', ''La Doctrine d'Épicure et le droit'', Paris, Vrin, 1977. Avec une discussion de l'influence d'Empédocle sur Épicure. Jaap '''Mansfeld''', « Bad World and Demiurge A Gnostic Motif from Parmenides and Empedocles to Lucretius and Philo », 1981, réédition dans ''Studies in Later Greek Philosophy and Gnosticism'', Londres, Variorum Reprints, 1989, p. 261-314. ==== Réception moderne ==== Walther '''Kranz''', « Lucrez und Empedokles », ''Philologus'', 96, 1943, p. 68-107. Friedrich '''Nietzsche''', ''La Naissance de la philosophie à l'époque de la tragédie grecque'', traduction Geneviève Bianquis, Paris, Gallimard, 1949. Traduction du texte rédigé en 1870-1873 où Nietzsche consacre d'importantes pages à Empédocle. Clémence '''Ramnoux''', « Les Fragments d'un Empédocle de Nietzsche », ''Revue de Métaphysique et de Morale'', 70, 1965, n° 2. Friedrich '''Hölderlin''', ''La Mort d'Empédocle'', traduction par André Babelon, Paris, Grasset, 1929 traduction par Robert Rovini, ''Les Cahiers du Sud'', n° 378-379. Trois versions d'un drame inachevé 1797-1799 consacré au philosophe. === Instruments de travail === ==== Doxographie ==== Hermann '''Diels''', ''Doxographi Graeci'', Berlin, G. Reimer, 1879. Reproduction photomécanique Berlin, De Gruyter, 1958. Édition fondamentale des doxographes grecs, sources essentielles pour la connaissance d'Empédocle. ==== Sources anciennes en traduction ==== Diogène '''Laërce''', ''Vies et doctrines des philosophes illustres'', traduction, introduction et notes par Jean-François Balaudé et alii sous la direction de Marie-Odile Goulet-Cazé, Paris, Le Livre de Poche, collection « La Pochothèque », 1999. Livre VIII, 51-77 vie d'Empédocle. Théon de '''Smyrne''', ''Exposition des connaissances mathématiques utiles pour la lecture de Platon'', traduction J. Dupuis, Paris, Hachette, 1892. Nombreuses références à Empédocle et au pythagorisme. ==== Bibliographies ==== Friedrich '''Ueberweg''', ''Grundriss der Geschichte der Philosophie'', vol. I, nouvelle édition, Bâle-Stuttgart, Schwabe, 1954. Avec bibliographie détaillée sur Empédocle. Les éditions successives de Diels-Kranz comprennent des bibliographies mises à jour. Les ouvrages récents d'Inwood 2001, de Wright 1995, de Bollack 2003, de Rashed 2018 et l'édition Laks-Most 2016 fournissent des bibliographies étendues et actualisées. === Contexte sicilien et biographie === Thucydide, ''Histoire de la guerre du Péloponnèse'', livres VI-VII guerre de Sicile. Diodore de Sicile, ''Bibliothèque historique'', livres XI-XIII histoire de la Sicile au Ve siècle. {{AutoCat}} [[Catégorie:Philosophe]] {{DEFAULTSORT:Empédocle}} iwp02jzy5y7m4wtg2ej914xkd29mepu Philosophie/Aporie 0 83206 764923 754875 2026-04-25T06:23:36Z PandaMystique 119061 Redirection supprimée vers [[Dictionnaire de philosophie/Aporie]] 764923 wikitext text/x-wiki {{delete}} 35r2j9t4ectnt1cmb7mlgcqvwz6h5k6 765009 764923 2026-04-25T08:54:37Z Xhungab 23827 765009 wikitext text/x-wiki {{Suppression Immédiate|A la demande de l'auteur}} {{delete}} gzh4iqe6d3o0dy8wxd0c8yzhmf57s4r Les cartes graphiques/Le rendu d'une scène 3D : l'API graphique 0 83408 764886 763957 2026-04-24T17:56:50Z Mewtow 31375 /* La compilation des shaders */ 764886 wikitext text/x-wiki De nos jours, le développement de jeux vidéo, ou tout simplement de tout rendu 3D, utilise des API 3D. Les API 3D les plus connues sont DirectX, OpenGL, et Vulkan. L'enjeu des API est de ne pas avoir à recoder un moteur de jeu différent pour chaque carte graphique ou ordinateur existant. Elles fournissent des fonctions qui effectuent des calculs bien spécifiques de rendu 3D, mais pas que. L'application de rendu 3D utilise des fonctionnalités de ces API 3D, qui elles-mêmes utilisent les autres intermédiaires, les autres maillons de la chaîne. Typiquement, ces API communiquent avec le pilote de la carte graphique et le système d'exploitation. ==La description des API 3D les plus communes== Dans ce chapitre, nous n'allons pas faire de cours du DirextX, ulkan ou toute API précise. Toutes le API graphiques fonctionnent globalement sur les mêmes principes, que nous allons expliquer dans les grandes lignes. Les explications seront conçues pour que les personnes sans bagage de la programmation graphique puissent comprendre, seuls desbases très mineures en programmation seront nécessaires dans le pire des cas. ===Les ''draw calls''=== Une API 3D fournit un certain nombre de fonctions qu'un programmeur peut exécuter à loisir. La principale est la fonction qui dessine quelque chose dans le ''framebuffer''. Elle est appelée ''draw()'' dans la terminologie DirectX, gldraw pour OpenGL, vkcmddraw pour Vulkan. Une exécution de cette fonction est appelée un '''''draw call'''''. Un ''draw call''envoie des informations à la carte graphique, afin qu'elle affiche ce qui est demandé. Instinctivement, on pourrait croire que la fonction ''draw'' calcule tout l'image à afficher d'un seul coup, mais ce n'est pas le cas. En réalité, le moteur graphique d'un jeu effectue le rendu objet par objet, avec un ''draw call'' par objet. Plus il y a d'objets, plus le processeur exécutera de ''draw calls''. Diverses optimisations permettent d'économiser des ''draw calls'', mais cela ne change pas le fait que dessiner l'image finale demande plusieurs ''draw calls'', entre une centaine et plusieurs centaines de milliers suivant la complexité de la scène à rendre. Le fait de rendre une image objet par objet permet de nombreuses optimisations. Par exemple, il peut utiliser une première passe pour dessiner les objets opaques, puis une seconde pour les objets transparents. Tous les moteurs 3D font ainsi, car gérer la transparence est toujours compliqué, surtout avec un tampon de profondeur. Un autre avantage est que le moteur de jeu peut faciliter le travail de l'élimination des surfaces cachées. Par exemple, le moteur de jeu peut trier les objets selon leur profondeur, afin de les rendre du plus proche au plus lointain. Pour les objets opaques, cela permet d'éliminer les surfaces cachées à la perfection : aucun triangle/pixel caché par un autre ne sera rendu. Pour la transparence, cela permet un rendu idéal. Mais trier les objets selon leur profondeur prend alors du temps CPU, qu'il faut comparer à ce qui est gagné sur le GPU. Avant les années 2010 environ, le processeur faisait une bonne partie de l'élimination des surfaces cachées, dans le sens où il déterminait quels objets étaient cachés par d'autres. Il n'émettait pas de ''draw calls'' pour les objets complétement cachés par un autre objet opaque. Par contre, il travaillait au niveau des objets, alors que le GPU travaillait au niveau des triangles. Les objets partiellement cachés étaient gérés par le GPU, avec une élimination des surface cachées triangle par triangle. De nos jours, l'élimination des surfaces cachées est réalisée sur le GPU, dans sa totalité. L'idée est d'utiliser un ''shader'' séparé, un ''compute shader'', qui s'exécute avant toute autre opération de rendu. La scène 3D et tous les modèles sont dans la mémoire vidéo, et non en mémoire RAM. Le ''compute shader'' lit l'ensemble de la géométrie et élimine les surface cachées. On parle de '''''GPU driven rendering''''' pour désigner cette élimination des surfaces cachées réalisée sur le GPU (il faudrait aussi rajouter le choix du ''Level Of Detail'', mais passons. ===Les ''render target''=== Plus haut, j'ai dit qu'un ''draw call'' dessine une image dans le ''framebuffer''. Et il s'agit là du cas le plus important, mais certaines techniques de rendu demandent de dessiner des images intermédiaires, qui sont utilisées pour calculer l'image finale. Les images intermédiaires doivent alors être enregistrées ailleurs, par exemple dans une texture. L'idée générale d'enregistrer des images intermédiaires dans une texture, qui sont alors lues par un ''pixel shader'' pour des calculs d'éclairage, des filtres de post-traitement, ou autre. Autoriser d'enregistrer l'image finale dans une texture s'appelle du '''''render-to-texture'''''. Les techniques d'éclairage basées sur des ''shadowmap'' sont dans ce cas. Elles demandent de rendre la scène 3D deux fois : une fois du point de vue de la source de lumière, puis une seconde fois pour obtenir l'image finale. L'idée est que les pixels invisibles depuis la source de lumière, mais visibles depuis la caméra, sont dans l'ombre. La scène rendue depuis la caméra doit donc être mémorisée quelque part, de préférence dans une texture appelée une ''shadowmap''. Une autre utilisation est l'application de filtres de post-traitement, comme du bloom, de la profondeur de champ, etc. L'idée est de mémoriser l'image initiale, sans post-traitement, dans une texture. Puis, un ''shader'' lit cette texture, applique un filtre dessus, et mémorise le résultat dans une autre texture ou dans le ''framebuffer'' s'il calcule l'image finale. Pour cela, les API 3D modernes permettent de préciser où enregistrer l'image finale : dans le ''framebuffer'', dans une texture, dans une simple portion de mémoire, etc. Les endroits où l'image finale peut être rendue s'appellent des '''''render target'''''. Les API modernes supportent de nombreux ''render target'', avec au minimum un ''framebuffer''. Initialement, les API anciennes ne supportaient que le ''framebuffer''. Puis le ''render-to-texture'' est apparu, puis d'autres formes de ''render target''. ===Les attributs de sommets, variables uniformes et unités de texture=== Lors d'un ''draw call'', certains paramètres vont rester constants, alors que d'autres vont varier d'un sommet à l'autre. Les paramètres qui varient d'un sommet à l'autre sont des '''attributs de sommet'''. Par exemple, prenons un sommet : sa position, sa couleur et ses coordonnées de texture sont des attributs du sommet. Les paramètres constants sont appelées des '''variables uniformes''', ou encore des ''uniforms''. Elles restent les mêmes pour un objet, mais varient d'un objet à l'autre. Un exemple est les matrices utilisées par les étapes de transformation et de projection. : Il y a la même chose avec les pixels, avec des attributs de pixels et des ''pixel uniforms'', la différence étant que les attributs de pixels sont calculés par la rastérisation. Les deux sont stockés différemment : les variables uniformes sont simplement intégrées dans les shaders, alors que les attributs sont placés dans le tampon de sommets. Il faut noter que les processeurs de shaders avaient autrefois des registres séparés pour les deux, et c'est toujours un peu le cas à l'heure actuelle. ===Les textures et unités de texture=== Les API OpenGL et DirectX gèrent les textures d'une manière assez différente de ce qui se fait en matériel. Les API partent du principe que le GPU a plusieurs unités de textures, qui sont numérotées de 0 à N. Les textures doivent être associées à une unité de texture avant du ''draw call''. En clair, on doit dire que telle texture doit aller dans l'unité de texture numéro 0, telle autre texture dans l'unité de texture numéro 1, etc. Les anciennes API ne géraient qu'une seule texture, mais l'arrivée du multitexturing a imposé d'ajouter des unités de texture en plus. Une texture est placée en mémoire vidéo et on connait son adresse, sa position en mémoire. En théorie, l'unité de texture a juste besoin de connaitre l'adresse de la texture, ainsi que sa résolution, sa taille en mémoire VRAM, et quelques autres détails. L'ensemble de ces informations est appelé le ''texture state''. L'unité de texture mémorise le ''texture state'' dans des registres internes, et tout accès à une texture utilise le ''texture state'' pour lire le bon texel. En associant une texture a une unité de texture, on copie ces informations dans les registres de l'unité de texture. En changeant de texture, on modifie le contenu de ces registres internes. Les anciennes cartes graphiques fonctionnaient sur ce principe, elles avaient bien des unités de texture avec des registres pour mémoriser un ''texture state''. Le problème est que les GPU ne fonctionnent pas exactement sur ce principe. L'unité de texture des GPU modernes est intégrée dans les processeurs de shaders, ce qui fait qu'attribuer une texture à une unité de texture n'est pas l'idéal. De plus, les unités de textures actuelles sont ''bindless'' : elles n'utilisent pas de registres internes, elles ne mémorisent pas de ''texture state''. A la place, le ''texture state'' est mémorisé dans les registres du processeur de shader. A chaque accès, le ''texture state'' est envoyé à l'unité de texture. Il faut dire que les unités mémoire des processeurs fonctionnent sur ce principe : on leur envoie une adresse, un indice et d'autres informations ; et elles effectuent l'accès mémoire. Les API actuelles tendent de plus en plus vers les '''textures ''bindless''''', qui ne doivent pas être associées à une unité de texture. A la place, leur adresse est simplement fournie au ''pixel shader'' via des ''uniforms'', ou un autre mécanisme. L'adresse se retrouve simplement dans les registres du ''pixel shader'', ce qui fait qu'on n'est plus limité par le nombre d'unités de texture. ===Les ''render states'' et les ''Pipeline State Object''=== Pour rendre un objet avec un ''draw call'', il faut préciser toutes informations nécessaires pour son rendu : la géométrie de l'objet représentée par une liste de triangles, les textures de l'objet, les ''shaders'' à exécuter (vertex ou pixel shaders), etc. Pour simplifier, nous allons regrouper ces informations en deux : un ''mesh'' qui représente la géométrie de l'objet, et le reste. La géométrie de l'objet est juste une liste de triangles. Le reste est regroupé dans un '''''render state''''', qui liste les textures, les shaders, quel ''render starget'' utiliser, et surtout : diverses options de configuration. Il n'y a qu'un seul ''render state'' actif, qui est mémorisé dans une portion de la RAM qui est toujours fixe. Pour les programmeurs, le ''render state'' est dans une variable globale, qui est lue directement par la fonction ''draw''. Si on veut rendre un objet, on doit mettre à jour le ''render state'' avant de lancer un ''draw call''. Un moteur graphique fait donc le travail suivant : * Pour chaque image : ** Mettre à jour la position de la caméra et autres ** Pour chaque objet, scène 3D inclue : *** 1 - Mettre à jour le ''render state'' *** 2 - Exécuter le ''draw call'' L'API 3D fournit des fonctions pour modifier le ''render state'', en plus de la fonction ''draw''. A ce niveau, les anciennes API fonctionne différemment des API plus récentes comme DirectX 12, Vulkan et consort. Les anciennes API fournissaient plusieurs fonctions très spécialisées : certaines pour modifier les textures, d'autres pour changer les shaders, et un paquet d’autres pour modifier telle ou telle option de configuration. Par exemple, il y a probablement une fonction pour changer l'antialiasing. Les API modernes, comme DirectX 12 et Vulkan, permettent de mettre à jour le ''render state'' assez simplement. L'idée est de pré-calculer un ''render state'', qui est alors appelé un ''Pipeline State Object'' (PSO). Mettre à jour le ''render state'' demande alors juste de copier un PSO dans le render state, au lieu d'exécuter une dizaine ou centaine de fonctions pour obtenir le ''render state'' voulu. ===Les commandes graphiques=== L'API 3D traduit chaque ''draw call'' en une ou plusieurs '''commandes graphiques''', qui sont envoyées au ''driver'' du GPU. Les commandes en question sont assez diverses, mais elles sont spécifiques à chaque API graphique. Intuitivement, un ''draw call'' correspond à une commande graphique. Mais il peut y avoir d'autres types de commandes. Par exemple, copier une texture dans la mémoire vidéo demande d'exécuter une commande decopie, idem pour ce qui est de copier un objet/''mesh''. Pour comprendre en quoi un ''draw call'' peut se traduire en plusieurs commandes, prenons l'exemple suivant. On souhaite rendre un objet avec une texture bien précise, mais celle-ci n'a pas encore été chargée en mémoire vidéo. Dans ce cas, le ''draw call'' utilisera une commande pour copier la texture en mémoire vidéo, puis une seconde commande pour rendre l'objet dans le ''framebuffer''. Par contre, si la texture est déjà en mémoire vidéo, le ''draw call'' se traduira en une unique commande de rendu 3D. Il en est de même si le ''mesh'' n'est pas encore en mémoire vidéo : il faut exécuter une commande pour copier le ''mesh'' dans la mémoire vidéo. Il faut préciser que c'est la même chose si le ''draw call'' exécute un shader pour la première fois . Le ''driver'' doit compiler le shader pour la première fois, puis utiliser une commande pour mettre le résultat en mémoire vidéo, puis enfin effectuer le rendu. Cela explique le ''shader stuttering'' présent dans certains jeux récents, à savoir le petit ralentissement très énervant qui survient quand un ''shader'' est compilé en plein milieu d'une partie de jeu. Il est possible de limiter ce problème en compilant des shaders à l'avance, histoire de préparer le terrain pour les futurs ''draw calls'', dans une certaine mesure, mais cela demande du travail, qui n'est possible que le nombre de shaders à compiler reste faible. Les commandes graphiques sont envoyées au ''driver'' de la carte graphique. Il transforme alors ces commandes graphiques en '''commandes matérielles''', compréhensibles par le matériel, en quelque chose que le GPU peut exécuter. Le format des commandes matérielles est spécifique à chaque marquer de GPU, les GPU NVIDIA, Intel et AMD n'utilisent pas le même format de commande. Il est même possible que chaque GPU ait son propre format pour les commandes matérielles. Aussi, nous allons nous arrêter là pour le moment et laissons cela au chapitre sur le processeur de commande. ==Les optimisations liées aux ''draw calls''== Il faut noter qu'un ''draw call'' demande d'utiliser un peu de puissance CPU : il faut traduire le ''draw call'' en commandes, les envoyer au ''driver'', qui fait du travail dessus, avant de les envoyer au GPU. Dans les premières versions d'OpenGL et DirectX, chaque ''draw call'' effectuait une commutation de contexte pour passer en espace noyau, afin de communiquer avec le ''driver''. Mais cette contrainte a depuis été relâchée, bien qu'elle marche dans les grandes lignes. Faire plein de ''draw calls'' aura donc un cout en CPU conséquent. ===Les optimisations du ''render state''=== Les changements de ''render state'' sont souvent assez gourmands. Pas forcément pour le GPU, mais il y a toujours un certain cout soit au niveau de l'API, soit pour le pilote du GPU. Le cout est donc partagé entre CPU et GPU, avec un cout certain pour le CPU, très variable pour le GPU. Les changements d'état en question ne sont pas égaux non plus, certains sont plus couteux que d'autres. Pour donner quelques chiffres, je vais me baser les données obtenues par Cass Everitt et John McDonald en 2014, pour un ''driver'' OpenGL. Ils ont été présentés dans la conférence ''Beyond Porting: How Modern OpenGL Can Radically Reduce Driver Overhead'', aux ''Steam Dev Days 2014'', trouvable sur Youtube. Les données sont anciennes, les choses ont certainement évoluées. Les couts vont, du plus grand au plus petit : * changer de ''render target'' ; * changer de shader ; * reconfigurer les ROPs ; * changer de texture ; * changer la géométrie ou les variables ''uniforms''. Une première optimisation vise à réduire les changements de ''render state''. Elle rend les objets avec le même ''render state'' ensemble, les uns à la suite des autres. Sans cette optimisation, le moteur graphique met à jour le ''render state'' à chaque fois qu'il rend un objet. Avec cette optimisation, il met à jour le ''render state'' plus rarement. Par contre, le moteur graphique dépense du temps et de la puissance de calcul pour faire le tri. Il y a donc un compromis pas évident, qui ne vaudrait pas souvent le coup. Cependant, d'autres optimisations permettent d'en profiter au mieux. Une optimisation de ce type est l'usage d''''atlas de textures'''. Un atlas de texture regroupe plusieurs textures dans une super-texture. La technique évite des changements d'état dans l'API 3D. Pas besoin de changer de texture à chaque objet, on peut partager une super-texture capable de texturer plusieurs objets différents. La création d'un atlas de texture n'est pas de tout repos, il ne suffit pas de regrouper plusieurs textures. Le filtrage de texture ne doit pas mélanger des texels provenant de deux textures différents, même si elles sont dans la même super-texture. Et il y a d'autres problèmes liés aux techniques dites de ''mip-mapping'', ainsi qu'aux modes d'adressage de texture. Pour éviter ces problèmes, les API modernes ont ajouté une fonctionnalité : les '''''texture arrays'''''. Le terme ''array'' est assez clair : il s'agit de tableaux, qui regroupent plusieurs textures. Précisons ce qu'on veut dire pas regrouper. Les textures ne sont pas placées dans une super-texture, elles ne sont pas consécutives en mémoire. Par contre, le ''texture array'' mémorise l'adresse de chaque texture. Pour accéder à une texture, il suffit de fournir son indice, sa place dans le tableau : on récupère l'adresse de la texture, qui est ensuite envoyée à l'unité de texture. Pour ce qui est des ''shaders'', on peut regrouper plusieurs ''shaders'' en un seul. Par exemple, au lieu d'avoir un shader pour les sources de lumière ponctuelles et un autre pour les sources directionnelles, on peut utiliser un shader qui traite les deux. Pour cela, il suffit d'avoir une partie du shader spécialisée pour les sources ponctuelles, une autre pour les sources directionnelles. Le shader a juste à utiliser un branchement pour exécuter le bon morceau de code. Le branchement a juste à tester une variable uniforme pour faire son choix. Poussée à soin paroxysme, le résultat est un ou plusieurs '''''über shaders''''', qui supporte tous les types de sources de lumières et tous les ''materials''. Un problème est que les ''über shaders'' ont une grande taille, ce qui fait qu'ils peuvent déborder du cache d'instruction. Un autre problème des ''über shaders'' est qu'ils tendent à être moins bien optimisés, car il utilise plus de registres. Pour donner un exemple, prenons un shader qui gère à la fois les sources de lumières ponctuelles et directionnelles, avec un morceau de code pour chaque. L'un des deux morceau de code utilisera plus de registres que les autres, et le shader réservera assez de shader pour ce dernier. Ainsi, au lieu d'avoir un shader pour les sources ponctuelles qui utilise 20 registres, et un autre shader pour les sources directionnelles qui en utilise 50, on a un seul shader qui en utilise 50. Le problème est que vu que le shader utilise plus de registres, cela limite le nombre d'instances du shader lancées en simultané, et donc le masquage de la latence. ===Les optimisations des ''draw calls'' : ''batching'' et ''instancing''=== Plus haut, j'ai dit que le rendu se fait objet par objet, ''mesh'' par ''mesh''. Mais il s'agit là d'une simplification. En réalité, tout moteur graphique digne de ce nom incorpore des optimisations qui cassent cette règle. L'idée est d'éviter de faire plein de petits ''draw call'' : le GPU sera alors peu utilisé alors que le CPU fera beaucoup de travail. A l'inverse, faire peu de gros ''draw call'' entrainera une forte occupation du GPU au prix d'un cout CPU mineur. La première optimisation, appelée le '''''batching''''', regroupe plusieurs objets/''meshs'' en un seul ''draw call''. Par contre, cette optimisation ne marche que pour des objets ayant le même ''render state'', à l'exception de la géométrie. Les deux objets rendus ensemble doivent utiliser les mêmes shaders, les mêmes textures, etc. De plus, la fusion de deux objets doit se faire en mémoire RAM et est le fait du CPU, le GPU et la mémoire vidéo ne sont pas concernés. L'optimisation marche bien pour des objets statiques, ce qui permet de faire la fusion une fois pour toute, là où les objets dynamiques demandent de faire la fusion à chaque image. Une seconde optimisation,appelée l''''''instancing''''', marche dans le cas où un objet dynamique est présent en plusieurs exemplaires à l'écran. L'idée est qu'au lieu d'utiliser un ''draw call'' par exemplaire, on utilise un seul ''draw call'' pour tous les exemplaires. L'avantage est que la carte n'a besoin de mémoriser qu'un seul exemplaire en mémoire vidéo, au lieu de mémoriser plusieurs copies du même ''mesh''. Il faut préciser que les différents exemplaires peuvent être placés à des endroits éloignés, être tournés différemment par rapport à la caméra, être dans des états d'animation différents, etc. Pour cela, le ''draw call'' précise, pour chaque exemplaire, comment l'orienter, le tourner et l'animer. Le ''render state'' contient pour cela une '''liste d'instances''' pour mémoriser ces informations pur chaque exemplaire. Le GPU peut consulter cette liste et la copier en mémoire vidéo. Une seule commande permet ainsi de rendre plusieurs exemplaires : le GPU lit la liste d'instance, le ''mesh'' et dessine automatiquement chaque exemplaire voulu de l'objet. Réduire le nombre de ''draw calls'' peut aussi se faire en évitant les objets peu détaillés, qui utilisent peu de polygones. Pour des objets trop peu détaillés, le GPU exécutera le ''draw call'' très vite et devra attendre que le CPU envoie le suivant. Le cout du ''draw call'' dominera le temps de calcul sur le GPU. Du temps de DirectX 9, l'idéal était d'avoir des objets d'au moins une centaine de triangles. De nos jours, les GPU les CPU sont plus puissant,ce qui fait que ce chiffre est à revoir, mais je n'en connais pas la valeur, même approximative. ==Le pipeline graphique== En plus de fournir des fonctions que les programmeurs peuvent utiliser, les API graphiques décrivent comment s'effectue le rendu d'une image. Elles spécifient comment doit être traité la géométrie, comment doit se faire la rastérisation, le filtrage de texture et bien d'autres choses. Pour le dire autrement, elles décrivent le pipeline graphique à utiliser. Pour rappel, le pipeline graphique comprend plusieurs étapes : plusieurs étapes de traitement de la géométrie, une phase de rastérisation, puis plusieurs étapes de traitement des pixels. Une API 3D comme DirectX ou OpenGl décrète quelles sont les étapes à faire, ce qu'elles font, et l'ordre dans lesquelles il faut les exécuter. Il n'existe pas un pipeline graphique unique et chaque API 3D fait à sa sauce, mais la plupart des API modernes ont des pipelines graphiques très similaires. Les seules différences majeures concernent la présence d'étapes facultatives, comme l'étape de tesselation, qui sont absentes des API anciennes. Pour donner un exemple, je vais prendre l'exemple d'OpenGL 1.0, une des premières version d'OpenGL, aujourd'hui totalement obsolète. Le pipeline d'OpenGL 1.0 est illustré ci-dessous. Il implémente le pipeline graphique de base, avec une phase de traitement de la géométrie (''per vertex operations'' et ''primitive assembly''), la rastérisation, et les traitements sur les pixels (''per fragment operations''). On y voit la présence du ''framebuffer'' et de la mémoire dédiée aux textures, les deux étant soit séparées, soit placée dans la même mémoire vidéo. La ''display list'' est une liste de commandes, de ''draw calls'', que la carte graphique doit traiter d'un seul bloc, chaque ''display list'' correspond au rendu d'une image, pour simplifier. Les étapes ''evaluator'' et ''pixel operations'' sont des étapes facultatives, qui ne sont pas dans le pipeline graphique de base, mais qui sont utiles pour implémenter certains effets graphiques. [[File:Pipeline OpenGL.svg|centre|vignette|upright=2|Pipeline d'OpenGL 1.0]] Le pipeline d'OpenGL 1.0 vu plus haut est très simple, comparé aux pipelines des API modernes. Pour comparaison, voici des schémas qui décrivent le pipeline de DirextX 10 et 11. Vous voyez que le nombre d'étapes n'est pas le même, que les étapes elles-mêmes sont légèrement différentes, etc. Toutes les API 3D modernes sont organisées plus ou moins de la même manière, ce qui fait que le pipeline des schémas ci-dessous colle assez bien avec les logiciels 3D anciens et modernes, ainsi qu'avec l'organisation des cartes graphiques (anciennes ou modernes). {| | style="vertical-align:top;" | [[File:D3D Pipeline.svg|vignette|D3D Pipeline]] |[[File:D3D11 Pipeline.svg|vignette|Pipeline de D3D 11]] |} ===L'implémentation peut être logicielle ou matérielle=== Une API graphique est avant tout quelque chose qui aide le programmeur. Il est d'ailleurs possible de les utiliser sans GPU, avec une simple carte d'affichage. Le rendu 3D se fait alors sur le processeur, et la carte d'affichage ne fait que recevoir l'image calculée et l'afficher. Et c'était le cas dans les années 90, avant l'invention des premières cartes accélératrices 3D. Le rôle des API 3D était de fournir des morceaux de code et un pipeline graphique, afin de simplifier le travail des développeurs, pas de déporter des calculs sur une carte accélératrice 3D. D'ailleurs, OpenGl et Direct X sont apparues avant que les premières cartes graphiques grand public soient inventées. Les premiers accélérateurs 3D sont arrivés sur le marché quelques mois après la toute première version de Direct X et Microsoft n'avait pas prévu le coup. OpenGL était lui encore plus ancien et ne servait pas initialement pour les jeux vidéos, mais pour la production d'images de synthèses et dans des applications industrielles (conception assistée par ordinateur, imagerie médicale, autres). OpenGL était l'API plébiscitée à l'époque, car elle était déjà bien implantée dans le domaine industriel, la compatibilité avec les différents OS de l'époque était très bonne, mais aussi car elle était assez simple à programmer. De nos jours, la grosse majorité du rendu 3D se fait sur le GPU. Les ''draw calls'' sont intégralement traités par le GPU, à quelques détails près. Mais les premières cartes accélératrices 3D ne le gérait que partiellement. Concrétement, les premières cartes de 3Dfx déléguaient le traitement de la géométrie au processeur, et ne s'occupaient que des étapes de rastérisation, de placage de texture et les étapes suivantes. Autant prévenir maintenant, nous verrons de nombreuses cartes graphiques de de genre dans le chapitre sur l'historique de l'accélération 3D. ===Les API imposent des contraintes sur le matériel=== Les API graphiques décrivent un pipeline, mais fournissent aussi d'autres contraintes. Par exemple, elles fournissent des régles sur la manière dont doit être faite la rastérisation. Elle disent plus ou moins quel doit être le résultat attendu par le programmeur. Et les GPU doivent respecter ces règles, ils doivent effectuer le rendu de manière à avoir un résultat identique à celui spécifié par l'API. Notez ma formulation quelque peu alambiquée, qui cache un point important : les GPU font comme si ! Je dis faire comme si, car il se peut que le matériel fasse autrement, mais pour un résultat identique. Tant que l'image finale est celle attendue par l'API 3D, le GPU a le droit de prendre des raccourcis, d'éliminer des calculs inutiles, d'utiliser un algorithme de rastérisation différent, etc. Par exemple, il arrive que la carte graphique fasse certaines opérations en avance, comparé au pipeline imposé par l'API, pour des raisons de performance. Typiquement, effectuer du ''culling'' ou les tests de profondeur plus tôt permet d'annuler de nombreux pixels invisibles à l'écran, et donc d'éliminer beaucoup de calculs inutiles. Mais la carte graphique doit cependant corriger le tout de manière à ce que pour le programmeur, tout se passe comme l'API 3D l'ordonne. De manière générale, sans même se limiter à l'ordonnancement des étapes du pipeline graphique, les règles imposées par les API 3D sont des contraintes fortes, qui contraignent les cartes graphiques dans ce qu'elles peuvent faire. De nombreuses optimisations sont rendues impossibles à cause des contraintes des API 3D. ==Le pilote de carte graphique== Le pilote de la carte graphique est un logiciel qui s'occupe de faire l'interface entre les API 3D et la carte graphique. En théorie, le système d'exploitation est censé jouer ce rôle, mais il n'est pas programmé pour être compatible avec tous les périphériques vendus sur le marché. Le pilote d'un périphérique sert justement à ajouter ce qui manque : ils ajoutent au système d'exploitation de quoi reconnaître le périphérique, de quoi l'utiliser au mieux. Avant toute chose, précisons que les systèmes d'exploitation usuels (Windows, Linux, MacOsX et autres) sont fournis avec un pilote de carte graphique générique, compatible avec la plupart des cartes graphiques existantes. Rien de magique derrière cela : toutes les cartes graphiques vendues depuis plusieurs décennies respectent des standards, comme le VGA, le VESA, et d'autres. Et le pilote de base fournit avec le système d'exploitation est justement compatible avec ces standards minimaux. Mais le pilote ne peut pas profiter des fonctionnalités qui sont au-delà de ce standard. L'accélération 3D est presque inexistante avec le pilote de base, qui ne sert qu'à faire du rendu 2D très basique, juste assez pour afficher l’interface de base du système d'exploitation. Par exemple, certaines résolutions ne sont pas disponibles et les performances sont loin d'être excellentes. Si vous avez déjà utilisé un PC sans pilote de carte graphique installé, vous avez certainement remarqué qu'il était particulièrement lent. Le pilote de la carte graphique gère beaucoup de choses. Comme tout pilote de périphérique, il gère la communication entre procersseur et GPU, via des techniques communes comme les interruptions, le ''pooling'' ou le ''DMA''. Plus évident, il s'occupe de la gestion de la mémoire vidéo, à savoir que c'est lui qui place les textures ou les modèles 3D dedans, il place le ''framebuffer'', les ''render target'' et tout ce qui réside en mémoire vidéo. Il s'occupe aussi des fonctionnalités liées à l'affichage : initialiser la carte graphique, fixer la résolution, le taux de rafraichissement, gérer le curseur de souris matériel, etc. Mais surtout, le pilote de périphérique s'occupe de l'exécution des ''draw call'' et des changements de ''render state''. Dans ce qui suit, nous allons nous intéresser aux fonctionnalités spécifiques au rendu 3D. ===Les commandes matérielles, compréhensibles par le GPU=== Pour rappel, les API 3Denvoient des '''commandes graphiques''' au pilote de périphérique. Les commandes graphiques sont standardisées, spécifiques à chaque API, et surtout : indépendantes du matériel. Le matériel ne comprend pas ces commandes graphiques ! A la place, le GPU comprend des '''commandes matérielles''', spécifiques à chaque marque de GPU, si ce n'est à chaque GPU. Lors du passage à une nouvelle génération de GPU, des commandes matérielles peuvent apparaître, d'autres disparaître, d'autre voient leur fonctionnement légèrement altéré, etc. Le pilote de la carte graphique doit convertir les commandes graphiques de l'API 3D, en commandes matérielles que le GPU peut comprendre. : La traduction des commandes se fait dans le pilote en espace utilisateur, alors que leur envoi au GPU est le fait du pilote en espace noyau. L'envoi des commandes à la carte graphique ne se fait pas directement. La carte graphique n'est pas toujours libre pour accepter une nouvelle commande, soit parce qu'elle est occupée par une commande précédente, soit parce qu'elle fait autre chose. Il faut alors faire patienter les données dans une '''file de commandes''', où les commandes matérielles attendent leur tour, dans l'ordre d'arrivée. Elle est placée soit dans une portion de la mémoire vidéo, soit est dans la mémoire RAM. Si la file de commandes est plein, le driver n'accepte plus de demandes en provenance des applications. Une file de commandes pleine est généralement mauvais signe : cela signifie que la carte graphique est trop lente pour traiter les demandes qui lui sont faites. Par contre, il arrive que la file de commandes soit vide : dans ce cas, c'est simplement que la carte graphique est trop rapide comparé au processeur, qui n'arrive alors pas à donner assez de commandes à la carte graphique pour l'occuper suffisamment. ===La compilation des ''shaders''=== Le pilote de carte graphique traduit les ''shaders'' en code machine que le GPU peut exécuter. En soi, cette étape est assez complexe, et ressemble beaucoup à la compilation d'un programme informatique normal. Les ''shaders'' sont écrits dans un langage de programmation de haut niveau, comme le HLSL ou le GLSL, avant d'être pré-compilés vers un langage dit intermédiaire. Le langage intermédiaire, comme son nom l'indique, sert d'intermédiaire entre le code source écrit en HLSL/GLSL et le code machine exécuté par la carte graphique. Il ressemble à un langage assembleur, mais reste malgré tout assez générique pour ne pas être un véritable code machine. Par exemple, il y a peu de limitations quant au nombre de processeurs ou de registres. En clair, il y a deux passes de compilation : une passe de traduction du code source en langage intermédiaire, puis une passe de compilation du code intermédiaire vers le code machine. Notons que la première passe est réalisée par le programmeur des ''shaders'', alors que la seconde est le fait du pilote du GPU. L'avantage est que la compilation prend moins de temps, comparé à compiler directement du code HLSL/GLSL. Le gros du travail à été fait lors de la première passe de compilation et le pilote graphique ne fait que finir le travail. Autant dire que cela économise plus le processeur que si on devait compiler complètement les ''shaders'' à chaque exécution. Fait amusant, il faut savoir que le pilote peut parfois remplacer les ''shaders'' d'un jeu vidéo à la volée. Les pilotes récents embarquent en effet des ''shaders'' alternatifs pour les jeux les plus vendus et/ou les plus populaires. Lorsque vous lancez un de ces jeux vidéo et que le ''shader'' originel s'exécute, le pilote le détecte automatiquement et le remplace par la version améliorée, fournie par le pilote. Évidemment, le ''shader'' alternatif du pilote est optimisé pour le matériel adéquat. Cela permet de gagner en performance, voire en qualité d'image, sans pour autant que les concepteurs du jeu n'aient quoique ce soit à faire. Enfin, certains ''shaders'' sont fournis par le pilote pour d'autres raisons. Les anciennes cartes graphiques avaient des circuits de T&L pour traiter la géométrie, mais elles ont disparues sur les machines récentes. Par souci de compatibilité, les circuits de T&L doivent être émulés sur les GPU récents. Sans cette émulation, les vieux jeux vidéo conçus pour exploiter le T&L et d'autres technologies du genre ne fonctionneraient plus du tout. Émuler les circuits fixes disparus sur les cartes récentes est justement le fait de ''shaders'' fournit par le pilote de carte graphique. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=La mémoire unifiée et la mémoire vidéo dédiée | prevText=La mémoire unifiée et la mémoire vidéo dédiée | next=Le processeur de commandes | nextText=Le processeur de commandes }}{{autocat}} </noinclude> 0wwcfdkfdihggm7dn4m96angox4thuo Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Sommaire 0 83422 764958 758374 2026-04-25T07:43:31Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Sommaire]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Sommaire]] 758374 wikitext text/x-wiki * [[Philosophie/Nietzsche/Crépuscule des idoles/Avant-propos|Avant-propos]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Maximes et Traits|Maximes et Traits]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Le Problème de Socrate|Le Problème de Socrate]] * [[Philosophie/Nietzsche/Crépuscule des idoles/La « raison » dans la philosophie|La « raison » dans la philosophie]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable|Comment, pour finir, le « monde vrai » devint fable]] * [[Philosophie/Nietzsche/Crépuscule des idoles/La Morale en tant que manifestation contre nature|La Morale en tant que manifestation contre nature]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Les quatre grandes erreurs|Les quatre grandes erreurs]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »|Ceux qui veulent rendre l’humanité « meilleure »]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que les Allemands sont en train de perdre|Ce que les Allemands sont en train de perdre]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Flâneries inactuelles|Flâneries inactuelles]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que je dois aux anciens|Ce que je dois aux anciens]] * [[Philosophie/Nietzsche/Crépuscule des idoles/Le marteau parle|Le marteau parle]] {{AutoCat}} n19lrx9pxrjvbbd3y23xl37hfno3ohl Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La Morale en tant que manifestation contre nature 0 83423 764948 758369 2026-04-25T07:42:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/La Morale en tant que manifestation contre nature]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La Morale en tant que manifestation contre nature]] 758369 wikitext text/x-wiki {{Crépuscule des idoles}} === Introduction : contexte et enjeux === Le chapitre « Moral als Widernatur » du ''Crépuscule des idoles'' constitue l'une des attaques les plus vigoureuses de Nietzsche contre la morale chrétienne. Composé de six aphorismes développant une critique physiologique et psychologique, ce chapitre incarne le projet central des derniers écrits de Nietzsche : la transmutation de toutes les valeurs (''Umwerthung aller Werthe''). Contrairement à une critique purement logique ou morale, Nietzsche y déploie une méthode généalogique originale. Il ne demande pas si la morale chrétienne est vraie ou fausse, mais de quel type de vie elle est l'expression. Cette interrogation physiologique transforme complètement le débat : la morale ne vaut que si elle affirme et amplifie la vie ; elle s'annihile si elle la nie ou l'appauvrit. === Section 1. Passions : entre destruction et spiritualisation === ==== Le dilemme de la passion ==== Le premier aphorisme pose une distinction fondamentale entre deux rapports aux passions. Nietzsche reconnaît que « toutes les passions ont un temps où elles ne sont que néfastes, où elles avilissent leurs victimes avec la lourdeur de la bêtise ». Mais il existe « une époque tardive, beaucoup plus tardive où elles se marient à l'esprit, où elles se "spiritualisent" ». Cette reconnaissance est décisive : la passion n'est pas intrinsèquement mauvaise ; elle possède une double temporalité. À l'état brut, elle peut nuire. Transformée, affinée, elle devient puissance créatrice. Face à cette dualité, deux stratégies s'opposent. La première, que Nietzsche situe dans le moralisme ancien, consiste à vouloir anéantir la passion elle-même. Cette stratégie trouve son formulation emblématique dans le ''il faut tuer les passions''. Nietzsche en attribue la généalogie au XVII{{e}} siècle, époque où les moralistes cherchaient à éradiquer les sources de désordre par la suppression pure et simple. Le Sermon sur la montagne en fournit l'illustration la plus célèbre : ''Si ton œil est pour toi une occasion de chute, arrache-le''. Nietzsche remarque avec ironie que « heureusement qu'aucun chrétien n'agit selon ce précepte ». La prescription devient absurde dans son application littérale, révélant l'absurdité du principe sous-jacent. ==== L'image du dentiste ==== Nietzsche cristallise sa critique par une métaphore médicale particulièrement éloquente : « Nous n'admirons plus les dentistes qui ''arrachent'' les dents pour qu'elles ne fassent plus mal ». Cette image dévoile toute l'irrationalité d'une thérapeutique qui supprime l'organe au lieu de le soigner. Détruire les passions et les désirs « seulement à cause de leur bêtise, et pour prévenir les suites désagréables de leur bêtise » nous apparaît désormais comme « une forme aiguë de la bêtise ». Le remède tue le patient. ==== La spiritualisation alternative ==== La seconde attitude consiste dans la ''Vergeistigung der Passion'' (spiritualisation de la passion). Ce terme ne signifie pas l'évanescence ou la sublimation morale de type freudien, mais la transformation qualitative de l'énergie affective, son intégration harmonieuse à une vie consciente et créatrice. Nietzsche emprunte ce concept à Jacob Burckhardt et à sa ''Culture de la Renaissance en Italie'', où Burckhardt montre comment la Renaissance a su transformer la sensualité en amour courtois, en poésie, en beauté. Nietzsche reconnaît toutefois une limite historique : « On avouera d'autre part, avec quelque raison, que, sur le terrain où s'est développé le christianisme, l'idée d'une "spiritualisation de la passion" ne pouvait pas du tout être conçue ». Pourquoi cette impossibilité ? Parce que l'Église primitive « luttait, comme on sait, contre les "intelligents", au bénéfice des "pauvres d'esprit" ». Comment attendre d'une institution hostilisant l'intelligence qu'elle conduise une « guerre intelligente contre la passion » ? ==== Le castratisme : pratique et philosophie ==== L'Église a choisi une méthode radicalement différente : le castratisme. Nietzsche forge ce terme pour désigner l'« extirpation radicale » de la sensualité comme stratégie thérapeutique. Le castratisme n'est pas qu'une pratique ou une métaphore ; c'est une ''philosophie'' de la vie basée sur l'amputation systématique. Nietzsche souligne : « Elle ne demande jamais : "Comment spiritualise, embellit et divinise-t-on un désir ?" — De tous temps elle a mis le poids de la discipline sur l'extermination — de la sensualité, de la fierté, du désir de dominer, de posséder et de se venger ». L'énumération révèle le caractère quasi totalitaire de cette répression : elle vise l'ensemble des passions vitales, sans exception. === Section 2. Le diagnostic de dégénérescence === ==== Qui recourt aux moyens radicaux ? ==== Le deuxième aphorisme approfondit l'analyse en interrogeant : qui utilise réellement le castratisme ? Réponse : « Le même remède, la castration et l'extirpation, est employé instinctivement dans la lutte contre le désir par ceux qui sont trop faibles de volonté, trop dégénérés pour pouvoir imposer une mesure à ce désir ». Nietzsche vise « ces natures qui ont besoin de la Trappe, pour parler en image (et sans image), d'une définitive déclaration de guerre, d'un abîme entre eux et la passion ». L'allusion au monastère de La Trappe fondé par Armand Jean Le Bouthillier de Rancé symbolise l'ascétisme le plus rigoreux. Ces individus, incapables de modération, ne disposent que d'une ressource : la rupture complète. Le mot allemand ''Kluft'' (abîme) exprime bien cette séparation radicale, bien plus qu'une simple distance. ==== La dégénérescence comme incapacité ==== Voici la formulation clé : « Ce ne sont que les dégénérés qui trouvent les moyens radicaux indispensables ». Et plus précisément : « la faiblesse de volonté, pour parler plus exactement, l'incapacité de ne ''point'' réagir contre une séduction n'est elle-même qu'une autre forme de la dégénérescence ». Cette remarque possède une portée considérable. Nietzsche renverse l'évaluation morale usuelle. N'être capable que de l'extrême (tout ou rien) ne témoigne pas de la force, mais de la faiblesse. La véritable puissance consiste à pouvoir modérer, graduer, proportionner la réaction à la séduction. Un corps fort peut résister à l'excitation ; un organisme dégénéré y succombe et doit l'éliminer. ==== L'hostilité envers les sens comme symptôme ==== « L'inimitié radicale, la haine à mort contre la sensualité est un symptôme grave : on a le droit de faire des suppositions sur l'état général d'un être à tel point excessif ». Cette formule synthétise le diagnostic : l'intensité même de la haine envers les passions devient l'indicateur d'une maladie profonde. Nietzsche observe que « cette inimitié et cette haine atteignent d'ailleurs leur comble quand de pareilles natures ne possèdent plus assez de fermeté, même pour les cures radicales, même pour le renoncement au "démon" ». Autrement dit, l'incapacité à tenir le vœu de castration rend la condamnation encore plus furieuse. C'est l'échec de l'ascétisme qui provoque l'ascétisme encore plus radical. ==== Qui prononce les paroles les plus venimeuses ? ==== Nietzsche conclut par une observation capitale sur l'origine du discours anti-sensuel : « Que l'on parcoure toute l'histoire des prêtres et des philosophes, y compris celle des artistes : ce ne sont ''pas'' les impuissants, ''pas'' les ascètes qui dirigent leurs flèches empoisonnées contre les sens, ce sont les ascètes impossibles, ceux qui auraient eu besoin d'être des ascètes ». Cette formulation est subtile. Les véritables ascètes (physiquement ou psychologiquement impuissants) s'adaptent naturellement à leur condition ; ce qui produit le discours le plus violent, c'est le désir réprimé avec férocité. Le pire ennemi des passions, c'est celui qui les subit intensément et les combat avec rage. === Section 3. Les triomphes du naturalisme : spiritualisation et agon === ==== L'amour comme spiritualisation de la sensualité ==== Le troisième aphorisme présente les réalisations positives de la ''Vergeistigung''. Nietzsche énonce : « La spiritualisation de la sensualité s'appelle ''amour'' : elle est un grand triomphe sur le christianisme ». Cette formule inverse la perspective chrétienne complètement. Pour la tradition, l'amour demeure suspect, entaché de sensualité. Pour Nietzsche, au contraire, l'amour représente la transfiguration accomplie de la sensualité. Cet amour-spiritualisation ne nie pas le corps, ne le transcende pas vers une sphère abstraite. Il l'intègre à la conscience, à la tendresse, à la beauté intellectuelle et morale. C'est exactement ce que Burckhardt observe chez les poètes de la Renaissance, où la plus fine sublimation littéraire de la passion émerge de la sensualité la plus raffinée. ==== L'inimitié spiritualisée : l'agon ==== « L' ''inimitié'' est un autre triomphe de notre spiritualisation ». Celle-ci « consiste à comprendre profondément l'intérêt qu'il y a à avoir des ennemis : bref, à agir et à conclure inversement que l'on agissait et concluait autrefois ». Nietzsche renverse ici la logique chrétienne. L'Église voulait « de tous temps l'anéantissement de ses ennemis » ; « nous autres, immoralistes et anti-chrétiens, nous voyons notre avantage à ce que l'Église subsiste ». Cette position n'est pas cynique. Elle repose sur la reconnaissance que la force se forme dans le conflit, que l'excellence naît de la concurrence, que l'ennemi est indispensable. C'est le modèle grec de l'agon (combat sportif, compétition) contre le modèle chrétien de l'anéantissement de l'adversaire. ==== La politique et la grande politique ==== Cette spiritualisation s'étend au domaine politique : « Dans les choses politiques, l'inimitié est devenue maintenant aussi plus intellectuelle, plus sage, plus réfléchie, plus ''modérée'' ». Chaque parti voit « un intérêt de conservation de soi à ne pas laisser s'épuiser le parti adverse ». La destruction de l'adversaire entraînerait l'affaiblissement de soi-même. Il en va de même pour la « grande politique ». « Une nouvelle création, par exemple le nouvel Empire, a plus besoin d'ennemis que d'amis : ce n'est que par le contraste qu'elle commence à se sentir nécessaire, à ''devenir'' nécessaire ». L'ennemi n'est donc pas un obstacle externe, mais une condition de l'affirmation de soi. ==== L'ennemi intérieur et la fécondité ==== « Nous ne nous comportons pas autrement à l'égard de l'"ennemi intérieur" : là aussi nous avons spiritualisé l'inimitié, là aussi nous avons compris sa ''valeur'' ». On n'est « fécond qu'à ce prix-là qu'on est riche en opposition » ; on ne reste « jeune qu'à condition que l'âme ne se repose pas, que l'âme ne demande pas la paix ». Ces remarques contredisent l'idéal ascétique de tranquillité. La vraie jeunesse n'est pas l'ataraxie (absence de trouble), mais la vitalité conflictuelle. La fécondité naît de tensions internes maintenues dans un équilibre dynamique. === Section 4. L'idéal chrétien de la paix de l'âme : démystification === ==== Le rejet de la quiétude morale ==== « Rien n'est devenu plus étranger pour nous que ce qui faisait autrefois l'objet des désirs, la "paix de l'âme" que souhaitaient les ''chrétiens'' ». Nietzsche énonce un jugement radical : cet idéal, autrefois valorisé, devient répugnant. « Rien n'est moins l'objet de notre envie que le bétail moral et le bonheur gras de la conscience tranquille ». L'image du « bétail moral » dévoile le mépris nietzschéen pour une moralité bornée, ruminante, satisfaite d'elle-même. Ce type de paix n'est pas l'apaisement du guerrier après la victoire, mais la stupeur de la bête endormie. ==== L'équation : grande vie = guerre ==== « On a renoncé à la ''grande'' vie lorsqu'on renonce à la guerre ». Cette équation est provocante. Elle affirme que la grandeur vitale implique nécessairement un état de lutte, de tension créatrice. La paix définitive serait la mort, ou plutôt, la vie diminuée. ==== Les masques de la paix de l'âme ==== Nietzsche énumère ensuite les réalités souvent masquées par l'expression « paix de l'âme » : * Le doux rayonnement d'une animalité riche dans le domaine moral ou religieux * Le commencement de la fatigue, la première ombre que jette le soir * Un signe que l'air est humide, que le vent du sud va souffler (métaphore climatérique) * La reconnaissance involontaire pour une bonne digestion (l'apaisement physiologique travesti en état moral) * L'accalmie chez le convalescent qui recommence à prendre goût à toute chose et qui attend * L'état qui suit une forte satisfaction de notre passion dominante, le bien-être d'une rare satiété * La caducité de notre volonté, de nos désirs, de nos vices * La paresse que la vanité pousse à se parer de moralité * La venue d'une certitude, même d'une terrible certitude * L'expression de la maturité et de la maîtrise, au milieu de l'activité, du travail, de la production, du vouloir, la respiration tranquille quand la « liberté de la volonté » est ''atteinte'' Cette énumération minutieuse démontre que « paix de l'âme » recouvre une multiplicité de réalités biologiques, psychologiques et morales qu'il convient de distinguer plutôt que de confondre sous une formule creuse. ==== L'auto-référence ==== L'aphorisme se conclut par une remarque auto-référentielle : « ''Crépuscule des idoles'' : qui sait ? peut-être est-ce là aussi une sorte de "paix de l'âme"… ». Nietzsche suggère avec ironie que son propre livre pourrait être interprété comme une forme particulière de cette paix : celle qui succède à un combat mené à son terme, une forme de satisfaction apaisée après l'exercice de la destruction critique. === Section 5. Le naturalisme moral : formulation du principe === ==== La formulation centrale ==== Le quatrième aphorisme présente le « principe » nietzschéen sous forme de formule : « Tout naturalisme dans la morale, c'est-à-dire toute ''saine'' morale, est dominée par l'instinct de vie, — un commandement de la vie quelconque est rempli par un canon déterminé d'"ordres" et de "défenses", une entrave ou une inimitié quelconque, sur le domaine vital, est ainsi mise de côté ». Ce « naturalisme moral » ne signifie pas l'absence de normes, mais l'ancrage de celles-ci dans l'impératif vital. La morale saine n'est pas celle qui obéit à des principes abstraits, mais celle qui organise l'existence en fonction de l'amplification de la vie. Elle prescrit certaines actions parce qu'elles favorisent la vitalité ; elle en interdit d'autres parce qu'elles l'appauvrissent. ==== La morale antinaturelle ==== « La morale ''antinaturelle'', c'est-à-dire toute morale qui jusqu'à présent a été enseignée, vénérée et prêchée, se dirige, au contraire, précisément ''contre'' les instincts vitaux —, elle est une ''condamnation'', tantôt secrète, tantôt bruyante et effrontée, de ces instincts ». Cette morale s'oppose directement à ce qui constitue l'énergie vitale. Le Christ lui-même incarne cette orientation quand il dit : ''Dieu regarde les cœurs''. Par cette formule, il refuse les actes externes et s'intéresse aux intentions — lesquelles demeurent les plus insondables. Mais plus profondément, cette parole dit « non aux aspirations intérieures et supérieures de la vie et considère Dieu comme l'''ennemi de la vie'' ». ==== Les figures du néant ==== Deux formulations lapidaires synthétisent le diagnostic : '' « Le saint qui plaît à Dieu, c'est le castrat idéal » '' « La vie prend fin là où commence le "Royaume de Dieu" » Ces deux énoncés dépeignent un renversement absolu : ce que Dieu valorise (la sainteté), c'est l'émasculation de la vie. Et l'ordre divin commence juste où la vie terrestre s'achève. Le christianisme n'est donc pas simplement hostile à la vie ; il en est la négation systématique. === Section 6. Morale et décadence : généalogie d'une maladie === ==== L'impossible jugement objectif sur la vie ==== Le cinquième aphorisme développe l'argument généalogique central. « En admettant que l'on ait compris ce qu'il y a de sacrilège dans un pareil soulèvement contre la vie, tel qu'il est devenu presque sacro-saint dans la morale chrétienne, on aura, par cela même et heureusement, compris autre chose encore : ce qu'il y a d'inutile, de factice, d'absurde, de ''mensonger'' dans un pareil soulèvement ». Nietzsche énonce alors son argument décisif : « Une condamnation de la vie de la part du vivant n'est finalement que le symptôme d'une espèce de vie déterminée ». Pour la poser véritablement, il faudrait « prendre position ''en dehors'' de la vie et la connaître d'autre part tout aussi bien que quelqu'un qui l'a traversée, que plusieurs et même tous ceux qui y ont passé, pour ne pouvoir que toucher au problème de la ''valeur'' de la vie ». Cet argument invalide le principe même du jugement moral objectif. Tout jugement de valeur sur la vie provient de l'intérieur de la vie. Nous ne pouvons juger la vie que depuis la vie. ==== L'optique de la vie ==== « Si nous parlons de la valeur, nous parlons sous l'inspiration, sous l'optique de la vie : la vie elle-même nous force à déterminer des valeurs, la vie elle-même évalue par notre entremise lorsque nous déterminons des valeurs ». Cette formule est centrale. Elle signifie que tout système de valeurs, même le plus critique, reflète une certaine configuration vitale. Nous jugeons toujours depuis un point de vue incarné, partial, intéressé. ==== La morale antinaturelle comme symptôme de décadence ==== « Il s'ensuit que toute ''morale contre nature'' qui considère Dieu comme l'idée contraire, comme la condamnation de la vie, n'est en réalité qu'une évaluation de la vie, — de ''quelle'' vie ? de ''quelle'' espèce de vie ? » La réponse surgit immédiatement : « de la vie descendante, affaiblie, fatiguée, condamnée ». Cette formule procède par généalogie. On ne réfute pas la morale chrétienne en montrant qu'elle se contredit logiquement. On l'explique en montrant qu'elle exprime une volonté de non-être, une aspiration de la vie dégénérée à sa propre négation. « La morale, telle qu'on l'a entendue jusqu'à maintenant — telle qu'elle a été formulée en dernier lieu par Schopenhauer, comme "négation de la volonté de vivre" — cette morale est ''l'instinct de décadence'' même, qui se transforme en impératif : elle dit : "''va à ta perte !''" — elle est le jugement de ceux qui sont déjà jugés ». Schopenhauer apparaît ici comme le dernier philosophe en qui la morale chrétienne s'avère pleinement transparente et consciente. === Section 7. Critique du prescriptivisme moral === ==== La naïveté du « tu dois » ==== Le sixième et dernier aphorisme étend la critique à toute forme de moralisme prescriptif. « Considérons enfin quelle naïveté il y a à dire : "L'homme devrait être fait de telle manière !" » Nietzsche oppose à cette prétention « la réalité : nous voyons une merveilleuse richesse de types, une exubérance dans la variété et dans la profusion des formes », et « n'importe quel pitoyable moraliste des carrefours viendrait nous dire : "Non ! l'homme ''devrait'' être fait autrement" ? » ==== Le moraliste ridicule ==== Pire, « Il sait même ''comment'' il devrait être, ce pauvre diable de cagot, il fait son propre portrait sur les murs et il dit : "''Ecce Homo !''" » Cette allusion à Jean 19, 5 (Pilate montrant Jésus flagellé) sera reprise par Nietzsche comme titre de son autobiographie ''Ecce homo''. Ici, elle dénonce la prétention du moraliste à ériger son propre type dégénéré en norme universelle. ==== L'absurdité du changement prescrit ==== Même l'approche individualisée du moraliste reste ridicule : « Même lorsque le moraliste ne s'adresse qu'à l'individu pour lui dire : "C'est ainsi que tu dois être !" il ne cesse pas de se rendre ridicule ». Pourquoi ? Parce que « l'individu, quelle que soit la façon de le considérer, fait partie de la fatalité, il est une loi de plus, une nécessité de plus pour tout ce qui est à venir ». C'est une ''reductio ad absurdum'' de la liberté morale. L'individu n'est pas une substance libre flottant au-dessus des lois naturelles. Il est une configuration de forces, un nœud de nécessités héréditaires et environnementales. Lui dire « change ta nature » équivaut à « souhaiter la transformation de tout, même une transformation en arrière ». ==== Les moralistes conséquents : négateurs du monde ==== « Et vraiment, il y a eu des moralistes conséquents qui voulaient que les hommes fussent autres, c'est-à-dire vertueux, ils voulaient les hommes à leur image, à l'image des cagots ; c'est pour cela qu'ils ont ''nié'' le monde. Point de petite folie ! Point de façon modeste d'immodestie ! » Ces moralistes radicaux ont tiré les conclusions dernières de leur position. Si l'homme doit être totalement autre, c'est que le monde tel qu'il est doit être radicalement mauvais. La négation du monde découle logiquement du refus du réel au nom d'un idéal. ==== Verdict final ==== « La morale, pour peu qu'elle ''condamne'' est, par soi-même, et ''non'' pas par égard pour la vie, une erreur spécifique qu'il ne faut pas prendre en pitié, une ''idiosyncrasie de dégénérés'' qui a fait immensément de mal ! » Ce verdict est sans appel. La morale autonome, celle qui se condamne elle-même sans référence à aucune évaluation vitale, est non pas une sagesse, mais une « erreur spécifique », une manifestation pathologique. ==== L'affirmation immoraliste ==== « Nous autres immoralistes, au contraire, nous avons largement ouvert notre cœur à toute espèce de compréhension, d'intelligibilité et d'''approbation'' ». Cette affirmation finale inverse le jugement. L'« immoralisme » nietzschéen n'est pas amoralisme ou nihilisme, mais la capacité à voir, à comprendre, à inclure plutôt qu'à rejeter catégoriquement. « Nous ne nions pas facilement, nous mettons notre honneur à être ''affirmateurs'' ». L'affirmation devient alors l'attitude morale la plus haute : non pas affirmer aveuglément, mais dire oui à la diversité, à la complexité, à la tragédie de l'existence. « Nos yeux se sont ouverts toujours davantage pour cette économie qui a besoin, et qui sait se servir de tout ce que la sainte déraison, la raison ''maladive'' du prêtre rejette, pour cette économie dans la loi vitale qui tire son avantage même des plus répugnants spécimens de cagots, de prêtres et de pères la Vertu ». Cette reconnaissance de la fonction économique du mal — son utilité vitale — culmine dans la dernière phrase : « ''quels'' avantages ? — Mais nous-mêmes, nous autres immoralistes, nous sommes ici une réponse vivante ». === Conclusion : une critique généalogique et physiologique === ==== La méthode nietzschéenne ==== Cette section du ''Crépuscule des idoles'' déploie pleinement la méthode généalogique que Nietzsche a forgée. Il ne s'agit pas de réfuter la morale chrétienne par l'argumentation logique, mais de l'expliquer génétiquement : d'en retrouver l'origine dans une physiologie dégénérée, dans une volonté de non-être. Le diagnostic repose sur l'idée que toute morale exprime un certain état vital. La question n'est jamais : « Cette morale est-elle vraie ? » mais plutôt : « Quel type de vie cette morale affirme-t-elle ou nie-t-elle ? » ==== La spiritualisation contre la castration ==== L'opposition entre « spiritualisation » et « castration » structure toute l'argumentation. Là où le christianisme opère par suppression et négation, Nietzsche propose une transformation qualitative qui préserve et élève l'énergie vitale. L'amour comme spiritualisation de la sensualité, l'inimitié spiritualisée comme ''agon'' : voilà les contre-modèles qui réorientent la vie vers sa pleine expression. ==== Au-delà du moralisme ==== La conclusion « nous-mêmes, nous autres immoralistes, nous sommes ici une réponse vivante » ne signifie pas que Nietzsche rejette toute évaluation. Au contraire. Il affirme que la vraie force réside dans l'affirmation de la multiplicité, la reconnaissance de l'économie secrète par laquelle même les types dégénérés servent la vie. Cette position transcende le moralisme sans sombrer dans l'amoralisme. Ce que Nietzsche refuse, c'est une morale qui juge la vie du point de vue d'un au-delà imaginaire. Contre le « tu dois » abstrait et universel, il affirme la diversité des types, la richesse du devenir, la nécessité de chaque configuration vitale — y compris celles que le moralisme chrétien condamne. ==== Persistance et actualité ==== Le texte demeure l'une des attaques les plus puissantes jamais formulées contre le moralisme chrétien, non au nom du libertinage ou de l'amoralisme, mais au nom d'une affirmation plus haute et plus exigeante de la vie. Cette critique ne vise pas à libérer la chair contre l'esprit, mais à montrer comment une fausse spiritualité (le castratisme chrétien) appauvrit la vie au lieu de l'amplifier. Nietzsche ne demande pas aux chrétiens d'abandonner la spiritualité. Il leur demande d'imaginer une spiritualité qui affirme la vie au lieu de la nier — une transmutation plutôt qu'une extirpation, une élévation plutôt qu'une amputation. {{AutoCat}} 3u4bbzqfps2jyshiggkcrjgqwhh02xt Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure » 0 83424 764942 758366 2026-04-25T07:41:38Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »]] 758366 wikitext text/x-wiki {{Crépuscule des idoles}} === Introduction : contexte et enjeux du chapitre VII === Le chapitre VII du ''Crépuscule des idoles'', intitulé « Die Verbesserer der Menschheit » (« Les Améliorateurs de l'humanité »), constitue l'une des sections les plus incisives de l'ouvrage. Composé de cinq aphorismes, ce texte se situe au cœur de la démonstration nietzschéenne : il analyse comment diverses institutions — le christianisme, les ascètes, les moralistes, les systèmes politiques — ont prétendu « améliorer » l'humanité par des moyens qui révèlent une hostilité foncière envers la vie elle-même. La force de ce chapitre réside dans l'adoption d'une méthode strictement zoologique. Nietzsche remplace le vocabulaire moral par des termes biologiques précis : ''Zähmung'' (dressage, domestication) et ''Züchtung'' (élevage, sélection). Cette transposition n'est nullement neutre. Elle expose comment les prétendues améliorations morales de l'humanité fonctionnent en réalité comme techniques de domination dissimulées, comme processus d'affaiblissement ou de manipulation génétique. Pour Nietzsche, nommer correctement ces phénomènes signifie les voir dans leur nudité : ce qui se masque derrière le beau mot d'« amélioration » est soit un processus d'affaiblissement systématique (le dressage), soit un projet de sélection destiné à produire un type humain soumis. === Section 1 : Le problème de la moralité comme symptomatologie === ==== L'absence paradoxale de faits moraux ==== Le premier aphorisme débute par une affirmation d'une radicalité saisissante : il n'existe aucun fait moral. La morale ne nomme jamais une réalité objective donnée ; c'est une interprétation, et plus précisément une dénaturation de certains phénomènes naturels. Cette thèse, que Nietzsche attribue à lui-même comme découverte nouvelle, n'est paradoxalement pas nouvelle dans son œuvre. Elle figurait déjà, sous une forme légèrement différente, dans ''Par-delà le bien et le mal'' : « Il n'existe aucun phénomène moral, mais seulement une interprétation morale de phénomènes ». Mais pourquoi cette insistance nouvelle ? Parce que Nietzsche s'apprête à analyser comment les « améliorateurs » de l'humanité ont opéré une gigantesque usurpation : ils ont présenté leurs constructions comme des faits, comme des réalités gravées dans la nature. Or il n'en est rien. La morale est toujours une grille interprétative, jamais une donnée de la réalité. Cependant, Nietzsche ajoute une correction apparemment scandaleuse : cette absence de faits moraux ne rend pas la morale insignifiante. Bien au contraire. Elle « demeure de la plus grande valeur » — mais comme symptomatologie, c'est-à-dire comme langage des signes révélant les états internes, les configurations vitales cachées d'une culture. La morale devient un diagnostic. Pour celui qui sait la lire, elle livre « les réalités les plus précieuses des cultures et des intimités, qui ne se connaissaient pas assez elles-mêmes pour se comprendre ». Cette requalification est décisive. On ne peut pas juger une morale en fonction de sa validité logique ou de son universalité prétendument rationnelle. On doit au contraire l'interroger généalogiquement : quel type de vie cette morale exprime-t-elle ? Quelles forces la portent ? À quelles conditions servait-elle ? C'est seulement ainsi qu'on accède aux réalités qu'elle voile. ==== L'immoralisme comme lecture ==== Il s'ensuit une conséquence capitale pour ce qui suit : si l'on applique cette méthode au christianisme et à tous les systèmes qui ont prétendu améliorer l'humanité, on doit demander : Quel type de vie le christianisme exprime-t-il ? Qui en profite ? Quels instincts refoulés, quels désirs de domination se cachent derrière son universalité proclamée ? Nietzsche ne demande pas : le christianisme dit-il la vérité ? Il demande : que révèle le christianisme sur celui qui l'a créé et sur ceux qui l'acceptent ? Quelle est sa pathologie propre ? === Section 2 : La zoologie de la morale — dressage et élevage === ==== La substitution des catégories ==== Le second aphorisme opère le glissement décisif de toute l'argumentation. Pour « penser correctement la morale », Nietzsche propose de remplacer les abstractions par deux termes zoologiques : ''Zähmung der Bestie Mensch'' (dressage de la bête homme) et ''Züchtung einer bestimmten Art Mensch'' (élevage d'une race ou d'un type humain particulier). Cette substitution libère une vérité que le langage moral recouvre. Le dressage — comme celui que l'on pratique sur les chevaux ou les fauves — est une réalité physique, observable, sans prétention. Quand on dresse un animal, on cherche à lui ôter ses instincts dangereux, à le rendre obéissant, à le rendre utile. Le dressage réussit quand l'animal a oublié qu'il était libre. L'élevage — ou sélection — fonctionne différemment. Il vise à produire un type. À travers plusieurs générations, en sélectionnant les reproducteurs, on accumule certaines qualités et on en élimine d'autres. L'élevage est un projet rationnel de transformation génétique. Il suppose un éleveur, une intention, un but clair. Or, Nietzsche observe que toutes les tentatives d'« amélioration » humaine relèvent ou du dressage, ou de l'élevage. Mais — et c'est l'essentiel — jamais aucune d'elles n'a avoué ce qu'elle faisait. Elles ont toutes menti en se donnant des noms nobles. ==== Le dressage par affaiblissement ==== Voyons d'abord le dressage. Nietzsche énonçe un fait zoologique simple : le dressage de la bête s'obtient généralement par son affaiblissement. Un animal faible offre moins de résistance. Un homme devenu faible, malade de lui-même, culpabilisé, fera ce qu'on attend de lui. Ici, Nietzsche énonce une équation décisive : « Même l'homme moral n'est pas meilleur qu'avant — il est seulement plus faible. Mais il est moins nuisible ». Cette formule déchire le voile. L'homme « moralisé » par le christianisme n'a pas ascensionné vers une humanité supérieure. Il a dégénéré, s'est affaibli. Mais cet affaiblissement le rend inoffensif — inoffensif pour l'Église, pour le pouvoir sacerdotal, pour l'ordre établi. Nietzsche peint alors une scène historique : au Moyen Âge, l'Église — cette « ménagerie » comme il l'appelle — traquait spécifiquement les « meilleurs exemplaires de la bête blonde » — ces guerriers germains forts, puissants, indomptés. Elle les « améliorait » en les convertissant, en les enfermant au cloître. Quel était le résultat ? Nietzsche le décrit avec mépris : « Qu'était devenu, par la suite, un tel Germain "amélioré", attiré au cloître ? Une caricature, une aberration ». Ce guerrier jadis puissant, ''enfermé dans une cage'', entouré de ''concepts terrifiants'', était devenu quelqu'un qui ''haïssait la vie'', qui se ''torturait lui-même'', qui ''voyait le péché partout''. « En un mot, un chrétien ». La phrase suivante est un acte d'accusation : « Parlons franchement : dans la lutte contre la bête, la maladie est le seul moyen de l'affaiblir ». C'est la clé de toute la stratégie chrétienne. L'Église comprenait que la culpabilité était une maladie, et que cette maladie affaiblissait. Elle a volontairement rendu malade. Elle a ''détruit l'homme'', l'a ''affaibli'', mais elle a prétendu l'avoir ''amélioré''. ==== L'élevage contre le dressage ==== L'élevage procède autrement. Il ne cherche pas seulement à affaiblir ; il vise à produire un type, une race. Nietzsche se réfère ici à la ''Manusmriti'' (le code de Manou), cette grande compilation hindoue du droit et des mœurs qu'il a lue dans une édition française de Jacolliot. Le système des castes constitue un programme d'élevage à long terme, conscient et assumé. Les brahmanes ont organisé la reproduction humaine, la transmission des pouvoirs, l'éducation, selon une hiérarchie rigide. Chaque caste se reproduit au sein de sa caste. Cette séparation sur plusieurs générations produit effectivement des types distincts. C'est de l'élevage au sens propre. Nietzsche observe que Manou — ce ''code de la domination'' — au moins ne ment pas sur ce qu'il fait. Il énonce clairement : nous créons une hiérarchie ; nous sélectionnons ; nous excluons. Il n'y a pas chez Manou cette hypocrisie universaliste du christianisme qui prétend aimer tout le monde tout en dominant implacablement. C'est pourquoi, malgré tout, Nietzsche traite Manou avec une certaine indulgence relative — non par approbation, mais parce que Manou a au moins l'honnêteté de ne pas masquer son projet de domination sous un vernis de pitié. === Section 3 : Le christianisme comme dressage === ==== Les blonds germains ==== Le troisième aphorisme offre la démonstration concrète. Au Moyen Âge précoce, l'Église était « avant tout une ménagerie ». Partout, on faisait « chasse aux plus beaux exemplaires de la bête blonde » — aux guerriers germains nobles, puissants. On cherchait à les « améliorer » en les convertissant. La formulation « bête blonde » a provoqué bien des malentendus. Nietzsche ne faisait pas référence à une pseudo-théorie raciale biologique — les idéologies racistes de l'époque nazie l'utiliseront, mais c'est un détournement abusif. Pour Nietzsche, « blond » renvoie à la force, à la jeunesse, à la puissance guerrière, telle qu'elle s'incarnait chez les Germains. C'est la ''bête'' au sens de l'animal puissant, instinctif, indomptable. La scène du dressage est peinte sans complaisance. Le jeune Germain guerrier, vigoureux, arrogant, fier — ce type même que l'Église ciblait — devait être transformé. Comment ? Par l'immersion dans une culpabilité permanente, par la répression systématique de tous les instincts naturels. Le cloître n'était qu'une prison sophistiquée. Nietzsche demande : « Comment se présentait ensuite un tel Germain "amélioré" ? » Réponse : « Comme une caricature, une aberration ». Malade, lâche, rongé par l'auto-culpabilité, rempli de haine envers la vie. « En un mot, un chrétien ». ==== La logique du dressage ecclésial ==== « Parlons franchement : dans la lutte contre la bête, la maladie est le seul moyen de l'affaiblir ». Cette phrase énonce un principe quasi technologique. L'Église le savait. Elle a volontairement rendu malade la population germanique. Elle a créé la culpabilité, l'autopunition, la haine de soi. Ces maladies mentales et spirituelles affaiblissaient les guerriers, les rendaient contrôlables. Et voilà le mensonge : « L'Église a détruit l'homme, elle l'a affaibli, mais elle prétendait l'avoir amélioré ». Tel est le scandale. Une technique de domination présentée comme une œuvre de salut. Cette analyse situe le christianisme non comme une vérité métaphysique, mais comme une stratégie de pouvoir sacerdotal. Les prêtres avaient intérêt à dominer les guerriers. Comment ? En les rendant malades, en les culpabilisant, en les transformant en pénitents éternels. C'était cela, l'« amélioration » chrétienne. === Section 4 : Manou comme contre-exemple partial === ==== La franchise contre le mensonge ==== Le quatrième aphorisme élargit la comparaison. Nietzsche examine deux tentatives historiques de gouvernement de l'humanité : le christianisme en Occident et le système de Manou en Inde ancienne. Ces deux systèmes incarnent deux stratégies : l'un dresse en affaiblissant (via la culpabilité), l'autre élève en sélectionnant (via la hiérarchie des castes). Bien que Nietzsche ait noté, dans ses brouillons privés, des critiques acérées envers Manou — il qualifiait le système des castes d'« école de stupidité », déplorant l'absence de nature, de technique, d'art et de science — dans le texte publié du ''Crépuscule'', il le présente sous un jour moins sombre que le christianisme. Pourquoi cette asymétrie ? Parce que Manou ne dissimule rien. Le brahmane ne prétend pas « aimer » également tous les hommes. Il dit clairement : nous créons une hiérarchie ; certains sont nés pour dominer, d'autres pour servir. Le code énonce ses intentions ouvertement. Le christianisme, lui, ment. Il prêche l'égalité de tous devant Dieu, l'amour universel, le salut pour tous. Mais en même temps, il dresse impitoyablement, il impose une morale culpabilisante, il contrôle chaque pensée. Il affirme la dignité humaine tout en détruisant l'homme vivant. Ce mensonge, cette hypocrisie, ce caractère de mascarade universelle — c'est cela qui révolte Nietzsche bien plus que la domination franche de Manou. === Section 5 : L'immoralité intrinsèque des moyens === ==== Le paradoxe accusateur ==== Le cinquième aphorisme énonce la synthèse, et elle est dévastatrice. Nietzsche affirme qu'« appliquées à l'aune des morales elles-mêmes mises en œuvre, toutes les méthodes par lesquelles on a jusqu'ici tenté de rendre morale l'humanité se révèlent profondément immorales ». Que signifie cela précisément ? Cela signifie que si vous prenez les principes du christianisme lui-même — aimez votre ennemi, ne tuez point, soyez miséricordieux, pardonnez — et que vous les appliquez aux méthodes par lesquelles le christianisme s'est imposé, vous découvrez que ces méthodes violent systématiquement le code qu'elles prétendent enseigner. L'Église a utilisé la torture, l'emprisonnement, l'isolation psychologique. Elle a créé une culpabilité permanente. Elle a menti délibérément. Elle a terrorisé. Elle a contraint à l'autocastration psychique. Tous ces procédés contredisent frontalement ce que la morale chrétienne proclame en paroles. ==== La logique implicite : la morale comme instrument de pouvoir ==== Ce paradoxe révèle une vérité cachée. Les tentatives d'amélioration morale de l'humanité n'ont jamais procédé par la persuasion rationnelle ou par l'exemplarité éthique. Elles ont procédé par la contrainte, la ruse, la terreur. Pourquoi ? Parce que la morale n'a jamais été un ensemble de principes objectifs à accepter librement. C'est toujours un instrument de domination. Les prêtres, les moralistes, les « améliorateurs » ont dû employer des moyens immoraux parce qu'imposer une morale exige de la force brute. Il n'existe d'autre moyen de rendre moral un peuple que par la contrainte, la terreur, le mensonge. Cela ne signifie pas qu'il y ait quelque chose de contradictoire logiquement. Cela signifie que la morale elle-même est toujours expression d'une volonté de domination. Les prêtres voulaient le pouvoir. Ils ont créé un système moral qui les servait. Quand ce système s'avère immorale selon ses propres critères, c'est simplement que la morale n'a jamais valu comme vérité. Elle a valu comme technique. === Conclusion : au-delà de l'illusion humanitaire === ==== Le renversement de perspective ==== Ce chapitre accomplit un renversement d'une portée dénonciatrice rare. Au lieu de demander « Qu'enseigne la morale ? Est-elle vraie ? Suis-je obligé de l'accepter ? », Nietzsche demande : « Quel type de vie cette morale exprime-t-elle ? Par quels mensonges et quelles violences s'impose-t-elle ? Qui en profite réellement ? » En substituant le vocabulaire zoologique au vocabulaire moral, Nietzsche dénaturalise ce qui semblait transcendant. L'« amélioration » de l'humanité cesse d'être un beau projet éthique pour se montrer comme ce qu'elle est : une opération de dressage ou d'élevage, c'est-à-dire une pratique de domination. ==== Immoralisme et loyauté envers la vie ==== De cette analyse généalogique découle une position apparemment scandaleuse : l'immoralisme. Mais Nietzsche ne prêche pas le libertinage ou l'amoralité. Son immoralisme signifie ceci : refuser de se laisser « améliorer » par la morale ascétique, c'est rester fidèle à ce qui vit en soi. C'est dire non au projet chrétien de transformation du vivant en culpabilité, de l'instinct en péché. « Nous autres, immoralistes » — formule célèbre — n'exprime pas l'absence de valeurs. Elle exprime l'affirmation d'autres valeurs : celles de la création, de la puissance créatrice, de l'affirmation de la vie dans sa complexité tragique. Face aux « améliorateurs » qui promettent le salut par l'affaiblissement et la culpabilité éternelle, Nietzsche oppose une exigence contraire : l'approfondissement de ce qui vit, la multiplication des forces créatrices, l'acceptation de la hiérarchie naturelle des capacités. ==== Équivoques historiques et responsabilité du lecteur ==== Ce chapitre demeure controversé, et il faut en convenir. Le vocabulaire de l'« élevage », de la « sélection » des meilleurs types, peut sembler prêter le flanc aux idéologies totalitaires du XXe siècle. Il est important de noter que Nietzsche lui-même ne proposait pas un programme eugéniste systématique ni des politiques raciales explicites. Son geste reste au niveau de la critique généalogique. Néanmoins, la liberté avec laquelle Nietzsche manie ces catégories zoologiques sans ériger des garde-fous explicites laisse ouvertes les portes à des réappropriations malveillantes. L'histoire de la réception du ''Crépuscule des idoles'' en témoigne tristement. C'est un rappel de l'importance de la lecture minutieuse et du contexte philosophique. ==== Force perenne du diagnostic ==== Quoi qu'il en soit, la force de ce chapitre réside dans son énergie critique impitoyable. Il nous force à questionner toute prétention humanitaire ou moralisante. Il nous ordonne de chercher sous les belles paroles les logiques cachées de pouvoir. Il nous demande : Améliore-t-on réellement la vie en la moralisant davantage ? Ou la rendons-nous seulement plus gouvernable, plus faible, plus haineuse d'elle-même ? {{AutoCat}} bjxz5h1szu18vgdqlxwnmez5hllsz9e Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que les Allemands sont en train de perdre 0 83425 764940 758365 2026-04-25T07:41:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que les Allemands sont en train de perdre]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que les Allemands sont en train de perdre]] 758365 wikitext text/x-wiki {{Crépuscule des idoles}} === I. Position et fonction de la section dans l'économie de l'œuvre === La section « Ce qui manque aux Allemands » (''Was den Deutschen abgeht'') constitue le neuvième chapitre du ''Crépuscule des Idoles'', positionnée avant les « Flâneries inactuelles »<ref>Friedrich Nietzsche, ''Le Crépuscule des Idoles'', traduction française, Gallimard, 1974</ref>. Cette disposition répond à une logique argumentative précise : après avoir systématiquement déconstruit les grandes illusions philosophiques (Socrate, Platon, Kant) et diagnostiqué les pathologies morales de l'Occident, Nietzsche applique son diagnostic à un cas concret — l'Allemagne bismarckienne de 1888<ref>Andreas Urs Sommer, ''Kommentar zu Nietzsches Crépuscule des Idoles'', Berlin/New York, De Gruyter, 2013, p. 373 sq.</ref>. Le mouvement va du général au particulier, de l'abstrait au tangible : la décadence devient observable, mesurable, incarnée dans une réalité politique et culturelle précise. L'histoire génétique du chapitre éclaire son importance. Initialement, Nietzsche l'avait conçu comme préface à l'ouvrage — d'abord pour la « Transvaluation de toutes les valeurs », puis pour le « Loisir d'un psychologue »<ref>Sommer, op. cit., p. 373</ref>. Ce déplacement du préambule vers le cœur du texte révèle une stratégie : le diagnostic sur l'Allemagne n'est ni prologue ni épilogue, mais pierre angulaire. La culture allemande devient le terrain d'essai où vérifier les thèses générales sur l'antagonisme entre puissance politique et création culturelle. Nietzsche se positionne lui-même comme exception : un homme « parlant encore allemand » (comme il l'écrit) mais pensant contre son époque et son peuple. Cette position d'isolement apparent fonde sa légitimité critique. === II. Le diagnostic central : le pouvoir rend bête === '''L'aphorisme fondateur''' — Nietzsche ouvre son diagnostic par une affirmation implacable : pour posséder de l'esprit en Allemagne contemporaine, il ne suffit plus de l'avoir naturellement ; il faut encore le « conquérir », le « revendiquer », « se l'approprier »<ref>Sommer, op. cit., p. 374</ref>. Cette formulation étrange (posséder ce qu'on possède déjà) pointe une absence : l'esprit critique n'existe plus spontanément chez les Allemands. Il doit s'arracher à une bêtise ambiante, à une atmosphère délétère, par un effort conscient de résistance. Le paradoxe se résout ainsi : les Allemands possèdent certaines vertus indéniables — le courage militaire, la discipline, l'endurance, le sens de l'honneur. Mais Nietzsche précise avec netteté : ce ne sont pas les vertus de la culture. Ce ne sont ni une « culture supérieure », ni un « goût délicat », ni une « noblesse des instincts »<ref>Ibid.</ref>. Ce sont exactement les vertus du soldat prussien, du fonctionnaire docile, du serviteur de l'État — les qualités requises pour conquérir militairement l'Europe, non pour créer. De ce constat naît l'aphorisme central : « Il coûte cher de devenir puissant : la puissance rend bête »<ref>Ibid., p. 375</ref>. Cette formule décrit un mécanisme de substitution. Les énergies qu'un peuple investit dans la domination militaire et politique sont soustraites à la création intellectuelle. L'Allemagne, devenue en 1871 grande puissance capable d'imposer sa volonté à l'Europe, a payé ce triomphe d'une décadence culturelle progressive. On n'accumule pas la puissance et la culture : on choisit l'une ou l'autre. '''La source dans les cours de Burckhardt''' — Sommer établit que Nietzsche ne formule pas cette idée ex nihilo. Il s'appuie sur les cours que Jacob Burckhardt, son collègue à Bâle, donnait sur l'histoire politique. Burckhardt y affirmait que le pouvoir était « en soi mauvais »<ref>Ibid.</ref> — jugement d'ordre moral, presque ascétique. Nietzsche transforme cependant cette critique morale en diagnostic physiologique. Burckhardt dit : le pouvoir est moralement répréhensible. Nietzsche dit : le pouvoir produit une dégénérescence physiologique, une incapacité à penser avec légèreté, finesse, nuance. Ce ne sont pas la même chose. La critique de Burckhardt relève de l'éthique ; celle de Nietzsche relève de la pathologie. Le pouvoir ne pervertit pas l'âme morale — il abêtit le cerveau, raréfie l'oxygène intellectuel, épaissit les artères de la pensée. Sommer note un parallèle historique intéressant : Lord Acton formulera en 1887 sa célèbre aphorisme « Le pouvoir tend à corrompre ; le pouvoir absolu corrompt absolument »<ref>Ibid.</ref>. Nietzsche ne la connaissait probablement pas lorsqu'il écrivait en 1888 — les textes du ''Crépuscule des Idoles'' sont écrits en septembre 1888, l'aphorisme d'Acton date de avril 1887, mais ne circula publiquement qu'après. Néanmoins, le parallèle témoigne d'une intuition épistémique partagée : la fin du XIXe siècle commence à soupçonner que la puissance politique porte en elle une logique d'autodestruction culturelle. '''L'ironie sur Bismarck''' — Lorsqu'on demande à Nietzsche : « Y a-t-il des philosophes allemands ? Y a-t-il des poètes allemands ? Y a-t-il de bons livres allemands ? »<ref>Ibid., p. 374</ref>, sa réponse est foudroyante : « Oui, Bismarck ! »<ref>Ibid.</ref> Cette ironie fonctionne à plusieurs niveaux. D'abord, littéralement : Bismarck est certes un écrivain (il possédait ses propres discours en édition reliée), mais personne n'y discernerait de création poétique ou philosophique. L'ironie pointe donc l'absence : l'Allemagne n'a plus que son chancelier à montrer. Mais Sommer montre que Nietzsche répond implicitement à Carl Bleibtreu, critique littéraire virulent qui avait publié ''La Révolution de la littérature'' (1886). Bleibtreu dénonce avec mépris que Bismarck « tient une brochure sur les tarifs douaniers pour plus importante que l'œuvre majeure d'un poète »<ref>Ibid., p. 375-376</ref> — critique juste, mais qui méconnaît la situation. Car si Bismarck représente la seule grandeur allemande, c'est précisément parce que tous les penseurs et poètes véritables ont disparu. L'ironie de Nietzsche retourne le reproche de Bleibtreu : ce n'est pas Bismarck qui méprise la littérature ; c'est l'Allemagne qui n'a plus de littérature digne de ce nom à opposer à son chancelier. '''Le nationalisme qui tue l'esprit''' — L'hymne « Allemagne, Allemagne par-dessus tout » (''Deutschland, Deutschland über Alles''), composé par Hoffmann von Fallersleben en 1841, cristallise ce diagnostic. Sommer clarifie : ce poème était initialement libéral, inspiré par la Révolution française — il chantait la fraternité, la liberté, l'unité. Hoffmann l'avait écrit contre les ambitions d'annexion française sur la rive gauche du Rhin, non comme hymne d'expansion territoriale<ref>Ibid.</ref>. Mais en 1888, le vers a changé de sens. Il est devenu le cri de la puissance bismarckienne. Et c'est précisément ce changement que Nietzsche dénonce : plus le nationalisme exalte la « grandeur allemande », plus l'esprit critique se soumet, se tait, accepte l'uniformité. Aucune pensée véritable n'existe sans tension, sans distance critique. Or l'État-nation exige une adhésion unanime, une identification passionnelle, une suppression des distances. === III. Les deux narcotiques : une généalogie de l'abrutissement === '''Alcool et christianisme''' — Nietzsche ne désigne pas trois narcotiques, comme on le pense souvent, mais deux : l'alcool et le christianisme. Ce sont les « deux grands narcotiques européens »<ref>Ibid., p. 376</ref>, et nulle part ils n'ont été plus systématiquement abusés qu'en Allemagne « depuis presque mille ans »<ref>Ibid.</ref>. Cette généalogie est importante. Elle ne dit pas que l'Allemagne est intrinsèquement stupide. Elle dit : l'Allemagne s'est volontairement — et systématiquement — intoxiquée. Elle a ingéré deux poisons qui rongent les capacités intellectuelles. Pendant un millénaire, ces deux substances ont opéré à la dégénérescence progressive du cerveau allemand. '''Le christianisme comme narcotique métaphysique''' — Nietzsche identifie le christianisme comme le premier poison : un narcotique de l'âme. Comment fonctionne-t-il ? Il endort l'instinct critique. Il cultive l'obéissance aveugle. Il inculque la mauvaise conscience, le doute de soi, le mépris du désir et de la puissance terrestres. Il remplace la pensée libre par la foi dogmatique. Sommer documente les sources. Nietzsche a repéré cette association Christianisme-Alcoolisme chez plusieurs auteurs : chez Hellwald (1877), qui montrait comment ces deux substances operent ensemble lors de la missionarisation des peuples extra-européens. Chez Herrmann (1887), qui affirme que la « ferveur religieuse » fonctionne comme une « drogue de l'âme », une « emprunt fait au ciel pour mieux supporter les peines terrestres », mais qui « énervifie » exactement comme les narcotiques chimiques<ref>Ibid.</ref>. Nietzsche a souligné cette comparaison au crayon dans son exemplaire. '''L'alcool comme narcotique physiologique''' — Le second poison opère plus directement sur le corps et donc sur le cerveau : l'alcool, particulièrement la bière. Sommer montre que Nietzsche s'appuie ici sur une documentation empirique précise : les statistiques de Charles Richet (1884) dans son ''Physiologie des passions''. Richet donne les chiffres annuels des morts par alcoolisme : 50 000 en Angleterre, 40 000 en Allemagne, 25 000 en Russie, 4 000 en Belgique, 2 000 en France<ref>Ibid., p. 377</ref>. Mais Richet fait plus : il analyse les mécanismes cognitifs. L'alcool à faible dose surexcite l'imagination et la mémoire, mais il « paralyse la volonté, la réflexion, le jugement »<ref>Ibid.</ref>. À dose plus forte, « toute trace d'intelligence disparaît ». Nietzsche connaît cette distinction. Ce qui l'horrifie, c'est la consommation régulière parmi la jeunesse savante allemande : elle provoque une affaiblissement permanent de la volonté, une incapacité à suspendre le jugement, à réfléchir avant d'agir<ref>Ibid.</ref>. '''La question rhétorique sur la bière''' — Comment des jeunes hommes « qui consacrent leur vie aux buts les plus spirituels » peuvent-ils s'adonner à la bière, cette boisson qui « paralyse le premier instinct de la spiritualité — l'instinct d'auto-conservation de l'esprit »<ref>Ibid.</ref> ? La question n'est pas moralisatrice. Elle est physiologique. On ne peut pas vouloir la légèreté de pensée et consommer une substance qui alourdit le corps. C'est une contradiction physique, non éthique. Ce diagnostic porte sur les savants allemands. Nietzsche les voit lors des colloques universitaires, dans les tavernes, s'abreuvant de bière après des séminaires. Ils croient pouvoir séparer l'esprit du corps. Nietzsche le leur démontre : le corps est l'esprit. La bière qu'on avale en bière devient lourdeur du cerveau. '''David Strauss : l'archétype de la dégénérescence''' — Pour incarner ce diagnostic, Nietzsche mobilise l'exemple de David Strauss. Strauss avait été autrefois un « libre penseur courageux »<ref>Ibid., p. 378</ref> — l'auteur de la ''Vie de Jésus'' (1835), une critique historique des Évangiles qui avait secoué la théologie allemande. C'était un penseur. Mais Strauss vieillissant changea. Il devint l'auteur du « Der alte und der neue Glaube » (« L'Ancien et le Nouveau Credo ») — ouvrage que Nietzsche avait attaqué dès sa première Considération inactuelle (1873). Cet ouvrage tardif abandonne le tranchant critique du Strauss jeune pour proposer une « foi nouvelle » confortable, sentimentale, bourgeoise. C'est la réconciliation avec la médiocrité collective. Strauss avait même composé une élégie célèbre parmi les étudiants de Weimar, composée en 1851, où il chante la « braune Schöne » (la belle brune) — la bière brune de Munich qu'il retrouvait avec nostalgie au « bord de l'Isar »<ref>Ibid., p. 379</ref>. L'élégance studieuse du poème célèbre la fidélité à la bière : « Treue bis zum Tod » (« Fidélité jusqu'à la mort »). C'est tragique : un penseur qui consacre ses vers à sa dépendance à la bière. Nietzsche forge de cette tragédie l'expression « Evangile de cabaret » (''Bierbank-Evangelium'') : une prédication qui monte sur les tables de taverne, qui s'adresse aux buveurs, qui transforme la beuverie en religion. C'est l'archétype : le penseur qui perd son tranchant, qui se réconcilie avec le peuple stupide et beuveur, qui abandonne la tension intellectuelle pour la confortabilité collective<ref>Ibid., p. 378</ref>. === IV. L'université paralysée : le scientisme contre la pensée === '''Le diagnostic de Nietzsche professeur''' — Nietzsche enseigne la philologie classique à Bâle pendant dix-sept ans. Il connaît l'université de l'intérieur. Et il y diagnostique une « atmosphère complètement morte, satisfaite, exempte de spiritualité »<ref>Ibid., p. 380</ref>. Cette atmosphère provient d'un culte : le culte du « comportement scientifique » (''Wissenschaftsbetrieb''), une expression polémique désignant l'obsession d'accumuler les faits, de publier, de se montrer « productif »<ref>Ibid.</ref>. Sommer clarifie que le terme ''Wissenschaftsbetrieb'' est rare chez Nietzsche — il n'apparaît que deux fois dans l'œuvre philosophique, toujours sous forme d'attaque. Mais vers la fin du XIXe siècle, ce terme devient une critique courante : chez Richard Mayr (1877), chez Heinrich von Stein dans les ''Bayreuther Blätter'', ce « comportement scientifique » désigne la mécanisation, la spécialisation, l'absence de vision d'ensemble<ref>Ibid., p. 380-381</ref>. '''Le dur esclavage de l'érudition''' — Nietzsche désigne l'université moderne comme un système qui réduit le savant à un « helot » — esclave d'État. Le mot (''Helotenthum'') est un hapax chez Nietzsche : il désigne l'état des helots spartiates, esclaves publics exploités pour les travaux serviles<ref>Ibid., p. 381</ref>. « L'immense étendue de la science aujourd'hui condamne chaque individu à un dur esclavage »<ref>Ibid., p. 380-381</ref>. Pourquoi ? Parce qu'il faut connaître trop : trop de langues, trop de textes, trop de domaines. Le savant devient un « portefaix chargé de mille briques ». Il accumule le savoir sans le transformer en sagesse. Les « natures complètes, riches, profondes » ne peuvent plus recevoir l'« éducation et les éducateurs » qui leur conviendraient<ref>Ibid.</ref>. Elles sont écrasées par le système. '''L'absence de penseurs intégraux''' — La conséquence : l'université produit des spécialistes fragmentaires, non des penseurs. Des hommes qui maîtrisent un domaine étroit mais manquent cruellement de vision générale, de hiérarchisation des valeurs, de sens du beau et du laid, du noble et du vulgaire. Nietzsche conclut avec une formule géographique et métaphorique : « L'Allemagne est considérée de plus en plus comme la plaine de l'Europe »<ref>Ibid., p. 381</ref>. Une plaine : aucune montagne, aucune hauteur, aucune perspective. Ce n'est pas d'abord une critique du territoire — c'est une critique de la platitude intellectuelle. Sommer note que Nietzsche reprend ailleurs (dans des sources que Nietzsche n'a probablement pas lues) que seuls les montagnards peuvent devenir de grands penseurs : la hauteur géographique et la profondeur intellectuelle sont indissociables<ref>Ibid.</ref>. === V. L'antagonisme irréductible : Culture versus État === '''La thèse structurelle''' — Après le diagnostic particulier sur l'Allemagne, Nietzsche énonce sa thèse générale : « La Culture et l'État — qu'on ne s'y méprenne pas — sont antagonistes »<ref>Ibid., p. 382</ref>. C'est une proposition universelle. Non spécifiquement allemande. Structurelle. Cette opposition organise tout ce qui suit. L'idée moderne d'un « État civilisé » (''Kulturstaat'') est une contradiction dans les termes. Ou on construit l'État, ou on crée la culture. On ne fait pas les deux simultanément. '''La logique du sacrifice''' — Pourquoi ? Parce que « l'un vit de l'autre, l'un prospère aux dépens de l'autre »<ref>Ibid.</ref>. C'est une relation à somme zéro. Les énergies collectives investies dans la construction de la puissance étatique sont soustraites à la création culturelle. L'appareil administratif, militaire, policier requiert des hommes, du temps, de l'argent. Ces ressources ne sont pas disponibles pour les artistes, les penseurs, les créateurs. Sommer souligne que Nietzsche renverse ici trois cents ans de pensée hégélienne. Hegel voyait dans l'État prussien la réalisation de l'Esprit universel en histoire. Pour Hegel, l'État est l'incarnation de la raison. Pour Nietzsche, l'État bureaucratique moderne est précisément ce qui tue la raison, l'esprit, la création. '''La preuve historique''' — Nietzsche le démontre : « Toutes les grandes époques de culture sont des époques de décadence politique »<ref>Ibid.</ref>. Le cas paradigmatique : Athènes. Ce n'est pas l'Athènes de Périclès (puissante, dominante) qui engendre Platon et Aristote. C'est l'Athènes du IVe siècle, en déclin, morcelée, sans puissance impériale. C'est quand Athènes cesse d'être une grande puissance que naît sa plus grande philosophie<ref>Ibid., p. 383</ref>. '''Goethe et Napoléon''' — L'exemple personnel et emblématique demeure Goethe. « Le cœur de Goethe s'ouvrait au phénomène Napoléon — il se fermait aux guerres d'indépendance »<ref>Ibid.</ref>. Sommer documente : Nietzsche emprunte cela à Viktor Hehn, ''Pensées sur Goethe'' (1888), qu'il lit en été 1888 — texte qu'il qualifie du « maudit Hehn »<ref>Ibid., p. 383</ref>. Pourquoi cette préférence chez Goethe ? Parce que Napoléon incarnait la puissance transcendant les limites nationales, la volonté individuelle créatrice qui refuse les chaînes du nationalisme. Les « guerres de libération » (1813-1815) représentaient pour Goethe l'inverse : le nationalisme grégaire, la foule patriotarde, le ressentiment déguisé en héroïsme. Goethe, écrivain classique, admirait Napoléon le génie ; il méprisait les guerriers allemands ordinaires. '''Le déplacement du centre de gravité''' — Nietzsche tire la conséquence : « Au moment où l'Allemagne monte comme grande puissance, la France gagne une importance nouvelle en tant que puissance de culture »<ref>Ibid., p. 382</ref>. L'Allemagne remporte la victoire militaire de 1870-71. Simultanément, Paris devient le centre intellectuel européen. C'est là qu'on examine « avec infiniment plus de finesse et de profondeur » les vraies questions : le pessimisme, Wagner, la psychologie, l'art<ref>Ibid.</ref>. Sommer note que ce diagnostic s'étaye sur des lectures précises : en France circule une critique sophistiquée de Wagner (Camille Bellaigue dans la ''Revue des deux mondes''), une physiologie du pessimisme chez Féré, une réflexion psychologique nuancée<ref>Ibid., p. 384-385</ref>. Les Allemands « manquent même de cette espèce de sérieux »<ref>Ibid.</ref> — ils sont incapables d'accéder à ce niveau de finesse. Le résultat ? « Dans l'histoire de la culture européenne, la montée de l'Empire signifie avant tout une chose : un déplacement du centre de gravité »<ref>Ibid., p. 382</ref>. L'Allemagne victorieuse militairement est culturellement vaincue. Il n'existe plus « d'esprit allemand qui compte pour l'Europe »<ref>Ibid.</ref>. Le verdict est sans appel : « Qu'il n'y ait plus un seul philosophe allemand demeure un objet d'étonnement illimité »<ref>Ibid., p. 383</ref>. === VI. La critique du système éducatif : perte du but et des moyens === '''Éducation versus dressage''' — Nietzsche distingue rigoureusement deux choses rarement séparées : l'éducation véritable et le dressage d'État. Le but authentique de l'éducation doit être « l'éducation, la culture elle-même » — non « l'Empire », non la production de serviteurs de l'État<ref>Ibid., p. 384</ref>. Qu'est-ce que l'éducation véritable ? La formation d'êtres humains intégraux, autonomes, créateurs. Capables de penser, de juger, de créer. Capables de dire non, de refuser, de hiérarchiser les valeurs. Le dressage d'État, en revanche, produit des spécialistes fragmentés, des instruments utiles, des serviteurs dociles. Ce n'est pas l'éducation ; c'est la domestication. '''Les éducateurs disparus''' — Nietzsche énonce le second moyen perdu : les véritables « éducateurs » (''Erzieher'')<ref>Ibid.</ref>. Sommer documente cette distinction en remontant aux notes de jeunesse (1875) : « Les éducateurs éduquent ! Mais les premiers doivent s'éduquer eux-mêmes ! Et c'est pour ceux-ci que j'écris »<ref>Ibid., p. 384-385</ref>. En 1876, Nietzsche reprend : « Il n'y a plus d'éducateurs ; on n'achète sous ce nom que des gens qui ne sont pas éduqués eux-mêmes »<ref>Ibid.</ref>. Distinction capitale : il existe des « professeurs » (qui transmettent des connaissances), mais plus d'« éducateurs » (qui transforment l'âme, qui incarnent une culture mûre). L'éducateur véritable doit être « cultivé lui-même » — non simplement érudit. Il doit incarner la culture dans son être, dans son port, dans sa parole, dans son silence. Il est l'exemple vivant de ce qu'il enseigne. Le professeur moderne n'est qu'une « infirmière savante » : il change les pansements de connaissance sans transformer le patient. '''Burckhardt : l'exception''' — Jacob Burckhardt incarne cette rareté : l'éducateur authentique. Historien de la Renaissance et de la Grèce, il représente pour Nietzsche le modèle rare. Non par érudition (il en a), mais par sa capacité à juger, à hiérarchiser, à transmettre non des faits mais une sagesse<ref>Ibid., p. 385</ref>. Sommer établit la relation réciproque qui fonde ce jugement. En 1875, Burckhardt avait dit de Nietzsche : « Les Bâlois ne retrouveront plus un tel professeur »<ref>Ibid.</ref>. Treize ans plus tard, Nietzsche loue Burckhardt parce que « c'est à lui que Bâle doit sa prédominance en humanité »<ref>Ibid.</ref>. Ce n'est pas de la courtoisie mutuelle : c'est que chacun reconnaît chez l'autre la rareté de l'éducateur véritable. Burckhardt peut authentiquement louer les capacités éducatives de Nietzsche précisément parce que Nietzsche incarne ce qu'il loue chez Burckhardt<ref>Ibid., p. 385</ref>. === VII. Enjeux philosophiques permanents === Au-delà du contexte historiquement situé (l'Allemagne de 1888), cette section formule plusieurs propositions philosophiques d'une portée durable. '''1. Critique radicale de l'égalitarisme culturel''' — Nietzsche rejette la prétention que la culture supérieure peut être démocratisée, universalisée, rendue accessible à tous. Pourquoi ? Parce que les êtres humains ne naissent pas dotés des mêmes capacités intellectuelles, morales, créatrices. Il existe des inégalités profondes, presque physiologiques. Prétendre offrir la « haute culture » universellement revient à l'abaisser au plus petit dénominateur commun, à la médiocriser. '''2. Physiologie de la culture''' — Nietzsche pense réellement que les substances consommées (alcool, aliments lourds) déterminent les capacités spirituelles. Ce ne sont pas des figures rhétoriques. La bière qu'on boit devient lourdeur du cerveau. Le christianisme qu'on absorbe devient rigidité mentale. La culture procède du corps : elle est matérialité incarnée. Cette « matérialisation » de la pensée parcourt toute sa philosophie : on ne pense pas avec l'âme désincarnée, mais avec le cerveau, les nerfs, les muscles. '''3. Temporalité aristocratique''' — Contre la hâte moderne (« finir ses études à vingt-trois ans, commencer une carrière »), Nietzsche affirme qu'à trente ans on est encore « un commençant ». Cette lenteur n'est pas indolence : c'est maturation organique profonde. La culture véritable exige du temps pour s'incorporer, pour devenir instinct, pour transformer l'individu. On devient cultivé non par accumulation quantitative de faits, mais par transformation qualitative lente. === VIII. Postérité et pertinence contemporaine === La réception de cette section a été complexe et souvent instrumentalisée. Certains nationalistes allemands l'ont censurée après 1918 : elle dynamitait le mythe de la « grandeur culturelle allemande ». D'autres l'ont déformée en y voyant un simple « anti-germanisme »<ref>Sommer, op. cit., p. 389 sq.</ref>. Mais la distinction doit être maintenue : Nietzsche admire profondément certains Allemands (Goethe, Heine, Schopenhauer) précisément parce qu'ils furent des « exceptions »<ref>Ibid.</ref> — ils transcendaient la médiocrité nationale, incarnaient une culture supérieure. Il ne s'agit donc pas d'un essentialisme raciste (« les Allemands sont ontologiquement inférieurs »), mais d'un diagnostic historique et politique (« l'Allemagne de 1888 sacrifie la culture vivante à la puissance d'État »). Le texte résonne avec une pertinence troublante aujourd'hui. Les critiques contemporaines de la massification universitaire, de l'utilitarisme éducatif qui transforme l'enseignement en « employabilité », de la disparition des humanités au profit de formations techniquement rentables — tous ces enjeux que Nietzsche diagnostiqua en 1888 demeurent douloureusement actuels. L'« empire » a changé de forme (ce n'est plus l'État bismarckien, c'est le marché global), mais l'antagonisme entre puissance et culture persiste<ref>Andreas Urs Sommer, ''Kommentar zu Nietzsches Crépuscule des Idoles'', Berlin/New York, De Gruyter, 2013</ref>. {{AutoCat}} liyp38po669vhoc3w5d39am3oiek0zx Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que je dois aux anciens 0 83426 764938 758364 2026-04-25T07:41:01Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que je dois aux anciens]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que je dois aux anciens]] 758364 wikitext text/x-wiki {{Crépuscule des idoles}} === Introduction : Situation et enjeux du chapitre === Le chapitre « Ce que je dois aux Anciens » (« Was ich den Alten verdanke ») constitue l'avant-dernier chapitre du ''Crépuscule des idoles'', rédigé par Nietzsche en 1888, quelques mois avant son effondrement mental de janvier 1889. Cette position dans l'économie de l'ouvrage n'est pas fortuite : après avoir procédé à une critique systématique de la métaphysique occidentale, de la morale, de la culture moderne et de ses « idoles », Nietzsche se retourne vers l'Antiquité pour y chercher non pas un refuge nostalgique, mais un contrepoint affirmatif, une source de vitalité philosophique et existentielle. Ce chapitre, composé de cinq paragraphes numérotés, se présente comme un témoignage personnel — Nietzsche y parle à la première personne, évoquant ses « goûts », ses « préférences », ce qu'il « doit » aux Anciens. Mais cette dimension autobiographique ne doit pas masquer la portée philosophique considérable du texte : il s'agit d'une véritable récapitulation de la pensée nietzschéenne sur l'hellénisme, d'une synthèse tardive de thèmes qui traversent toute son œuvre depuis ''La Naissance de la tragédie'' (1872). Le dionysien, concept central de la philosophie nietzschéenne, y trouve sa formulation la plus aboutie et la plus explicite. L'enjeu du chapitre est triple : premièrement, établir une hiérarchie axiologique au sein de l'Antiquité elle-même (Romains contre Grecs hellénistiques, Thucydide contre Platon) ; deuxièmement, définir le dionysien comme catégorie philosophique fondamentale ; troisièmement, articuler cette catégorie à la pensée de l'éternel retour et à l'affirmation tragique de l'existence. Le texte opère ainsi une jonction entre philologie, psychologie et métaphysique, caractéristique de la méthode nietzschéenne tardive. === La question du style : Romains et Grecs (§1) === ==== Le primat de la forme romaine ==== Le premier paragraphe du chapitre s'ouvre sur une déclaration provocatrice : « Je ne dois rien aux Grecs ». Cette affirmation, qui semble contredire l'ensemble de l'œuvre nietzschéenne — profondément marquée par l'hellénisme —, doit être comprise dans sa portée polémique et stratégique. Nietzsche ne nie pas sa dette envers la Grèce archaïque et classique, mais envers une certaine image de la Grèce, celle qui a dominé la culture allemande depuis Winckelmann et le néo-humanisme. Ce qu'il oppose à cette Grèce idéalisée, c'est Rome. Nietzsche exprime sa préférence pour les Romains en termes de style : « Les Grecs ne me donnent pas, loin de là, une impression aussi forte. » Le style romain se caractérise par la concision, la densité, la maîtrise de la forme. Nietzsche cite deux auteurs latins comme modèles : Salluste et Horace. Salluste, l'historien de la ''conjuration de Catilina'' et de la ''guerre de Jugurtha'', représente pour Nietzsche l'idéal d'une prose lapidaire, où chaque mot porte, où rien n'est superflu. Cette « densité substantielle » (« gedrängte Substantialität ») s'oppose à la prolixité et à la rhétorique creuse. Horace, quant à lui, incarne la perfection formelle de la poésie latine, sa capacité à condenser une expérience vitale dans une forme ciselée. Nietzsche voit dans ces auteurs l'expression d'une volonté de puissance stylistique, d'une maîtrise qui témoigne d'une culture parvenue à maturité. ==== Critique de l'hellénisme tardif ==== La préférence pour Rome implique corrélativement une critique de la Grèce — mais d'une Grèce bien particulière. Ce que Nietzsche rejette, c'est l'hellénisme tardif, la Grèce post-classique, celle qui a subi l'influence du socratisme et du platonisme. Cette Grèce lui apparaît comme déjà décadente, comme ayant perdu la vigueur et la santé de l'époque archaïque et classique. La critique porte notamment sur le style : les Grecs tardifs, selon Nietzsche, ont développé une prose prolixe, une rhétorique qui vise l'effet plutôt que la substance. Le style devient un ornement, une parure, au lieu d'être l'expression d'une nécessité intérieure. Cette dégénérescence stylistique est le symptôme d'une dégénérescence vitale : la perte de l'instinct, le triomphe de la conscience réflexive, la substitution de la ratio à l'élan créateur. Rome, au contraire, représente pour Nietzsche une culture de la volonté, de l'action, de l'imperium. Les Romains n'ont pas inventé de philosophie originale, mais ils ont su créer des formes durables — juridiques, politiques, stylistiques. Cette capacité formatrice témoigne d'une santé que la Grèce hellénistique avait perdue. === Thucydide contre Platon : deux visions du monde (§2) === ==== Thucydide comme modèle de la culture sophistique ==== Le deuxième paragraphe oppose frontalement deux figures : Thucydide et Platon. Cette opposition n'est pas simplement littéraire ou historiographique ; elle engage deux conceptions antagonistes de la vérité, de la connaissance et de l'existence. Nietzsche se déclare explicitement « guéri » du platonisme par la lecture de Thucydide : « Mon rétablissement, mon retour à moi-même, ma cure de tout platonisme ». Thucydide, l'historien de la guerre du Péloponnèse, représente pour Nietzsche l'aboutissement de la culture sophistique. Les sophistes, loin d'être les charlatans que Platon a dépeints, incarnaient une approche réaliste et courageuse de la connaissance. Ils regardaient les faits en face, sans les travestir par des idéalisations moralisantes. Thucydide porte cette attitude à sa perfection : son récit de la guerre est d'une objectivité implacable, d'une lucidité qui ne recule devant aucune cruauté de l'histoire. Il décrit les hommes tels qu'ils sont, et non tels qu'ils devraient être selon quelque norme idéale. Nietzsche voit dans Thucydide l'expression de ce qu'il appelle le « courage devant la réalité » (« der Muth vor der Realität »). Ce courage consiste à accepter le monde tel qu'il est, dans sa dimension tragique et conflictuelle, sans chercher à le racheter par des consolations métaphysiques. Le réalisme de Thucydide est une forme de probité intellectuelle (« Redlichkeit ») qui constitue pour Nietzsche la plus haute vertu philosophique. ==== Platon comme inaugurateur de la décadence ==== À l'opposé de Thucydide se dresse Platon, que Nietzsche qualifie de « lâche devant la réalité » (« feige vor der Realität »). Cette accusation, d'une violence extrême, résume la critique nietzschéenne du platonisme. Platon, selon cette lecture, n'a pas supporté le monde tel qu'il est ; il a inventé un « monde vrai » pour dévaloriser le monde apparent, un monde des Idées pour échapper au devenir et à la contradiction. La formule célèbre de Nietzsche — « Platon est un lâche devant la réalité : — donc il fuit dans l'idéal » — condense cette critique. L'idéalisme platonicien apparaît comme une fuite, une négation du réel au nom d'un arrière-monde fictif. Cette fuite est motivée par une faiblesse vitale, une incapacité à supporter la tragédie de l'existence. Platon, en ce sens, prépare le christianisme : les deux doctrines partagent la même structure de dévalorisation du monde sensible et de compensation par un au-delà. Nietzsche va jusqu'à qualifier Platon de « pré-chrétien » : « En Platon, je vois surtout un symptôme de décadence, un instrument de la dissolution grecque, un pseudo-Grec, un anti-Grec. » Le philosophe athénien représente, dans cette perspective, la première victoire des forces réactives sur les forces actives de la vie, la première manifestation de ce que Nietzsche appelle le « nihilisme ». {{AutoCat}} 5ev7wyzvvaqdj58ovip4tyylxv6qg90 Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Avant-propos 0 83427 764936 758363 2026-04-25T07:40:47Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Avant-propos]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Avant-propos]] 758363 wikitext text/x-wiki {{Haut de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} Cet avant-propos, écrit à Turin, est daté par Nietzsche du 30 septembre 1888, « jour où fut achevé le premier livre de l'''Inversion de toutes les valeurs''. » (voir à ce propos [[Philosophie/Nietzsche/La Volonté de puissance|Volonté de puissance]]). Nietzsche y décrit son engagement dans une cause difficile, difficulté qui exige néanmoins une certaine gaieté, une certaine ironie à l'égard du sérieux avec lequel on peut considérer les problèmes ici soulevés. Pour se défaire de son sérieux et d'une excessive intériorisation qui ont tendance à nous rendre trop pesants et graves dans nos pensées, Nietzsche recommande la guerre. Les blessures de la guerre (i.e. de la polémique, de l'opposition, etc.) ont en effet une vertu curative, et il prend pour devise : :« increscunt animi, virescit volnere virtus. » Mais il y a une autre cure - selon lui préférable : ''ausculter les idoles''. C'est l'objet de ce livre. En quoi consiste cette auscultation ? Elle consiste à faire entendre le son creux des idoles ; le marteau dont parle Nietzsche est ainsi un marteau de médecin. Il y aurait donc un contre-sens à penser que Nietzsche entend frapper comme une brute sur tout ce qui se présente (ce que peut suggérer le sous-titre de cette œuvre qui se traduit littéralement : ''comment philosopher à coups de marteau''). Le marteau est au contraire une métaphore, métaphore qui veut signifier que si l'on critique sérieusement les idoles qui pullulent dans le monde, on ''entendra'' qu'elles sont en réalité vides, mais qu'elles le cachaient bien. Cet ouvrage est donc pour Nietzsche un délassement de psychologue (parmi les premiers titres que Nietzsche voulait lui donner, on trouve en effet : ''Marteau des idoles. Loisirs d'un psychologue.'') Mais ce délassement, qui est aussi pour Nietzsche un moyen de rédiger un compendium de sa pensée, annonce également de nouvelles polémiques ; c'est une ''grande déclaration de guerre'' en vue de ''renverser de nouveaux dieux''. {{Bas de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} {{AutoCat}} fflg1x67xqcetksbhpuzn6to7o6hq7s Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Maximes et Traits 0 83428 764956 758373 2026-04-25T07:43:19Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Maximes et Traits]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Maximes et Traits]] 758373 wikitext text/x-wiki {{Haut de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} Ce chapitre est composé de 44 aphorismes d'une ou deux phrases ; on ne saurait en donner une vue d'ensemble. En voici quelques uns : « 2. Même le plus courageux d'entre nous a rarement le courage d'assumer ce qu'il ''sait''... » « 8. ''Appris à l'école de la guerre'' : ce qui ne me tue pas me fortifie. » « 11. Un âne peut il être tragique ,_périr sous un fardeau que l'on ne peut ni porter ni rejeter?... le cas du philosophe» « 12. si l'on possède son pourquoi? de la vie, on s’accommode de presque tous les comment?_L'homme n'aspire pas au bonheur; il n'y a que l'anglais qui fait cela » « 24. à force de vouloir chercher les origines on devient écrevisse. l'historien voit en arrière; il finit par croire en arrière» « 26. Je me méfie des faiseurs de systèmes et m'écarte de leur chemin. L'esprit de système est un manque de probité. » " 30. le ver se recroqueville quand on lui marche dessus. cela est plein de sagesse. par là il amoindrit la chance de se faire de nouveau marcher dessus. dans le langage de la morale: l'humilité" « 33.combien peu de choses il faut pour son bonheur! le son d'une cornemuse._sans la musique, la vie serait une erreur. l'Allemand se figure Dieu lui même en train de chanter des chants. » « 39. ''Le désillusionné parle'' : Je cherchais des grands hommes, et je n'ai trouvé que des hommes ''singeant'' leur idéal. » « 44. Formule de mon bonheur : un « oui », un « non », une ligne droite, un ''but''... » {{Bas de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} {{AutoCat}} 5w7xa5slwie5lec39i8k71oic6cy7zw Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Le Problème de Socrate 0 83429 764952 758387 2026-04-25T07:42:47Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Le Problème de Socrate]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Le Problème de Socrate]] 758387 wikitext text/x-wiki {{Haut de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} == Introduction : que signifie mettre Socrate en procès ? == Peut-on juger de la valeur de la vie ? Et si la question, en elle-même, révélait déjà une maladie ? Telle est l’interrogation qui ouvre le deuxième chapitre du ''Crépuscule des idoles'' (''Götzen-Dämmerung''), intitulé « Le problème de Socrate » (''Das Problem des Sokrates''). Nietzsche y soumet le fondateur présumé de la philosophie occidentale à un examen sans ménagement : loin d’incarner l’apogée de la sagesse grecque, Socrate en marquerait, selon lui, le déclin. Son rationalisme serait le symptôme d’une dégénérescence physiologique : la raison devient un tyran là où les instincts fléchissent. Cette thèse s’inscrit dans une stratégie plus vaste : en brisant l’idole Socrate, Nietzsche entend ébranler l’édifice entier de la philosophie morale occidentale. == Contexte : genèse et place du chapitre dans l'œuvre == === Circonstances de rédaction === Dans les manuscrits préparatoires (Mappe XVI 4), le chapitre portait d’abord le titre « Sokrates als Problem » (« Socrate comme problème »), puis fut intégré à un projet plus large sur « la philosophie comme décadence » (KSA 14, 413). Le matériau brut du chapitre se trouve rassemblé dans le fragment posthume NL 1888, KSA 13, 14[92], où Socrate est qualifié de « moment de la plus profonde perversité dans l’histoire de l’humanité ». === Continuité et ruptures avec les œuvres antérieures === La critique de Socrate traverse l’œuvre nietzschéenne depuis ''La Naissance de la tragédie'' (1872), où le philosophe athénien apparaît comme l’« Urbild des theoretischen Optimisten » (« archétype de l’optimiste théorique », GT 15). Nietzsche y opposait l’esprit dionysien, tragique et affirmatif, au rationalisme socratique, qui aurait détruit la culture tragique grecque. Dans le ''Crépuscule'', cette critique prend une inflexion physiologique nouvelle : sous l’influence de lectures médicales récentes — notamment Charles Féré (''Dégénérescence et Criminalité'', 1888) et les travaux d’anthropologie criminelle de Lombroso —, Nietzsche pathologise Socrate. Le philosophe n’est plus seulement un adversaire intellectuel : il est un décadent, un malade, dont la pensée exprime un organisme en voie de décomposition. === La thèse centrale === Nietzsche soutient que la philosophie socratique — avec son équation « raison = vertu = bonheur » — constitue, non pas une conquête de l’esprit, mais le symptôme d’une dégénérescence (''Degenerescenz''). Les « instincts en anarchie » de Socrate l’auraient contraint à ériger la raison en tyran pour se dominer lui-même. Cette solution individuelle, étendue à toute une civilisation en déclin (l’Athènes du V{{e}} siècle), aurait inauguré deux millénaires de philosophie hostile à la vie. La décadence — terme que Nietzsche emprunte à la critique littéraire française (Paul Bourget) avant de lui donner une portée physiologique — désigne ici la désagrégation des instincts vitaux et l’incapacité à affirmer l’existence. == Analyse des douze sections == === § 1 : Le jugement des sages sur la vie === ==== Structure argumentative du passage ==== Cette première section remplit une fonction d’ouverture programmatique. Elle se déploie en quatre mouvements : * Le constat (lignes 1-4) énonce l’unanimité des sages sur la non-valeur de la vie. * L’exemple paradigmatique (lignes 4-6) s’appuie sur les dernières paroles de Socrate. * Le renversement herméneutique (lignes 6-10) transforme un argument d’autorité en symptôme de maladie. * L’image conclusive (lignes 10-11) figure la sagesse comme un corbeau attiré par la charogne. Cette structure mime un syllogisme apparent pour le retourner aussitôt : là où la tradition concluait à la vérité d’un jugement unanime, Nietzsche conclut à la pathologie commune des juges. ==== Analyse détaillée ==== ===== 1. Le jugement unanime des sages sur la vie ===== « De tout temps, les plus sages ont porté le même jugement : elle ne vaut rien » L’ouverture est brusque. Nietzsche ne commence pas par une question prudente, mais par une affirmation qui se donne pour un fait acquis. Le syntagme « de tout temps » (''zu allen Zeiten'') confère à l’énoncé une portée transhistorique : il ne s’agit pas d’une école particulière, mais d’un trait que Nietzsche présente comme constant de la sagesse philosophique depuis ses origines. L’expression « elle ne vaut rien » (''es taugt nichts'') mérite attention. Le verbe allemand « taugen » signifie « être bon à », « convenir », « avoir de la valeur ». La formule est volontairement triviale, presque grossière : Nietzsche fait parler les « sages » comme s’ils prononçaient un verdict de comptoir. Cette trivialisation prépare la dégradation ultérieure de leur prestige. ====== Les quatre tonalités du discours des sages ====== Nietzsche caractérise ce jugement par quatre attributs coordonnés : * « plein de doute » (''voll Zweifel'') ; * « plein de mélancolie » (''voll Schwermuth'') ; * « plein de lassitude de la vie » (''voll Müdigkeit am Leben'') ; * « plein de résistance contre la vie » (''voll Widerstand gegen das Leben''). Cette énumération dessine une progression : du doute intellectuel à la mélancolie affective, de la fatigue existentielle à l’hostilité active. Le « contre la vie » (''gegen das Leben'') final annonce le thème central du chapitre : la philosophie comme entreprise de négation vitale. Le terme « Schwermuth » (mélancolie) appartient au vocabulaire médico-psychologique du XIX{{e}} siècle. Il désigne un état dépressif que la psychiatrie de l’époque — notamment chez Jean-Étienne Esquirol et Wilhelm Griesinger — tenait pour pathologique. En l’attribuant aux sages, Nietzsche prépare son diagnostic : leur jugement n’exprime pas une vérité objective, mais un état morbide. ===== 2. Les dernières paroles de Socrate ===== ====== La source platonicienne ====== Nietzsche fait référence au ''Phédon'' de Platon (118a), où Socrate, après avoir bu la ciguë, prononce ses dernières paroles : « Ô Criton, nous devons un coq à Asclépios ; acquittez cette dette, n’y manquez pas » (traduction Schleiermacher). Asclépios (Esculape en latin) est le dieu grec de la médecine. Le coq était l’offrande traditionnelle qu’on lui faisait après une guérison. La phrase de Socrate signifie donc, littéralement, qu’il remercie Asclépios de l’avoir guéri d’une maladie. ====== L’interprétation nietzschéenne ====== Nietzsche reformule ces paroles de manière significative : « vivre — cela signifie être longtemps malade ». Cette paraphrase n’est pas dans le texte platonicien. Elle constitue une interprétation des derniers mots, selon laquelle la « maladie » dont Socrate se dit guéri n’est autre que la vie elle-même. Cette lecture n’est pas une invention de Nietzsche. Elle s’inscrit dans une tradition interprétative ancienne, remontant aux scholies d’Olympiodore (VI{{e}} siècle). Karl Steinhart, le professeur de grec de Nietzsche à Schulpforta, avait explicitement défendu cette interprétation dans ses annotations à la traduction des dialogues de Platon : « Socrate aussi se sent, à l’instant de mourir, guéri de la maladie de la vie terrestre et libéré des liens entravants du corps » (Steinhart 1854, 577). Nietzsche avait emprunté plusieurs fois cette édition à la bibliothèque universitaire de Bâle (Crescenzi 1994) et l’avait utilisée pour ses cours. En 1864, Steinhart l’avait recommandé à Karl Schaarschmidt comme « une nature profonde et rêveuse, passionnément attachée à la philosophie, notamment platonicienne, dans laquelle il est déjà assez initié » (KGB I 4, 338). ====== La reprise du ''Gai Savoir'' ====== Cette interprétation des dernières paroles de Socrate apparaît déjà dans ''Le Gai Savoir'' (§ 340), dans un passage intitulé « Socrate mourant » : {{Citation bloc|J'admire la bravoure et la sagesse de Socrate dans tout ce qu'il fit, dit — et ne dit pas. […] J'aurais voulu qu'il se fût tu aussi au dernier instant de sa vie — peut-être appartiendrait-il alors à un ordre d'esprits encore plus élevé. Était-ce la mort ou le poison ou la piété ou la méchanceté — quelque chose lui délia la langue en cet instant et il dit : "Ô Criton, je dois un coq à Asclépios." Ce "dernier mot" ridicule et terrible signifie, pour qui a des oreilles : "Ô Criton, la vie est une maladie !" Est-ce possible ! Un homme comme lui, qui avait vécu gaiement et comme un soldat aux yeux de tous — était pessimiste ! | FW 340, KSA 3, 569}} La différence entre les deux textes est instructive. Dans ''Le Gai Savoir'', Nietzsche exprime encore de l’admiration pour Socrate et se dit déçu par ses dernières paroles. Dans le ''Crépuscule'', l’admiration a disparu : Socrate n’est plus qu’un « décadent » parmi d’autres. ====== L’évolution de l’image de Socrate chez Nietzsche ====== Cette évolution peut se résumer ainsi : * Dans ''La Naissance de la tragédie'' (1872), Socrate est l’« archétype de l’optimiste théorique » (GT 15), le destructeur de la culture tragique grecque. Mais Nietzsche, alors sous l’influence de Schopenhauer, demeure encore proche d’un pessimisme qui valorise la négation du vouloir-vivre. * Dans ''Le Gai Savoir'' (1882), Socrate apparaît comme un pessimiste secret, ce qui le rapproche paradoxalement de Schopenhauer ; mais Nietzsche commence, en même temps, à prendre ses distances avec le pessimisme. * Dans le ''Crépuscule'' (1888), Socrate est désormais un « décadent » et un nihiliste, c’est-à-dire un négateur de la vie, que Nietzsche, devenu partisan d’une affirmation de l’existence, attaque de front. ===== 3. Le renversement herméneutique : du ''consensus sapientium'' au diagnostic de maladie ===== ====== Le ''consensus sapientium'' comme argument traditionnel ====== L’expression latine « consensus sapientium » (« accord des sages ») désigne un argument classique : l’unanimité des autorités intellectuelles sur un point constituerait une preuve de sa vérité. Cette idée remonte à la ''Topique'' d’Aristote (I 1, 100b 20 sq.), selon laquelle les opinions généralement admises (''endoxa''), même si elles ne sont pas des preuves au sens strict, peuvent être utiles à la recherche. Nietzsche avait déjà discuté ce concept dans ''Humain, trop humain'' (I, § 110), mais dans un autre sens. Il y citait le poème de Goethe ''Kophtisches Lied'' (1827) : « Alle die Weisesten aller der Zeiten / lächeln und winken und stimmen mit ein » (« Tous les très sages de tous les temps / sourient, font signe et acquiescent »). Dans ce passage antérieur, Nietzsche se rangeait du côté des sages contre le « ''consensus gentium'' » (accord des peuples), qu’il tenait pour un indice de sottise. Ici, au contraire, il retourne le soupçon contre les sages eux-mêmes : leur accord ne prouve pas leur vérité, mais leur maladie commune. ====== « Nos pessimistes » ====== L’expression « nos pessimistes » (''unsre Pessimisten'') désigne d’abord Schopenhauer et ses disciples. Les manuscrits préparatoires (cahiers W II 5, 50 et 51) nommaient explicitement Schopenhauer, que la version publiée a rendu anonyme (KSA 14, 413). Cette « déconcrétisation » (''Entkonkretisierung''), selon le terme d’Andreas Urs Sommer, déplace la critique : elle quitte la polémique contemporaine pour prendre la forme d’une affirmation générale. Schopenhauer avait fait du pessimisme le cœur de sa philosophie. Dans ''Le Monde comme volonté et représentation'' (livre IV, § 53-71), il soutenait que la vie est essentiellement souffrance et que la sagesse consiste dans la « négation du vouloir-vivre » (''Verneinung des Willens zum Leben''). Les dernières paroles de Socrate semblaient confirmer cette thèse : même le plus sage des hommes reconnaissait que la vie est une maladie. ====== Le renversement nietzschéen ====== Nietzsche inverse entièrement l’argument : * Position traditionnelle : les sages s’accordent à déprécier la vie ; cet accord prouve la vérité de leur jugement. * Position nietzschéenne : les sages s’accordent à déprécier la vie ; cet accord prouve qu’ils partagent une pathologie commune. Le passage du « vrai » (wahr) au « malade » (krank) est le pivot du texte. Nietzsche ne discute pas le contenu du jugement des sages (la vie vaut-elle ou non quelque chose ?) : il déplace la question vers les conditions de production de ce jugement. La méthode est généalogique : comprendre d’où vient une évaluation, plutôt que décider abstraitement si elle est vraie. ====== Le « nous » et les « Hyperboréens » ====== Le texte oppose un « on » (man) passé à un « nous » (wir) présent. Ce « nous » désigne ceux qui ont surmonté le pessimisme et pratiquent la « grande santé » (''die große Gesundheit''). Dans les manuscrits, ce groupe était identifié aux « Hyperboréens » ou aux « immoralistes » — termes par lesquels Nietzsche désigne des esprits libres capables d’affirmer la vie sans réserve. Les Hyperboréens, dans la mythologie grecque, étaient un peuple légendaire vivant au-delà du vent du nord (Borée), dans une contrée de félicité permanente. Nietzsche reprend ce terme dans l’ouverture de ''L’Antéchrist'' : « Regardons-nous en face. Nous sommes des Hyperboréens » (« Avant-propos »). ===== 4. L’image du corbeau et de la charogne ===== ====== La symbolique du corbeau ====== La section se clôt sur une image saisissante : « La sagesse n’apparaîtrait-elle pas sur terre comme un corbeau qu’une légère odeur de charogne met en joie ? » Le corbeau (''Rabe'') est un charognard. En l’associant à la sagesse philosophique, Nietzsche suggère que celle-ci se nourrit de ce qui est mort ou mourant. La philosophie serait attirée par la décomposition vitale comme le corbeau par les cadavres. Cette image opère une substitution symbolique révélatrice. L’emblème traditionnel de la philosophie est la chouette de Minerve (Athéna), oiseau de sagesse et de clairvoyance nocturne. Hegel, dans la préface des ''Principes de la philosophie du droit'' (1820), avait formulé cette image : « La chouette de Minerve ne prend son vol qu’à la tombée de la nuit. » Nietzsche remplace la chouette — oiseau noble, associé à la réflexion — par le corbeau — charognard, associé à la mort et à la putréfaction. ====== Les sources mythologiques ====== Le corbeau possède toutefois une symbolique ambivalente. Dans la mythologie nordique, les deux corbeaux Hugin et Munin (« Pensée » et « Mémoire ») accompagnent Odin et lui rapportent ce qui se passe dans le monde. Dans la ''Götterdämmerung'' de Wagner — dont le titre allemand est proche de celui du ''Crépuscule des idoles'' (''Götzen-Dämmerung'') —, les corbeaux d’Odin apparaissent à plusieurs reprises, notamment au moment où Hagen assassine Siegfried (acte III, scène 2). Jakob Grimm, dans sa ''Deutsche Mythologie'', que Nietzsche connaissait, notait la parenté entre le corbeau et le loup comme animaux sacrés d’Apollon — dieu de la clarté rationnelle. Cette ambivalence — le corbeau comme figure de la sagesse et comme charognard — est précisément ce que Nietzsche exploite pour suggérer que la « sagesse » philosophique est, en réalité, une attirance morbide pour ce qui décline. ====== L’odeur de charogne (''Aas'') ====== Le mot allemand « ''Aas'' » (charogne) est violent. Il évoque non seulement la mort, mais la décomposition, la puanteur, le dégoût. La vie que les philosophes jugent « sans valeur » n’est pas simplement niée : elle est présentée comme un cadavre dont la philosophie se repaît. Cette image prépare le diagnostic du chapitre : les philosophes ne jugent pas la vie de l’extérieur, en observateurs neutres ; ils sont eux-mêmes des organismes qui déclinent, attirés par ce qui leur ressemble. === § 2 : La valeur de la vie est-elle évaluable ? === Nietzsche pousse plus loin sa position : la question même de la valeur de la vie est illégitime. « La valeur de la vie ne peut pas être évaluée » (''Der Werth des Lebens kann nicht abgeschätzt werden''). Pourquoi ? Parce que le vivant est juge et partie : il ne peut s’extraire de la vie pour la juger objectivement. L’expression « valeur de la vie » (''Werth des Lebens'') fait écho au titre de l’ouvrage d’Eugen Dühring (''Der Werth des Lebens'', 1865), que Nietzsche avait longuement excerpté en 1875 (NL, KSA 8, 9[1]). Le soupçon se renverse alors : « Qu’un philosophe voie dans la valeur de la vie un problème constitue même une objection contre lui » (§ 2). Le pessimisme philosophique n’est pas une découverte métaphysique, mais un symptôme de décrépitude vitale. Nietzsche reprend ici l’une des thèses majeures de la ''Généalogie de la morale'' : les évaluations morales expriment des états physiologiques. === § 3 : Socrate et le « peuple » — laideur et basse extraction === Cette section introduit le motif de la laideur socratique, abondamment documenté dans les sources antiques (Platon, ''Banquet'' 215a-b ; Xénophon, ''Banquet'' IV, 19). Nietzsche écrit : « Socrate appartenait, par son origine, au plus bas peuple : Socrate était de la populace. On sait, on voit encore aujourd’hui combien il était laid » (''Sokrates gehörte, seiner Herkunft nach, zum niedersten Volk: Sokrates war Pöbel. Man weiss, man sieht es selbst noch, wie hässlich er war''). Le terme allemand « Pöbel » (populace) porte une charge péjorative que Nietzsche assume pleinement. Il s’appuie sur les travaux d’Eduard Zeller (''Die Philosophie der Griechen'', 1859), qui notait le contraste entre l’aspect extérieur de Socrate et l’idéal grec de l’harmonie entre corps et âme. Mais là où Zeller y voyait une tension intéressante, Nietzsche y lit un diagnostic : « La laideur, en elle-même déjà une objection, est chez les Grecs presque une réfutation » (§ 3). Nietzsche mobilise ensuite l’anthropologie criminelle de son temps. Citant Féré, il affirme que « les anthropologues parmi les criminalistes nous disent que le criminel typique est laid : ''monstrum in fronte, monstrum in animo'' » (« monstre au visage, monstre dans l’âme », § 3). Cette formule latine, que Nietzsche trouve chez Féré (1888, 80), provient elle-même de la tradition physiognomonique. L’application au cas de Socrate est délibérément provocatrice : Nietzsche retourne l’image traditionnelle du sage injustement condamné en suggérant qu’il portait les stigmates du criminel. {{Bas de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} {{AutoCat}} qjfh99hh0bxfqi0a4gvuhp2owfd86i2 Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La « raison » dans la philosophie 0 83430 764950 758370 2026-04-25T07:42:37Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/La « raison » dans la philosophie]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La « raison » dans la philosophie]] 758370 wikitext text/x-wiki {{Haut de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} Le chapitre précédant a montré en quoi l'équation ''raison = vertu = bonheur'' est pour Nietzsche une formule typique de la philosophie [[Philosophie/Morale|morale]], et par quel type d'hommes elle est nécessairement formulée. Mais cette équation a également une place fondamentale dans l'histoire de la [[w:métaphysique|métaphysique]] occidentale. Le présent chapitre en examine le premier terme, la [[w:raison|raison]] ; les autres aspects seront abordés plus loin. Qu'est-ce qui caractérise le mieux les [[philosophe]]s ? Nietzsche distingue deux traits typiques : *le point de vue adopté sur les idées : l'[[w:éternité|éternité]] ; *le renversement de la [[w:causalité|causalité]] naturelle. Le premier trait caractéristique est donc, selon Nietzsche, le point de vue que les philosophes voudraient prendre sur les idées : c'est le point de vue de l'[[w:éternité|éternité]]. Dans cette perspective, ils considèrent le devenir, le changement, la [[Philosophie/Mort|mort]], la croissance, etc. comme des réfutations, car ils ne croient qu'en l'[[w:Être|Être]] : :« Ce qui est ne devient pas, ce qui devient n'est pas. » Pourtant, si l'être est réalité et vérité, comment expliquer que nous ne le saisissions jamais ? À cette question cruciale, les philosophes répondent que ce sont les sens les coupables. Ce sont les [[w:sens|sens]] qui nous trompent sur le monde vrai : la foi aux sens est une illusion et le corps n'est ''qu'une pitoyable idée fixe des sens''. Or il est évident pour Nietzsche que ce ne sont pas les sens qui nous trompent, mais l'usage que nous en faisons : c'est notre conception de la ''raison'' qui fait que nous faussons le témoignage des sens. Les sens ne mentent pas, car ils nous montrent le changement et l'impermanence, et c'est ce monde apparent qui est vrai ; le monde vrai des philosophes est un [[w:mensonge|mensonge]] qu'on y ajoute. Nietzsche passe alors à l'examen de l'autre idiosyncrasie des philosophes : confondre ce qui vient en premier et ce qui vient en dernier, i.e. le renversement de la causalité. Cette erreur consiste à placer les [[w:concept|concept]]s de la raison au commencement de tout, car ces concepts étant considérés comme supérieur au monde des sens, ils ne sauraient en provenir. Il faut au contraire que ces concepts soient sans naissance, ''causa sui'', car aucun d'eux n'a pu devenir. Mais toutes ces idées sont équivalentes en valeur et il ne doit pas y avoir de contradiction entre elles ; il faut donc encore qu'elles se trouvent réunies dans un être ultime, « [[w:Dieu|Dieu]] », placé à l'origine comme en soi, comme réalité la plus réelle. Mais d'où viennent ces abstractions ? Ce sont des préjugés de la raison qui nous conduisent à utiliser l'[[w:unité|unité]], l'[[w:identité|identité]], la [[w:substance|substance]], la [[w:causalité|causalité]], l'[[w:être|être]], etc. Ces préjugés s'expliquent par la [[w:métaphysique|métaphysique]] du [[Philosophie/Langage|langage]] qui constitue la raison. Le [[Philosophie/Langage|langage]] remonte en effet à des temps très anciens et reflète une mentalité fétichiste quant à la causalité des agents naturels. L'erreur originelle que véhicule le langage est donc l'erreur de la [[w:causalité|causalité]] de la [[w:volonté|volonté]] : cette idée est celle d'un agent qui agit, donc d'un moi, d'une substance, enfin : d'un être. Ces [[w:catégorie|catégorie]]s inscrites dans le langage sont devenues par la force des choses les catégories de la [[w:pensée|pensée]], et les philosophes ont cru y trouver l'expression de notre origine supérieure du fait de leur certitude subjective. La conclusion de Nietzsche sur l'ensemble de ces points est que nous serons toujours ramenés à l'idée de l'[[w:Être|Être]] si nous donnons foi à cette ''raison'' du langage : :« oh, quelle horrible vieille trompeuse ! Je crains que nous ne puissions nous débarrasser de Dieu, parce que nous croyons encore à la grammaire... » {{Bas de page|Philosophie/Nietzsche/Crépuscule des idoles/Sommaire}} {{AutoCat}} 03optyfpzjqh8ysw1yavx9lj9uohra8 Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable 0 83431 764944 758367 2026-04-25T07:42:03Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable]] 758367 wikitext text/x-wiki {{Crépuscule des idoles}} Nietzsche expose et résume les grandes étapes de l'idée de « monde vrai » telle qu'elle se présente dans l'histoire de l'[[w:Occident|Occident]]. *Le monde vrai accessible au sage : [[Philosophie/Platon|Platon]]. *Le monde vrai inaccessible, mais promis aux vertueux : [[w:Christianisme|Christianisme]]. *Le monde vrai inaccessible, mais en tant qu'il est pensé, un impératif : [[w:Kant|Kant]]. *Le monde vrai inaccessible et inconnu, il n'engage plus à rien : [[w:positivisme|positivisme]]. *Le monde vrai, une idée inutile et donc réfutée : moment de l'esprit libre. *Le monde vrai aboli, le monde de l'apparence l'est aussi : fin de l'erreur la plus longue et moment de [[w:Ainsi parlait Zarathoustra|Zarathoustra]]. {{AutoCat}} ek0qrzz9a581eqc4i7pjqs7r8u616bn Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Les quatre grandes erreurs 0 83432 764954 758372 2026-04-25T07:43:09Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Les quatre grandes erreurs]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Les quatre grandes erreurs]] 758372 wikitext text/x-wiki {{Crépuscule des idoles}} Dans ce chapitre, Nietzsche revient sur les erreurs de la [[w:philosophie|philosophie]] et de la [[w:religion|religion]] qu'il a trouvées au cours des précédents chapitres. La mise en évidence de ces erreurs fait partie de son projet de trans-valuation des valeurs : en effet, s'il apparaît que la [[w:pensée|pensée]] occidentale (dans tous les domaines : [[Philosophie/Morale|morale]], [[w:métaphysique|métaphysique]], [[Philosophie/Politique|politique]], etc.) s'est construite jusqu'à présent sur des illusions conceptuelles et des méthodes imaginaires, alors se fait également jour la nécessité de reprendre toutes ces questions d'après une perspective nouvelle. Il faut d'ailleurs remarquer que le ''Crépuscule des idoles'' a été rédigé avec quelques uns des écrits qui étaient d'abord destiné à la grande œuvre de Nietzsche : ''La [[Philosophie/Nietzsche/La Volonté de puissance|Volonté de puissance]], Essai d'une trans-valuation de toutes les valeurs'' ; le projet de cette œuvre a été abandonné par Nietzsche, mais bon nombre des textes qui devaient la constituer ont servi à l'écriture de ses dernières œuvres (comme ''[[w:L'Antéchrist|L'Antéchrist]]'' par exemple). === Première erreur : confondre la cause et l'effet === Cette erreur est appelée [[Philosophie/Morale|morale]] et [[w:religion|religion]] dans la [[w:pensée|pensée]] occidentale. Tous les commandements moraux et religieux sont de ce type. C'est également l'erreur la plus ancienne ; elle consiste à inverser la [[w:causalité|causalité]] naturelle. Par exemple, un [[w:homme|homme]] n'est pas heureux du fait qu'il obéisse à un commandement moral qui lui dit d'être vertueux (exemple typique de formes de causalité morale et religieuse) ; sa [[w:vertu|vertu]] est au contraire l'effet de son [[Philosophie/Bonheur|bonheur]]. Mais qu'est-ce que le bonheur pour Nietzsche ? C'est incarner un ordre physiologique qui s'exprime par un rapport juste avec les autres et avec les choses. Autre exemple : pour la morale traditionnelle, la cause de la ruine d'un peuple est souvent le luxe et la luxure ; Nietzsche rétablit la causalité naturelle : le luxe et la luxure ne sont pas du tout les causes (outre le fait qu'elles peuvent tout aussi bien exprimer un excès de force et non nécessairement une faiblesse), mais les conséquences d'un épuisement tel qu'il n'est plus possible de résister à des sollicitations toujours plus vives (un [[w:peuple|peuple]] épuisé a ainsi besoin de beaucoup d'excitants pour secouer sa torpeur, il ne se sent exister qu'autant que sa sensibilité . === L'erreur d'une fausse [[w:causalité|causalité]] === === L'erreur des causes imaginaires === === L'erreur du [[w:libre arbitre|libre arbitre]] === {{AutoCat}} fn76ftb6bo6o1lu16oozbhdobc79q3j Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Flâneries inactuelles 0 83433 764946 758368 2026-04-25T07:42:17Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Flâneries inactuelles]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Flâneries inactuelles]] 758368 wikitext text/x-wiki {{Crépuscule des idoles}} Ce chapitre, composé de 51 paragraphes, et qui est le chapitre le plus long du [[w:livre|livre]], est une suite de réflexions variées et plus ou moins liées entre elles. L'organisation apparente peut donner l'impression d'une certaine confusion ; en réalité, l'étude scrupuleuse de cet ensemble révèle des thèmes sous-jacents qui font la cohérence et l'unité de ces aphorismes. === Aphorisme 1. Mes impossibilités === ==== I. Structure et rhétorique : L'exécution par la sentence ==== L'aphorisme se présente sous la forme d'une liste verticale, une énumération nominale sèche. Nietzsche abandonne ici la phrase discursive (sujet-verbe-complément) pour une structure binaire : '''Nom propre : définition satirique'''<ref>Friedrich Nietzsche, ''Le Crépuscule des Idoles/Flâneries inactuelles'', Wikisource, https://fr.wikisource.org/wiki/Le_Crépuscule_des_Idoles/Flâneries_inactuelles</ref>. '''L'absence de verbe :''' L'effacement du verbe fige la cible dans une essence ridicule. Ce n'est pas ce que ''font'' ces auteurs qui est décrit, mais ce qu'ils ''sont''. Le « : » ou le « ou » agit comme un signe égal (=), transformant le nom propre (prestigieux) en une réalité dérisoire ou monstrueuse. '''La concision percutante :''' Chaque entrée est une caricature instantanée. Nietzsche pratique ici l'art du portrait-charge : il isole un trait saillant (la moraline, le style, la psychologie) et le grossit jusqu'au grotesque. '''Le rythme :''' La succession rapide des noms crée un effet de mitraillage. Il s'agit d'un « jeu de massacre » intellectuel où les idoles tombent les unes après les autres sans avoir le droit de réponse. ==== II. Analyse détaillée des définitions (Les « Impossibilités ») ==== L'aphorisme s'intitule « Mes impossibilités » (''Meine Unmöglichen''). Ce possessif « Mes » souligne d'emblée qu'il s'agit d'une physiologie du goût : ce sont les corps étrangers que l'organisme de Nietzsche ne peut digérer. ==== 1. Sénèque : « ou le toréador de la vertu » ==== (''Seneca: oder der Toredor der Tugend'') '''L'image :''' Le toréador est un homme de spectacle. Il ne tue pas pour se nourrir, mais pour la mise en scène du danger maîtrisé. '''L'analyse :''' Nietzsche accuse le stoïcisme de théâtralité. Sénèque ne pratique pas la vertu par nécessité intérieure, mais pour la « pose ». Il y a une artificialité dans la sagesse stoïcienne, qui est une gymnastique de l'orgueil : esquiver les coups du sort (le taureau) avec élégance pour susciter l'admiration. C'est une vertu d'apparat, une vertu du spectacle plutôt qu'une vertu authentique. ==== 2. Rousseau : « ou le retour à la nature ''in impuris naturalibus'' » ==== (''Rousseau: oder Rückkehr zur Natur in impuris naturalibus'') '''Le jeu de mots :''' ''In puris naturalibus'' signifie « dans le plus simple appareil » (nu). Nietzsche ajoute le préfixe ''im-'' (impur). '''L'analyse :''' Rousseau prétend revenir à une « Nature » originelle et bonne. Nietzsche rétorque que ce retour est en fait une régression vers la « crasse » (''impuris''). La nature de Rousseau n'est pas la nature saine et cruelle (la réalité), mais une nature sentimentale, plébéienne et sale, faite de ressentiment et de laisser-aller moral. C'est le rejet de la discipline culturelle au profit d'une spontanéité douteuse. Le rousseauisme est un culte de l'impureté originelle déguisé en retour à l'innocence. ==== 3. Schiller : « ou le Moral-Trompeter de Säckingen » ==== (''Schiller: oder der Moral-Trompeter von Säckingen'') '''La référence :''' Allusion ironique au poème populaire de Victor von Scheffel, ''Der Trompeter von Säckingen''. '''L'analyse :''' Schiller est réduit à un instrument bruyant (la trompette) qui ne joue qu'une seule note : la Morale. Nietzsche dénonce ici l'idéalisme allemand qui, au lieu de faire de l'art, fait de la prédication. Schiller « embouche la trompette » pour gonfler des idéaux vides (le Beau, le Bien, la Liberté) avec une emphase insupportable. C'est un moraliste qui cache son imposture sous la parure de la poésie. La trompette est l'instrument du bruit vide, de la propagande, non de la vraie création artistique. ==== 4. Dante : « ou la hyène qui versifie dans les tombes » ==== (''Dante: oder die Hyäne, die in Gräbern dichtet'') '''L'image :''' La hyène est un charognard, un animal qui rit et qui fouille les cadavres. '''L’analyse :''' L’attaque est d'une violence inouïe. Dante n'est pas vu comme le grand poète de l'amour divin, mais comme un être animé par la vengeance et la cruauté. L’''Enfer'' est lu comme le fantasme sadique d'un homme qui jouit (comme une hyène) des tortures infligées à ses ennemis, tout en les habillant de beaux vers (« versifie »). C'est la poétisation du ressentiment chrétien. La hyène symbolise la dégénérescence du sentiment ; elle ne rôde pas sur les champs de bataille pour la gloire, mais creuse les tombes pour se repaître des morts. Nietzsche voit en Dante l'archétype de l'artiste qui transforme la haine personnelle en chef-d'œuvre littéraire. ==== 5. Kant : « ou le ''cant'' comme caractère intelligible » ==== (''Kant: oder cant als intelligibler Charakter'') '''Le jeu de mots :''' ''Cant'' (mot anglais) désigne l'hypocrisie religieuse, le langage bigot et affecté. '''L'analyse :''' Nietzsche associe la phonétique (Kant/Cant) pour démasquer le fond de la philosophie critique. Le « caractère intelligible » (concept clé de Kant désignant la liberté nouménale hors du temps) n'est qu'un masque pour cacher le ''cant'', c'est-à-dire le préjugé moral et théologique. Kant construit une forteresse intellectuelle complexe uniquement pour justifier des dogmes moraux qu'il n'ose pas avouer simplement. Toute la machinerie critique kantienne (phénomène/noumène, liberté transcendantale, impératif catégorique) est un camouflage élaboré d'une simple imposture morale. C'est la critique de l'hypocrisie intellectuelle érigée en système. ==== 6. Victor Hugo : « ou le phare de l'océan du non-sens » ==== (''Victor Hugo: oder der Leuchtturm am Meer des Unsinn'') '''L'image :''' Le phare éclaire, mais ici, il n'éclaire que du « non-sens » (''Unsinn''). '''L'analyse :''' Hugo se veut le guide, le prophète, la lumière du siècle. Nietzsche retourne cette prétention : sa lumière ne révèle rien d'autre qu'un océan de vide et de bêtise. C'est la critique du romantisme verbeux, de l'antithèse facile et de la grandiloquence qui simule la profondeur mais qui, au fond, ne veut rien dire. Le phare de Hugo ne guide personne vers la vérité ; il éclaire l'illusion. C'est un décorateur de vide, un maître du bruit sentimental. ==== 7. Liszt : « ou le style courant — après les femmes » ==== (''Liszt: oder die Schule der Geläufigkeit — nach Weibern'') '''Le double sens :''' ''Schule der Geläufigkeit'' (École de la vélocité) fait référence aux exercices de piano de Czerny (maître de Liszt). Mais « courir » (''laufen'') signifie aussi « courir après ». '''L'analyse :''' Liszt, le virtuose absolu, est réduit à un séducteur de salon. Sa virtuosité technique n'est pas au service de la musique, mais au service de sa propre vanité pour conquérir le public féminin. L'art devient un moyen de séduction érotique et mondain. Nietzsche voit dans le virtuosisme listzien une absence de substance : c'est de la pure agilité mécanique, un show, une technique qui se donne à voir plutôt qu'une création de formes musicales durables. Le musicien devient un coureur, un fuyant constant après l'effet et l'admiration. ==== 8. George Sand : « ou ''lactea ubertas'', soit : la vache laitière au "beau style" » ==== (''George Sand: oder lactea ubertas, heißt: die Milchkuh mit "schönem Stil"'') '''La référence :''' ''Lactea ubertas'' (abondance lactée) est une expression de Quintilien pour louer la richesse du style de Tite-Live. '''L'analyse :''' Nietzsche prend l'expression au pied de la lettre : « lait ». George Sand devient une vache laitière. Il critique ici le style coulant, abondant, trop nourricier, trop maternel et sentimental de Sand. C'est une écriture qui manque de nerf, de dureté masculine ; c'est du « lait », pas du sang ni du feu. Le « beau style » est ici synonyme de banalité décorative. Sand représente la féminisation de la littérature, l'invasion de la sensibilité douce et débilitante. La vache laitière est un animal docile qui ne pense qu'à satisfaire les besoins des autres ; c'est l'image même de la servilité créatrice. Sand écrit pour nourrir, pour consoler, pour remplir le vide sentimental de ses lecteurs. C'est une littérature de lait maternel, pas une littérature de puissance. ==== 9. Michelet : « ou l'enthousiasme en bras de chemise » ==== (''Michelet: oder die Begeisterung im Rockärmel'') '''L'image :''' « En bras de chemise » évoque le peuple, le travailleur manuel, mais aussi le laisser-aller, le manque de tenue. '''L'analyse :''' Michelet est l'historien du peuple et de la Révolution. Nietzsche moque son style fiévreux, sentimental, populiste. Michelet « transpire » l'émotion ; il manque de la froideur et de la distance aristocratique nécessaires à l'analyse historique. Son enthousiasme est vulgaire, brut, sans retenue. C'est un historien qui oublie la rigueur pour se laisser submerger par la passion démocratique. L'image des « bras de chemise » renvoie à l'homme qui a retiré sa veste, qui est prêt au combat banal de la plèbe, non à la réflexion méditative du savant aristocratique. ==== 10. Carlyle : « ou le pessimisme après une mauvaise digestion » ==== (''Carlyle: oder der Pessimismus als zurückgetretene Mahlzeit'') '''L'analyse physiologique :''' ''Zurückgetretene Mahlzeit'' signifie littéralement un repas qui remonte (reflux, indigestion). '''L'analyse :''' Thomas Carlyle, penseur du « Culte des Héros », est souvent vu comme un précurseur de Nietzsche. Nietzsche le rejette violemment ici en réduisant sa vision du monde à un problème gastrique. Le pessimisme de Carlyle, sa colère contre le monde moderne, n'est pas une force intellectuelle, mais le symptôme d'un corps malade, d'une dyspepsie. Il ne pense pas, il éructe sa souffrance physique. C'est une critique brutalement physiologique : Carlyle est malade du ventre, et ce mal du ventre le rend pessimiste. Il confond un malaise organique avec une sagesse philosophique. Sa vision sombre du monde n'exprime pas une profondeur de pensée, mais une incapacité biologique à digérer la réalité. ==== 11. John Stuart Mill : « ou la clarté blessante » ==== (''John Stuart Mill: oder die abträgliche Klarheit'') '''Le concept :''' La clarté est généralement une vertu philosophique. Ici, elle est ''abträglich'' (nuisible, préjudiciable, ou littéralement « qui ôte quelque chose »). '''L'analyse :''' Mill représente l'utilitarisme et l'empirisme anglais. Sa clarté est celle de la platitude. À force de vouloir tout expliquer rationnellement et « utilement », il supprime la profondeur, le mystère et la complexité tragique de la vie. C'est une clarté qui appauvrit le monde, une lumière de néon blafarde qui tue les ombres nécessaires. Mill veut tout clarifier, tout réduire à des formules simples (le principe d'utilité, le calcul des plaisirs et des peines). Cette clarté est « blessante » parce qu'elle blesse la vie elle-même, parce qu'elle tue l'ambiguïté créatrice. C'est une pensée qui embellit le vide en l'appelant clarté. ==== 12. Les frères de Goncourt : « ou les deux Ajax en lutte avec Homère (Musique d'Offenbach) » ==== (''Les frères de Goncourt: oder die beiden Ajax im Kampf mit Homer, Musik von Offenbach'') '''La référence mythologique et musicale :''' Ajax est un héros grec tragique et puissant. Offenbach est le maître de l'opérette légère et parodique. '''L'analyse :''' L'image est celle d'un décalage burlesque. Les Goncourt, représentants du réalisme et de l'impressionnisme littéraire, se croient des géants (Ajax) luttant pour le grand Art (Homère). Mais cette lutte est une farce (Offenbach). Leur prétention au style « artiste » et leur obsession du détail maniaque sont ridicules. Ils miment la grandeur tragique dans un contexte de légèreté parisienne décadente. Les Goncourt incarnent le culte du style, de la préciosité, du détail exquis ; mais tout cela est une affectation sans fond, une danse d'Offenbach sur les ruines de la vraie tragédie grecque. C'est le triomphe du superficiel sur le profond, du joli sur le grand. ==== 13. Zola : « ou la joie de puer » ==== (''Zola: oder die Freude am Stinken'') '''L'olfaction :''' Nietzsche termine par le sens le plus primitif. '''L'analyse :''' Le naturalisme de Zola prétend décrire la vérité sociale. Nietzsche n'y voit qu'une perversion pathologique. Zola ne décrit pas la misère par compassion ou souci de vérité, mais parce qu'il prend plaisir (''Freude'') à la saleté. C'est une critique de la fascination moderne pour le laid, le bas et le sordide. L'artiste naturaliste est celui qui jouit des mauvaises odeurs de la société. Nietzsche utilise le vocabulaire olfactif qui est le plus direct, le plus physiologique : la ''Stinken'' (la puanteur). Zola ne crée pas, il ''flaire''. Il est animé par un instinct de fouille, comme la hyène dantesque. C'est une dégénérescence du sens esthétique qui a appris à trouver de la beauté dans la laideur extrême. ==== III. Synthèse thématique : Ce qui est visé ==== À travers ces treize « coups de marteau », Nietzsche vise trois grandes maladies de la culture : '''1. L'histrionisme (La pose) :''' Sénèque, Schiller, Hugo, Liszt. L'art et la pensée deviennent du théâtre, du bruit, de la séduction fausse. C'est le mensonge du style. La vertu devient une parade, la poésie devient du bavardage, la musique devient du spectacle mondain. C'est l'essence de la décadence : préférer l'apparence à la réalité, le geste à la substance. '''2. La plèbe (Le bas) :''' Rousseau, Sand, Michelet, Zola. C'est l'invasion de la vulgarité, du sentimentalisme démocratique, de la « crasse » physique ou morale, de la sympathie pour ce qui est faible ou sale. C'est le renversement des hiérarchies : les faibles au pouvoir, la médiocrité à la place du génie, la vache laitière au lieu de l'aigle. C'est l'égalitarisme qui pourrit la culture en prêchant la dignité des bas instincts. '''3. Le ressentiment (La haine de la vie) :''' Dante, Kant, Carlyle, Mill. C'est la pensée qui naît de la vengeance, de la maladie (indigestion), de l'hypocrisie morale (''cant'') ou du calcul froid (utilitarisme). C'est la vengeance de ceux qui n'ont pas de puissance ; ils la compensent par des systèmes moraux élaborés qui condamnent la vie au nom de valeurs supposément supérieures. ==== IV. Les trois registres du style satirique ==== Nietzsche utilise trois stratégies rhétoriques distinctes : '''Le zoo moral (images animales) :''' Sénèque le toréador, Dante la hyène, Sand la vache laitière. Ces images animalières visent à « naturaliser » le défaut, à montrer qu'il s'agit d'une dégénérescence de la nature elle-même, non d'une simple erreur intellectuelle. '''Le jeu de mots (la phonétique) :''' Kant/Cant, Liszt/courir après. Le langage révèle la vérité cachée. Le son ''Kant'' résonne en ''Cant'', comme si la parole elle-même démasquait le mensonge du philosophe. C'est de la philosophie par l'homophonie. '''L'oxymore grotesque (l'association absurde) :''' « Le pessimisme après une mauvaise digestion », « les deux Ajax avec la musique d'Offenbach ». Nietzsche juxtapose le sublime et le trivial, le héroïque et le digestif, pour montrer l'effondrement de la grandeur en décadence. ==== V. La cible ultime : La modernité comme décadence physiologique ==== Ces treize cibles ne sont pas des choix arbitraires. Elles représentent la ''cartographie de la décadence européenne au XIX<sup>e</sup> siècle''. * '''Les Anciens décadents''' (Sénèque, Dante) : Le stoïcisme vide, le catholicisme sadique, les premiers symptômes du ressentiment chrétien. * '''Les Modernes idéalistes''' (Kant, Schiller, Hugo) : La philosophie critique qui cache le dogmatisme, le Sturm und Drang sentimental, le romantisme verbeux. * '''Les Contemporains naturalistes''' (Sand, Zola, Goncourt) : L'invasion démocratique du goût, l'obsession pour le laid et le bas, la féminisation de la culture. * '''Les penseurs de la décadence moderne''' (Rousseau, Carlyle, Mill) : La plèbe adorée, le pessimisme malade, le calcul utilitariste qui calcule la vie au lieu de la vivre. Nietzsche propose implicitement une ''généalogie du mensonge culturel'' : du stoïcisme antique au naturalisme moderne, c'est une seule et même force : la '''haine de la vie''', l''''incapacité à affirmer''', le '''ressentiment envers la puissance créatrice'''. ==== VI. Ce que cet aphorisme révèle sur la méthode nietzschéenne ==== Cet aphorisme incarne la ''philosophie du coup de marteau'' annoncée dans le sous-titre du ''Crépuscule des Idoles''. '''Pas de développement discursif :''' Nietzsche ne ''prouve'' rien. Il ''énonce''. L'aphorisme repose sur une autorité pré-rationnelle : c'est une voix qui parle, qui tranche, qui refuse le droit à la contradiction. C'est la parole d'un maître, pas d'un professeur qui débattrait. '''L'absence de « pourquoi » :''' Le lecteur n'a pas le droit de demander « pourquoi Sénèque est-il un toréador ? ». La formule s'impose comme une évidence physiologique. C'est un jugement qui émane du goût, de l'instinct, non de la raison. C'est pourquoi l'aphorisme ''exige du lecteur'' une transformation personnelle : il faut acquérir le même goût, la même physiologie, pour ''comprendre'' pourquoi Hugo est un phare vide. '''L'acte de lecture comme acte de sélection :''' Nietzsche divise le monde en deux : ceux qui peuvent lire ces aphorismes (les « rares ») et ceux qui ne peuvent pas (la masse). C'est un acte de séparation, de ''tri'' dans l'humanité même. Accepter les jugements de Nietzsche, c'est accepter d'être du côté des « esprits forts » contre la foule décadente. ==== VII. Structure conceptuelle : Les « impossibilités » comme critère hiérarchique ==== L'intérêt suprême de cet aphorisme est qu'il ne présente pas les cibles comme des « ennemis » à combattre ou à « réfuter ». Ce sont des « impossibilités » — c'est-à-dire : '''ce que je ne peux pas digérer'''. Cette formulation transforme la critique philosophique traditionnelle en critique ''physiologique''. Il ne s'agit pas de dire « Hugo a tort » (ce qui impliquerait un débat rationnel possible). Il s'agit de dire « Hugo me rend malade, mon corps le rejette ». C'est un énoncé d'incompatibilité biologiquement insurmontable. Cette critique physiologique implique que '''la vérité n'est pas une affaire de raison, mais de puissance vitale'''. Les treize auteurs sont décadents non parce qu'ils se trompent, mais parce que leur ''constitution même'' est maladive. Ils sont l'expression d'une humanité en déclin, d'une vie qui a perdu sa capacité à affirmer et créer. {{AutoCat}} jj606plkn309iouoxmrqqoptusnfb82 Catégorie:Discipline philosophique 14 83477 764926 758691 2026-04-25T06:26:56Z PandaMystique 119061 764926 wikitext text/x-wiki [[catégorie:Philosophie|*]] 0s8r2at910cnqbforuhciypdh8s5dgx Essai pour un modèle de psychisme objectif 0 83689 764929 762012 2026-04-25T07:11:38Z ~2026-25221-73 123610 /* Confidence */Quelques corrections de fautes d'orthographe et ponctuation 764929 wikitext text/x-wiki {{Page de garde|titre=Le miroir brisé|description= ''Essai pour un modèle de psychisme objectif'' Docteur Denis-Serge Clopeau |cdu= * {{CDU item|6|61}} |versions= {{Moteur}} {{Version imprimable}} {{version PDF|Miroirbrisé.pdf}} }} [https://upload.wikimedia.org/wikipedia/commons/6/65/Miroirbris%C3%A9.pdf cf version pdf avec sa page de remerciements] Le titre de l’essai sera ressenti peut être comme intrigue pour ce qui est du miroir brisé et c’est vrai que son explication ne surgira que dans les dernières lignes de cet essai. En ce qui concerne le sous titre «essai pour un psychisme objectif» il sautera aux yeux comme une prétentieuse ambition. Comment un domaine aussi vaste, mystérieux pourrait s’imposer à l’esprit sans recours à discussion ou interprétation. Je partage cette critique et chacun conclura cette petite provocation sur son propre jugement. Le vrai contenu de l’essai tend à décrire les rouages du psychisme comme un mécanisme de construction d’objets psychiques, mais aussi d’identification de leurs attributs, de leur relation dans le domaine conscient et subconscient autant dans l’état mental qualifié de sain que dans celui de pathologique. A toute fin utile vous remarquez que les pages de gauches (dans la version PDF) laissent tout la place pour disposer du moyen immédiat de toute critique et annotation. Personnellement j’ai toujours regretté de ne pas disposer de ce simple moyen d’appropriation de la chose lue. Remercions les inventeur du Wiki d'offrir le moyen de discussion individuelle ou collective, une vrai révolution dans le partage des connaissance ou des imaginaires. == Sommaire == {{/Sommaire}} == Confidence == D’où je parle, d’où je pars …. ce qui manque souvent au lecteur et qui pourtant est indispensable pour éclairer sa critique. Voici mes réflexions dans un domaine que j’explore attentivement, depuis un instant précis par ses circonstances, mais dont la date n’est pas définie à un an près. Le point de repère est l’instant extraordinaire du début de cette expérience, où la révélation, s’est produite alors que je passais juste sous la frondaison d’une glycine en fleur et à l’odeur merveilleusement envoûtante, débordant des grilles d’un jardin, dans une petite rue d’un des 3 parcours me ramenant du lycée vers 17 h, au sortir du cours du musique. Au 3{{ème}} étage de mon lycée Lakanal où dans une salle légèrement mansardée exposée plutôt à l’ouest et aux carreaux du 19e siècle à faces non parallèles déversant en arcs en ciel le soleil déclinant, nous avions achevé le cours par l’écoute sur le tourne disque portable modèle éducation nationale , d’une musique qui m’avait emporté déjà assez loin. J’avais 13 ou 14 ans et j’étais souvent seul, aussi la contemplation musicale était mon rituel le plus fréquent. À l’heure où j’écris, dans ma 67{{ème}} année, l’envie de livrer mon expérience me poursuit depuis la soixantaine. Ma vie professionnelle m’a contraint de bon gré à approfondir mes réflexions de jeunesse, et à les organiser pour venir en aide à mes patients dont je recevais régulièrement les plaintes, les souffrances, les confidences. J’ai aussi bien sûr profité des acquis de mes études initiales qui ont été longues et qui ont connu de nombreux échecs avant le couronnement final dont le thème était très orienté vers la haute technologie, autre de mes sujets d’intérêt. Pour en revenir au sujet de l’essai il est notoire que si je n’ai réussi la majorité de mes certificats qu’à la deuxième présentation, parmi mes succès immédiats il y a eu le {{g|bloc}}. Dans ces années 1975, ce bloc, avait mauvaise réputation dans toutes les promotions : énorme, touffu, inutile, incompréhensible, baratin etc etc. Je l’ai donc abordé avec appréhension bien que déjà prévenu contre les préjugés. J’ai lu l’énorme polycopié de plus de 1000 pages, dont beaucoup de photocopies de livres en réduction, qui parlait de psychiatrie avec sa symptomatologie, sa nosologie, ses thérapies dont quelques stratégies de soutien psychologique vouées à intégrer l’exercice médical général, de quelques éléments de droits … OUF. Effectivement j’ai du m’y reprendre à plusieurs fois pour comprendre et pour m’inscrire en faux contre les préjugés dévalorisants, courants dans les rangs des collègues. Je me rappelle avoir rempli quelques blancs et versos libres, avec mes remarques personnelles. Le jour de l‘ épreuve, j’ai choisi parmi les thèmes libres celui qui consistait à expliquer une situation de souffrance psychologique décrite de façon assez littéraire. J’y ai introduit mes concepts d’ontogénie, d’{{g|angoisse primitive résolue par l’angoisse conceptuelle mais dont l’invasion menace devant toute situation inconnue}}, en fait une part de ce je développe dans la suite. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/modèle épistémologique|un modèle mais à comprendre au sens épistémologique]]</blockquote> Ma note, et avec une grande surprise, m’a placé en tête du palmarès ce qui m’est arrivé dans deux matières seulement. Fort de cette onction universitaire je me considérais assez compétent pour assurer une aide efficace aux patients. Oui bien sûr, il faut excuser sa niaiserie à la bonne volonté ! Dans les cas les plus académiques je remerciais mes maîtres de m’avoir donné les idées claires sur la distinction entre psychose et névrose et leurs typologies, pour savoir décider d’adresser les patients vers les confrères psychiatres, de façon documentée, ou prescrire le soutien psychologique. Mais j’ai vite constaté les limites des compétences à ma disposition et aussi celles des autres soignants en matière de soutien psychologique. Aussi je suis reconnaissant à deux stages spécifiquement dédiés à la communication et à deux autres à la Programmation Neurolinguistique qui m’ont ouvert de nouveaux horizons. De ces sources variées j’ai produit après 1 an et demi d’appropriation en 1994 (ma véritable installation comme généraliste commence en 1990) mon propre protocole empruntant à la PNL en complétant d’apports neurophysiologiques mais excluant toute implication physique ou intimiste dans les processus «d’ancrage», laquelle je réfute sous le qualificatif de «posture du gourou». Ce dernier point est crucial de mon point de vue critique, face à toute démarche psychothérapeutique qui donne un rôle interventionniste au thérapeute. Dans certaines écoles visant un public de « manager », de vendeurs, de cadres militaires etc, vous trouverez sur internet des permis d’intrusions, d’assujettissements, de dominations, de manipulation, aussi odieux dans leur forme que dans leurs objectifs et maléfiques pour l'autonomie mentale des personnes ciblées. Je recommande donc la plus grande circonspection en la matière. Mon protocole par contre, suit un schéma essentiellement pédagogique, sécurisé par une hiérarchie des objectifs clairement exposés aux patients. « Nous allons commencer par une leçon de chose puis des exercices visant à vous permettre d’évoquer vos moments préférés, sereins et néanmoins banals sans valeur intime particulière ». « Si le besoin d’aborder avec moi des souffrances persiste, ce sera après un entraînement et une maîtrise que vous aurez acquise avec mon aide d’abord sur des situations banales….. je n’aime pas l’odeur de l’eau de javel, où le bruit des tondeuses à gazon ». Cette prévention contre un abord thérapeutique direct d’une souffrance souvent exprimée clairement par le patient comme : « enfant j’ai été battu par mes parents, ou j’ai perdu un enfant, j'ai été violé , mon conjoint me trompe, ou mon supérieur hiérarchique me harcèle&#x22; etc sera expliqué dans l’essai. Donc la première motivation est de fournir un modèle clair, et donc j’espère facilement critiquable des fonctions psychiques, autant pour une appropriation personnelle par le lecteur en donnant des pistes pour l’ introspection, que pour aider à la compréhension d’autrui. Le souffrant pourra donc aussi y trouver un confort dans le «connais toi même». Enfin mes consœurs et confrères qui reconnaîtront la problématique soulevée y trouveront au besoin une formulation soumise à leur propre appropriation et critique. Abordons les concepts, car il s’agit d’un modèle qui sort du cadre académique en tout cas à mon niveau de connaissance . Je tente de suivre un plan progressif qui vise à expliquer parallèlement les mécanismes conscients et subconscients, ce qui amène à quelques redites, qui je l’espère profiteront à une pédagogie de la répétition dont j’ai moi même bien profité. Je m’appuie sur des connaissances dont les validations n’ont pas toutes le même niveau. Je suis bien conscient que mon écrit pêche par un manque notoire de bibliographie, il ne s’agit que d’un essai et les lecteurs sont invités à laisser leur esprit critique en éveil. Pour pallier ce défaut, je compte beaucoup sur la curiosité du lecteur pour le butinage également critique d’internet que l’époque moderne nous offre. Comme je ne pratique pas la fausse modestie, je dis aussi que ce modèle contient des outils qui ont profité à beaucoup de patients qui m’ont consultés dans les circonstances variées de ce merveilleux métier de médecin généraliste. Je me rappelle bien sûr de quelques échecs non-surmontés sans doute car la présentation didactique déstabilise ceux pour qui, le psychisme doit nécessairement être abordé comme un domaine obscur et mystérieux, sur un divan dans la peine et l’ombre. C’est hélas une conviction que deux consultations ne suffisent pas toujours à ébranler d’autant qu’elle est fortement diffusée dans le corpus des certitudes socialement admises. Voilà, à ceux qui poursuivent encore la lecture, je conseille la plus grande décontraction. Il me semblerait étonnant que j’arrive à me faire comprendre à première lecture. D’autant que malgré un effort sincère, je n’ai pas pu éviter quelques va et vient et autres digressions qui j’espère prendront leur juste place dans l’esprit de ceux qui reliront les passages {{g|du coq à l’âne}}. == L’angoisse primitive, l’ontogénie, le JE , l’angoisse conceptuelle et subconsciente, le premier monde construit. == Commençons par l’explication de ces termes dans l’acception que je me suis forgée au fil de mes introspections et de la modélisation que j’ai construite pour aborder les phénomènes psychologiques. J’ai eu très jeune, cette intuition «que ce qui est, n’est qu’un cas particulier de ce qui peut être», et j’en fais même une devise de mes réflexions philosophiques. Toutefois ce qui «est» n’est pourtant pas fortuit et répond sans doute à un objectif justifié. Cette intuition est devenue une révélation assez mystérieuse, en quelques pas sous la frondaison de la glycine. Une question, un oukase presque s’est imposé à ma jeune conscience. «acceptes tu l’inconnu, l’incertitude, sans garantie de profit quelconque, ou bien décides tu de t’y soustraire et d’en perdre la curiosité»?. Ce jour là, j’ai choisi la voie angoissante qui m’a accompagné pendant 150 mètres jusqu’à un sursaut lorsque mon chemin à croisé le train de la ligne de Sceaux dans son prolongement jusqu’à Robinson, à cet instant où je me trouvais sous le pont métallique en poutre H. Voilà c’était fait, je connaissais le chemin qui s’ouvre aux curieux, entre le fait et le possible, entre le certain et le tout. Cette occasion rare de reconnaître l’angoisse primitive, pré-conceptuelle, que je pose comme instigatrice de notre construction, notre ontogénie psychique m’a été donnée dans ces quelques minutes. Cette expérience m’a fait connaître un cheminement généralement profondément occulté dans notre subconscient. C’est un objet inclassable par essence, puisque l’inconnu qui entoure le nourrisson, ne trouve en lui aucune classe préétablie. Cette dimension m’accompagne depuis, je la respire. Je la fréquente chaque jour ou presque, elle m’est familière. Voilà en tout cas la première expérience qui m’a valu d’entrevoir cette forme d’angoisse très particulière, sans doute insupportable dans une situation commune mais qui ce jour là, dans la méditation qui m’accompagnait souvent, m’a semblé «naturelle» bienveillante. Depuis cette familiarité l’a rendue confortable, voire essentielle à mon bien être, en prenant la forme d'une curiosité fondamentale. Les années passent, cette découverte ontogénique, ne s’est jamais éloignée, m’a aidé en cas de difficulté où les échecs, déconvenues, souffrances ont croisé ma route. Et je me suis mis à introspecter continûment mon fondement psychologique. Puisque que la personne que je pense être, n’est qu’un cas particulier de ce qu’elle pourrait être, comment s’est t’elle formée tout de même ? Sans me rappeler précisément comment ma réflexion s’est condensée en la matière, la forme qu’elle a fini par prendre m’a paru tellement limpide que j’en fait un fondement solide. Et j’en viens au modèle décrit dans la suite. La première heure de vie est passionnante à observer. Hélas peu de personnes ont cette occasion avec une certaine distance. Ma première fonction étant l’oxyologie, nous disons aujourd’hui urgentiste, médecin de Samu, vous le devinez ce loisir de la distance n’a pas été mon lot quotidien. Au contraire dans mes interventions comme intervenant dans l’urgence néonatologique au lit de la parturiente et de la couveuse du prématuré, réparties dans les petites maternités des Côtes d’Armor et principalement la nuit. Aussitôt arrivé, obtenir le dossier, les dernières info depuis l’appel, la préparation du plateau technique, les rappels des protocoles à l’équipe, tout ça dans le meilleurs des cas. Souvent c’était beaucoup plus direct, sur la sonde d’aspiration, l’épicrânienne, le capteur de PO2 trans-cutané, l'intubation, l'ambu, le ventilateur, les lampes à infrarouge, le scope etc. . Mais dans les meilleurs des cas, c’était un moment d’émerveillement, tout était fait par l’équipe, la nature avait bien fait les choses. Quelques compliments rassurant aux heureux parents et je pouvais prendre un peu de distance. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/néonatologie et angoisse primitive|la néonatologie comme indice de l'angoisse primitive]]</blockquote> Fréquemment dans ces cas le bébé, se met assez rapidement à crier, il s’agite, il fronce, même sur la chaleur du sein de sa mère. Bon allez le ''dextro'' est un peu bas et selon les circonstances il va recevoir la solution à son malaise. Au mieux le sien de la mère où déjà suinte le précieux colostrum ou en cas d’empêchement technique quelques ml de glucosé à 10% dans un biberon à bonne température. Mais le voilà qui crie de plus belle, le contact du téton ne le calme absolument pas, les premiers jets de lait déclenchés par la libération hypophysaire de l’ocytocine déclenchée par les cris, ne le calment pas non plus. Le réflexe de déglutition fonctionne, mais même après les premières déglutitions l’enfant n’est toujours pas satisfait! Que ce passe t’il? Ce nourrisson serait t’il démuni du moindre raisonnement? Ben oui bien sûr, nous savons depuis longtemps que l’être humain fait partie des mammifères les moins équipés à la naissance. Cette souffrance du nourrisson dans sa première heure de vie est démonstrative de «l’angoisse primitive». Sait il ce qu’il est entrain de vivre ? ...non. En rien, ni la cause, ni le moyen, ni même le résultat ne lui sont connus. Voilà ce qu’est {{g|l’angoisse primitive}} absolument universelle pour les êtres humains en construction. Cette angoisse va être le climat de toute cette construction jusqu’à ce que dans chaque situation, l’enfant, puis l’adolescent et le jeune adulte ait pu transformer la situation inconnue en objet conscient ou et subconscient capable de répondre à l’urgente question du devenir et de l’invariant des réponses. Le deuxième jour le nourrisson est déjà beaucoup plus «raisonnable», la mémoire des séquences de ses premières heures le dispense de cris inutiles, et fatigants. Dès qu’il sent le lait dans sa bouche, son parti est pris, il tête avec ardeur. Puis le troisième jour, les cris cessent dès que l’odeur du sein se rapproche. L’olfaction, un des canaux les plus précoces et puissant est à l’œuvre avec une connexion mono axonale directe au rhinencéphale du cerveau primitif lequel est connecté à de multiples régulateurs physiologiques. Il est même possible de constater qu’un linge imprégné de l’odeur de la mère aura un effet calmant pour l’impatience du nourrisson…. Transitoire car bientôt la supercherie est démasquée par l’enfant et pas question de le tromper sur ce coup là. Plus tard avec le bruit d’un biberon agité, la voix des parents, et avec la première détection des images floues, l’apaisement sera de plus en plus anticipé, il sera même possible d’observer les traits, le chant, de la réjouissance avant la satisfaction réelle du besoin. Quelque chose de nouveau, une acquisition s’est donc opérée. Un observateur attentif voire musicien notera que les cris et pleurs d’un bébé, d’un enfant changent très rapidement lors de ses premières «frustrations» , apprentissage. Je suppose une connexion neurochimique complexe entre l’«aire du cri» et celle des objets psychiques forgés hors de la gangue primitive, de l'angoisse primitive, par les coups des épreuves successives. La rapidité fascinante de ces acquisitions doit nous interpeller. Si ce petit cerveau encore immature fournit un tel effort c’est que «l’angoisse primitive» est sans doute insupportable. Il lui faut un palliatif immédiat. La construction d’objets capables de la circonscrire, de la prévenir, de la sublimer. Alors «l’angoisse primitive» s’effacera devant une angoisse beaucoup plus acceptable, qui sera «l’angoisse objective et même conceptuelle», celle qui tient dans les mots parfois les plus effrayants certes mais des mots connus, des objets psychiques reproductibles, prévisibles, invariants. Cette construction urgente, indispensable de tels objets finissent par former un monde, que je qualifie de «premier monde construit». Passez le film d’une existence et vous trouvez que ce monde touche à tout. D’abord s’identifier comme autonome de l’environnement. Le haut, le bas, la bouche, le ventre, les bords du berceau, les images «utiles», le déplacement, éviter de se cogner, donc pouvoir distinguer le JE physique du NON-JE physique. Bien sûr toute situation totalement inconnue tombe sous le joug de «l’angoisse primitive» et devra être «résolue» dans l’urgence. Ce premier monde construit prend donc une valeur immense, le seul îlot viable dans un océan d’inconnus, pas question de le lâcher ou même de le mettre en doute, sinon c’est revenir à la case départ, la terrible «angoisse primitive». L’ontogénie humaine est donc assemblée par une forge infernale et universelle. Bien entendu les objets construits dans l’urgence sont rapidement influencés par l’environnement général et social en particulier. La place de la personne, du «JE» lui même dans ce «premier monde» construit connaît donc des formes différentes et en partie déterminées par la manière dont les situations inconnues se présentent. C’est déjà l’éducation. Ce qui importe ici, c’est de se rappeler que si l’on admet un déterminisme par l’éducation, il n’est toutefois pas possible de réduire ce «JE» et ce «premier monde construit» à l’action éducative. La caractéristique essentielle de ces objets est leur justification vitale. C’est la contrainte de l’ontogénie humaine. Il faut aboutir à tout prix à un premier monde efficace pour faire disparaître l’angoisse primitive au profit d’angoisses conceptuelles: peur de se cogner, de manquer, de mourir etc. Ainsi l'être humain trouve sa sérénité. Ce premier monde construit sera donc ce qui «est» et toute remise en cause de son monopole sera anéantie par l’interdiction de se RE-trouver devant l’angoisse primitive. C’est la raison pour laquelle, poser que ce qui «est» n’est qu’un cas particulier des possibles est plutôt rejeté dans les conversations habituelles. C’est là notre handicap ontogénique, la limite intrinsèque de l’imagination. S'il est intellectuellement possible de poser cette proposition, elle sera écartée par notre filtre psychologique préconscient, pour maintenir les invariants du premier monde construit. &#x22;Je ne saurais mettre de distance avec ces objets construits «vitaux» qu’à la condition d’une sécurisation exceptionnellement réalisée et d’une curiosité téméraire&#x22;. Dans les autres cas une discussion philosophique effleurera la question existentielle, mais ne modifiera pas les croyances du JE. On dit souvent la nature revient au galop. Il faut entendre que le premier monde construit imposera son monopole car il est lié dans le subconscient à la pérennité du JE et de ses invariants, de son intégrité. Une fois le JE constitué dans le premier monde construit, l’angoisse primitive est résolue. Puis l’être social s’agite dans les relations avec d’autres personnes et un environnement moins immédiatement vital, où ce sont des angoisses conceptuelles qui sont motrices de la construction d’objet. Les angoisses conceptuelles peuvent découler d’une construction personnelle, peur des araignées mais elles sont surtout socialement transmises par le langage social. En exemple la peur de maladie transmissible est particulièrement élaborée, conceptuelle, mais implique le JE et le SOI ce qui fait la difficulté d’une bonne appropriation. [[Fichier:Ontogénie.png|vignette|schéma illustrant le processus ontogénique dans "le modèle de psychisme objectif"]] Jusqu’à présent nous avons parlé d’un JE élaboré sous la contrainte d’une «angoisse primitive dont l’ampleur dépend de l’environnement. Par exemple les études psychosociologiques rapportent que les enfants qui ont grandi dans un climat de violence familiale, ou une guerre ont une personnalité fortement perturbée. Lorsque «l’angoisse primitive» est exacerbée par la violence, la constitution du JE s’arrête se bloque. Il se produit un hiatus constitutionnel. Par exemple l'enfant victime de maltraitances sexuelles ne pourra pas construire ses objets psychiques relatifs à son ontogénie sexuelle. Ainsi nous comprenons que l’exposition de la personne à un évènement sexuel la confrontera d’emblée à «l’angoisse primitive». Ces situations douloureuses entraînent une forme d’évitement, ou autre réaction insolite. Son JE n’aura pas pu se construire sur cette inconnue qui lui a été infligée violemment. Alors c’est le hiatus qui encoche la courbe de croissance du JE. Nous verrons les conséquences de ces hiatus de façon quasiment graphique lors des processus de régressions pour fusion qui sont sans doute les phénomènes les plus complexes jalonnant la vie normale d’un être humain. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/JE et NonJE|JE et NonJE ligne de front contre l'angoisse primitive]]</blockquote> == les outils et les objets == L’homme est souvent décrit par ses capacités, ses acquis. L’appropriation, la fabrication d’outils, qui sont aussi des objets mais avec la capacité de transformer d’autres objets font partie de toutes les fresques paléontologiques . Ces outils ne sont pas toujours matériels. En arithmétique l’addition par exemple comme opérateur est un objet symbolique, agissant sur des objets opérandes. C’est un objet-outil symbolique conscient. Ajoutons que nous verrons aussi des objets outils subconscients produisant des «opérations subconscientes». Chacun pratique cette interdépendance avec l’outil qui étend l’être jusqu’à ressentir que sans les outils il n’est plus rien, qu’il perd son image humaine. C’est même plus fort que ça, puisque sans une palette d’outils ce sentiment de dépersonnalisation devient angoissant. La feuille blanche sans crayon, sans gomme, sans «inspiration» est un exemple simple. Cette situation par rapport aux outils est donc générale, des premiers âges, jusqu’au handicap de la vieillesse, des plus anciens métiers aux plus récents avec une relation à l’objet de plus en plus indirecte, complexe, abstraite. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/viol d'enfant viol d'adulte|différence des séquelles dans le cas d'un viol d'enfant et d'adulte]]</blockquote> L’interaction objet / outil est essentielle dans l’appréhension de l’un comme de l’autre. L’objet est associé aux outils qui l’extrait, le façonne, le transporte, et réciproquement, que serait un outil sans destination vers un ou des objets. Et oui Il en va de même par rapport à la construction de notre psyché ! Le nouveau né, dispose déjà de quelques outils. Alors on peut considérer que la sensibilité tactile encore frustre, par expérience successive, l’amène à distinguer son propre corps de l’environnement, puis à hiérarchiser, mémoriser, reconnaître et l’un et l’autre et leur relation, avec une acuité, une anticipation croissante. De l’inconnu émerge le prévisible, puis le sentiment de sécurité, voire de puissance comme sur la simple pâte à modeler. Je renvois ici à mon concept «d’angoisse primitive». Ce mécanisme d’appropriation, de perfectionnement dans l’usage des outils est indissociable de l’ontogénie (constitution du JE) et de la construction du Soi (relationnel, social). Les outils disponibles conditionnent la construction du JE et du Soi. L’homme sort de cette analyse comme un être par essence social. Au delà des premières expériences sensorielles des premières minutes de vie, l’intervention des outils conditionne, rend possible, configure sa personne, son identité, ses acquisitions conscientes et subconscientes par les expériences de l’éducation, ou fortuites, personnelles, inopinées. C’est bien en effet la vie sociale, avec les parents, voisins, école, etc qui fournit les objets outils et donne l’exemple de leur usage, ou de leur mésusage, ou de leur interdiction, et produit les objets en résultant. Il faut entendre que cette définition très large du mot «objet» contient une connexion entre le vécu personnel, intime, et les relations sociales plus ou moins structurées, découlant de l’usage d’outils dans un sens très général. Ce fait explique pourquoi si beaucoup d’expériences humaines sont identiques, elles forment des objets non identiques, divergents, voire incompréhensibles de l’un à l’autre. Selon l’ordre d’appropriation des outils, les objets qui constituent, le JE et le Soi, des uns et des autres seront différents. Il y a donc une grande dispersion des personnes sur un fond universel des mécanismes, donc l'utilité d'une modèle. Voilà sans doute le premier défi de la communication. Par exemple l’empathie qui est très répandue s’appuie sur l’expérience commune et universelle de certaines joies ou souffrances relativement à des expériences très répandues, voire intégrées à l’éducation, comme le doudou, au point que le ressenti est «synchronisé» d’emblée entre l’enfant et les parents premiers initiateurs sociaux. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/outils objets lien symbolique| ouils objets psychiques et liens symboliques]]</blockquote> ''A contrario'' l’incompréhension est reconnue par la société, qui dans le meilleur des cas propose la tolérance et le dialogue pour la dissoudre. Dans ce cas si l’on veut généraliser, c’est l’expérience partagée de la tolérance et du dialogue (des outils) qui débouche sur une empathie, non pas à propos d’un objet commun cette fois, mais secondaire à cette démarche réciproque de la mise en œuvre d’outils. C’est alors cette œuvre commune qui devient l’objet de l’empathie, un objet symbolique, un lien symbolique subconscient. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/cytologie et communication humaine|un comment la cytologie et la physique des échanges membranaires ouvre une réflexion sur la communication humaine]]</blockquote> Les outils sont donc indispensables à la construction des objets dans la définition étendue qui précède, allant du capteur sensoriel cutané, l’outil empathie et le vélo comme exemple d’objet devient à son tour outil. Si nous considérons que la personne est le résultat de la mémorisation d’expériences découlant de son interaction avec l’environnement et de l’usage d’outil, et si ce résultat aboutit à ce Je et ce Soi , comme collection d’objets , alors vient la question de qu’est ce que la liberté? En effet la description ci dessus est mécanique, systématique et pourrait faire douter que la personne humaine dispose de créativité, d’imagination et d’autres facultés auto-génératrices non liées directement à la socialisation. Et pourtant ces facultés ne font aucun doute, c’est donc que d’autres mécanismes existent et dépassent ce cadre. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/sémiologie du hiatus ontogénique|une sémiologie du hiatus ontogénique]]</blockquote> L’empathie met déjà la puce à l’oreille, car les «objets» impliqués dans cette expérience sont les personnes elles mêmes. «l’outil» de cette empathie est en fait une relation symbolique de similitude, d’équivalence, entre des expériences partagées lors de l’ontogénie ou édification du JE. Il y a donc là un outil d’un nouveau genre (ici je référerai volontiers au concept de neurones miroirs, j'interpelle le lecteur pour qu'il partage un lien efficace). Il ne s’agit pas d’une interaction entre une personne et un environnement plus ou moins concret mais cette fois entre deux personnes qui mobilisent leurs acquis ( JE, SOI et leurs objets) par une relation symbolique qui est comme l’outil. C’est donc une interaction purement psychologique. Comme cette interaction est très universelle, elle peut être considérée comme constitutionnelle. Je qualifierai ces objets constitutifs du Je et du Soi de «psychologiques». L’empathie apparaît comme l’ outil psychologique, dont la fonction est d’obtenir, un lien symbolique entre objets subconscients acquis par plusieurs personnes. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/enseignement de l'empathie aux soignants|l'enseignement de l'empathie aux soignants]]</blockquote> Dans le droit fil, la créativité, l’imagination, l’intuition trouvent leur place comme outil agissant à partir de , ou sur des objets psychiques pour en produire d’autres. Et la merveille c’est que l’artiste, le poète ou l’amoureux ou le chercheur traduisent ces relations symboliques en objets «classiques» par des outils usuels pour les exposer aux autres. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/psychisme auto-controlable|l'être humain et son apprentissage de l'auto-contrôle]]</blockquote> == La mémoire, les objets. == Tous les objets psychiques forment t’ils un ensemble homogène comme des bibelots sur une étagère dont l’extrême variété fait abandonner tout espoir de classification? Pour faire simple une distinction entre objets conscients et objets subconscients est assez facile à éprouver. Je propose d’argumenter à propos des différences de types, et de contenu des objets conscients d’une part et subconscients d’autre part. Il va de soi que pour qu’un objet existe il faut qu’il persiste en mémoire. Je propose d’argumenter des points communs et des différences entre les processus mémoriel des objets conscients et subconscients. En même temps on peut reconnaître que le purement conscient et le purement subconscient n’est pas toujours évident. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/premier monde construit et incommunicabilité| retour sur le premier monde construit et les circonstances de l'incommunicabilité]]</blockquote> J’argumenterai que les évocations des objets conscients et les invasions des objets subconscients expliquent l’instabilité mémorielle des uns et des autres. J’illustrerai, l’influence des invasions des objets subconscient dans le préconscient, sur le devenir des objets conscients et des objets subconscients eux mêmes. Avançons dans la définition de ces qualificatifs. Comme exemple simple, les tables de multiplication sont des objets conscients, comme un vélo, une casserole etc. Une caractéristique commune de ces objets, c’est qu’on s’en rappelle, qu’on peut les évoquer facilement, et même les communiquer à autrui. Une certaine familiarité avec soi même, ou des descriptions littéraires permettent de prendre conscience (oui c’est un paradoxe qui va s’éclaircir) que ces objets comportent aussi des attributs subconscients. Juste comme exemple, le vélo est pour bon nombre un rappel profond, de liberté , d’émancipation, de gestion du risque, d’optimisme qui ne revient à l’esprit que dans un état mental particulier, éventuellement recherché. Si les attributs conscients du vélo découlent d’un apprentissage plus ou moins savant, ses attributs subconscients comme l’émancipation assez générale pour déboucher sur une empathie, sont parfois contrariés. Des chutes, non compensées par les soins ou la compassion donnent lieu pour certaines personnes à une association, un lien symbolique: vélo entraîne douleur et échec. Ces attributs subconscients majoritairement partagés comme ici l’émancipation manqueront à l’objet du «malchanceux». C’est un cas fréquent où une empathie éprouvée de façon fréquente, peut se trouver en échec et conduire à un sentiment d’incommunicabilité de la personne «malchanceuse» par rapport à un groupe social majoritairement «chanceux». C’est un domaine où la topographie cérébrale prend un sens fonctionnel, avec son cortège de modulation des neuromédiateurs et des hormones. Les connaissances sur la topographie fonctionnelle cérébrale remontent à des travaux cliniques depuis le 19{{ème}} siècle et sont éclairés par des imageries fonctionnelles alimentant la neuroscience moderne. Ainsi telle aire a été identifiée comme celle du langage, telle autre de la motricité ou de la sensibilité avec une telle précision qu’une sorte de projection dystrophique mais reconnaissable, du corps sur la «coupole» corticale, est décrite comme l{{’}}''homoculus''. Je ne suis pas du tout à jour des recherches en neuroscience, j’en préviens le lecteur qui voudrait trouver ici une quelconque référence en ces domaines. Je recommande la lecture d’articles à jour sur ces questions, à ma connaissance les données des études cliniques anciennes sont plutôt consolidées par la neuroscience actuelle avec une finesse accrue et un champ de recherche de plus en plus vaste comme toujours en science. A noter que les imageries modernes vont jusqu’à contribuer à l’étude des troubles dépressifs, des schizophrénies et bien sûr des démences entre autres. Ces découvertes invitent à une conceptualisation structurée des objets. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/notion de classe d'objets|la notion de classe d'objets et d'outils psychiques]]</blockquote> Puis les études de cas déficitaires ont permis de décrire des syndromes psychiques liés à des altérations topographiquement définies entraînant des tableaux reproductibles, le syndrome frontal, pariétal etc. Mais c’est surtout la grande révolution de la biochimie et de son observation dynamique qui permet un bond considérable dans la compréhension de l’activité cérébrale et y compris des phénomènes psychologiques normaux ou pathologiques. Nous revoilà dans le substratum de l’objet psychique. Le conscient est installé quelque part dans le cerveau et le subconscient ailleurs. Il y a des relations, d’association, des liens fonctionnels, symboliques entre les deux mondes de même qu’entre objets d’un même monde. La lecture d’articles de Wikipédia (pour les plus accessibles) permettra de critiquer ces définitions succinctes. Mais pourquoi réinventer le fil à couper le beurre quand le voisin en dispose d’un tout neuf? Ainsi donc nous disposons de connaissances certaines sur l’influence de molécules naturelles: hormones, endorphines, neuromédiateurs, molécules «simples» comme le glucose, les acides aminés et même certains acides gras sur l’état mental ressenti, observé, déclenché etc. Bien sûr là aussi il y a des cas rudimentaires comme les conséquences de l’alcoolémie, celles de l’œstrus, ou de l’intoxication au monoxyde de carbone pour donner des exemples extrêmement disparates pouvant servir comme porte de recherche car il faut absolument voir large. D’autres cas sont encore plus raffinés avec une compétition entre facilitation_inhibition entre plusieurs groupes chimiques, dont l’effet est exprimé par la personne, qui par entraînement ou contrainte ou interdit, va enclencher des réactions, des conduites, des anticipations de rétrocontrôle, ou d’enchaînement quasi préprogrammés impliquant ces molécules. Pour approfondir et détailler nous trouverons de nombreux exemples: lutte contre l’endormissement, contre le froid, influence de la nervosité, la colère, des pulsions sexuelles ou alimentaires, des addictions, de l’ennui, les céphalées etc etc . Dans ce modèle je pose que si les mécanismes sont universels, leurs aboutissement va différer entre les personnes selon leurs antécédents cumulés dans le Je et le Soi. En particulier la conclusion satisfaisante ou non de ces mécanismes va pondérer l’objet par un facteur de «récompense» (dopaminergique,sérotoninergique) ou l’absence de ce {{g|climat biochimique}}, et influer lourdement sur le désir de reproduire ou d’éviter ces situations. Ici il faut explorer le vaste champ des addictions comme le tabagisme ou de phobie comme peur de l’eau. Ces exemples banals pour montrer ce qui peut advenir en matière alimentaire ou sexuelle ou d’apprentissage dans des pathologies lourdes. Un objet conscient ou subconscient contient donc au moins un attribut, une couleur, sa qualification comme favorable ou à rejeter. Nous verrons donc que toutes évocation entraînera une invasion du préconscient avec ce filtre. c'est la voie principale de modification des acquis suivants. == Et la mémoire dans tout ça? == Et bien là aussi la topographie et la biochimie expliquent la différence entre la mémoire immédiate, la mémoire à long terme, la facilitation ou l’inhibition d’évocation des connaissances, des évènements conscients d’une part et subconscients par ailleurs et des deux à la fois. La mémoire est donc une fonction de base du cerveau psychique, c’est le minimum syndical d’une certaine manière, c’est le statut figé (en première approximation) de l’objet. Elle représente le procès verbal d’un apprentissage, d’un évènement, et de leur «climat biochimique» sérotinino-dopaminergique en particulier. Mais il faut aussi prendre en compte sa remise en conscience par une évocation plus ou moins facile ou spontanée et plus ou moins transformée la encore par le contexte biochimique. Comme exemple si je cherche 2 fois 2, ça viendra immédiatement. Si je cherche à me rappeler ma première chute de vélo, forte chance que plein d’autres évocations surgissent et m’égarent dans le calendrier de mon existence et dans le ressenti douloureux de la chute. Ai je été ramassé avec empathie, avec des soins, avec des reproches, des encouragements, une histoire drôle, la menace d’hospitalisation, un vélo brisé ou indemne et j’en passe. Récemment il a été démontré que l’objet mémorisé n’était pas inaltérable et que les évocations répétées pouvaient le transformer en fonction du «climat biochimique» et des liens symboliques induit à l’instant de l’évocation qui peuvent se constituer après l’évènement. Il faut donc admettre que la mémoire remanie régulièrement les objets, leur climat neurochimique, et donc les liens symboliques avec d'autre objets ou outils. Ces remaniements seront conscients lors d’un apprentissage intellectuel, avec comme exemple simple l’acquisition d’un sens enrichi pour un mot déjà connu. Toujours dans le domaine conscient, le trou de mémoire sera particulièrement intéressant à étudier tant il dépend du contexte neurochimique, et des processus d’invasion à l’œuvre dans le préconscient, c’est le cas du «trac» qui sera éventuellement résolu en mettant à profit des invasions bienfaisantes. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/remaniement mémoriel et manipulation d'opinion|les remaniements mémoriels et la manipulation de l'opinion]]</blockquote> De là il est facile d’entrevoir que le remaniement mémoriel des objets subconscients sera mis à jour, lorsque l’introspection permettra de repasser le film du vécu. Toujours comme exemple, le contenu subconscient du vélo avant et après la chute. Ce qui est facile dans un cas simple, empathique, apparaîtra plus complexe face à des traumatismes plus graves et intimes, conduisant à une situation d’incommunicabilité. C’est le moment de glisser une référence connue à des manipulations traumatisantes comme les «sérum de vérité», les techniques de propagande et de conditionnements, de suggestion, qui hélas se pratiquent jusque dans les boutiques de charlatan où les cellules de torture. Une référence positive par contre ira au chimiothérapie documentée de certains syndromes post-traumatiques ou en encore à la galvano-thérapie moderne de certaines psychoses. Voilà qui illustre que le remaniement mémoriel est en fait courant et pourquoi sa connaissance par un patient lui même, et l’effet d’un exercice mental dont il a la maîtrise peut conduire à un effet salutaire pourvu que les effets contraires soient prévenus par un protocole éprouvé. C’est le moment de prendre conscience que les objets conscients et subconscients se distinguent aussi par leurs structures mémorielles en plus de leurs outils d’acquisition. Il me paraît intéressant de concevoir la notion d’objet d’une manière moderne. La théorie des ensembles objets définit les objets comme éléments de classe d’équivalence. Voilà un terme savant, d’accord, mais un exemple épargne la complexité apparente. Un objet qui a 2 roues, sur lequel on peut s’installer, et avancer en pédalant est un vélo puisqu’il possède tous les attributs de la classe vélo. Cette analogie rudimentaire entre objets et mathématique est connectée à la psychologie. A ma connaissance Piaget décrit que l’un des processus d’apprentissage fondamental de l’enfant est «l’analyse généralisatrice». L'analyse crée une classe et y place en même temps les objets pour généraliser. Bien sûr l’esprit humain généralise ce mécanisme qui semble incontournable, comme «inscrit en dur» dans notre cortex. Il construit des classes mères ou filles, les secondes héritant des premières en y ajoutant de nouveaux attributs. Ce mécanisme fondamental permet une arborescence très performante, économique pour les processus d’évocation mémorielle des objets conceptuels et d’ailleurs il est systématiquement utilisé par les pédagogues. En science chaque spécialité crée une arborescence à sa convenance où plus justement selon les outils qu’elle mobilise. L’arborescence issue de «l'analyse généralisatrice&#x22; des objets conscients, et de leur mémorisation, et de leur évocation semble être un modèle efficace. A ma connaissance il n’y pas à ce jour un substratum neuronal et biochimique de ce modèle. Notons toutefois que tous ces processus conscients sont fortement influencés par le contexte social, par la pollution des stimuli comme les bruits parasites, par l’état psychologique général, par son climat biochimique, qui contribuent au filtre préconscient comme je le décrit dans mon «protocole». En exemple une personne, convaincue par le mépris qu’elle n’est pas capable de comprendre ou d’apprendre, exposée à l’objet subconscient «mésestime de soi», n’apprendra effectivement rien. L’inhibition est aussi redoutable que la stimulation est efficace, d’où le concept révolutionnaire de {{g|pédagogie du succès}}. Si le climat d’acquisition d’un objet conscient est assez facilement organisable celui d’un objet subconscient l’est beaucoup moins. La pédagogie veillera dans le premier cas , mais point de mise en situation vraiment organisée pour le premier baiser, pour rester simple. C’est une allusion sur l’implication du filtre préconscient dans la constitution des objets conscients mais plus particulièrement pour les objets subconscients. == Et alors quelles différences avec les objets subconscients ? == Il faut préciser un point crucial du modèle, ce filtre qui s’intercale entre les évènements et l’activité psychique, c’est le concept du préconscient. Ce modèle s’appuie d’abord sur un constat facile à admettre y compris dans l’activité consciente. La quantité d’information, de stimuli qui se présente à nos organes sensoriels (nous parlerons d’un organe non-sensoriel, «intérieur» plus tard) est tellement importante, qu’un traitement exhaustif de ces informations épuiserait immédiatement notre machine neurochimique. En effet cette machine n’a pas de capacité infinie, à l’instar de ses réactions enzymatiques, elle est saturable et c’est donc un filtre de réjection qui protège la machine de la surchauffe. Un exemple extrême, qui montre les conséquences d'un déficit de se filtre est donné par l'hyperalgie du syndrome thalamique, et ses douleurs insoutenables. Dans le cadre physiologique le capteur visuel est une belle démonstration. La réactivité (et son corollaire la période réfractaire) des photorécepteurs garantit, que par la saturation biochimique, la captation de stimuli si leur fréquence dépasse une certaine valeur sera ignorée, rejetée. Ainsi les données physiques seront disponibles un temps suffisant et sans parasite pour que le cortex occipital en particulier, ait le temps de les analyser. De plus en fonction des circonstances, intérêt, urgence, procédure de survie, la fréquence de réjection varie. En cas de chute de vélo, le film est enregistré à plusieurs fois les 25 images secondes, et il est possible de la ré-évoquer au ralenti. Ce phénomène est aussi connu en cas d’agression lorsque son évocation n’est pas bloquée par les mécanismes que nous aborderons. C’est le syndrome post-traumatique. === Le filtre préconscient est donc adaptatif mais surtout perturbable et modulable. === Pour souffler un peu, un cliché qui rappelle que toute activité neurochimique est saturable : {{g|plus et ça bloque}}. De plus une fois franchi le filtre de réjection, les stimuli considérablement moins nombreux vont faire l’objet d’un nouveau filtrage. C’est en fait l’amorce du classement qui pour l’objet conscient relève de l’analyse généralisatrice et qui pour l’ objets subconscient sera surtout marqué par son agrégation avec son contexte neurochimique et humoral. Alors se présentent plusieurs cas : * Soit l’évènement interpelle l’activité consciente, c’est un discours, une image signifiante. Il est alors présenté à la machine intégrative, arborescente, décrite ci-dessus puisqu’il est d’emblée classable. Ex... je vois un vélo. * Soit l’évènement est anticipé, connu, banal ou considéré comme tel et il sera exclu de l’analyse consciente car il ne l’interpelle pas. Par exemple le bruit du vent dans les arbres. Le subconscient pourra donner ou non lieu à un classement dans les catégories subconscientes où les classes ont une forme différente par rapport aux classes {{g|conceptuelles}} identifiables dans l’activité consciente. Nous décrirons ces classes subconscientes plus loin. * Soit l’évènement est brutal, et/ou non-anticipé, imprévu, et/ou inimaginable, ou terrorisant, toutes circonstances qui déclenchent un blocage du processus préconscient, il ne pourra pas être classé. Les exemples les plus courants sont les agressions, les accidents, les viols, et la maltraitance subie dans l’enfance. Au fil des travaux, cette situation a été qualifiée de traumatisme, d’autant qu’elle inaugure une situation bien étudiée aujourd’hui désignée par syndrome post-traumatique. Ce blocage est topographiquement défini par l’implication de l’hippocampe, des modifications hormonales à action générale de «qui-vive» (ex adrénaline,) de stress (hypercorticisme), de dysrégulation hypophysaire, jusqu’à des modifications des structures cérébrales observables dans les recherches par imagerie médicale. Ce drame psychique se prolonge par une altération des fonctions neurochimiques habituelles. Le filtre préconscient est sidéré bloqué. Sorti de cette phase de sidération il est perturbé, conduisant à un épuisement neurochimique pouvant perturber donc toutes les fonctions et acquisitions: apprentissage, sommeil, sensation de bonheur, libido, élan vital etc. <gallery> Fichier:STRESS ET DEPRESSION 1.webp Fichier:STRESS ET DEPRESSION 2.webp Fichier:STRESS ET DEPRESSION 3.webp Fichier:STRESS ET DEPRESSION 4.webp </gallery> La situation peut se chroniciser au-delà des 3 mois et le fonctionnement psychique s’en trouve déformé indéfiniment. C’est le handicap post-traumatique. D’où l’importance reconnue aujourd’hui des conséquences d’une absence ou d’une mauvaise prise en charge initiale du syndrome traumatique. Le classement : Il faut souligner que la forme arborescente que prend le classement des objets conscients est un modèle solide, éprouvé en psychologie de l’apprentissage, avec l’analogie des ensembles, des classes d’équivalence et des héritages. Encore l’exemple du vélo est facile et tout le monde comprend alors ce qu’est un vélo-moteur, un vélo qui {{g|hérite}} d’un moteur. Le classement des objets subconscients n’est pas superposable à ce modèle. L’évènement bienfaisant du berceau douillet s’enrichira naturellement de celui du lit douillet et sans doute de la «doudoune» pour donner un exemple de portée populaire. La contemplation de l’arbre en face de la chambre avec son feuillage changeant, les bruits qu’il émet à la fois dépendant de l’état du feuillage et du vent, et de la myriade des pénombres projetées, remplira le vaste coffre au trésor des émotions bucoliques et du sentiment d’harmonie. Ce qui est remarquable dans cette mémorisation outre sa structure «agrégative» c’est son énorme capacité de stockage sensoriel. Le flux de donnée stockée est incomparablement supérieur à celui des objets conscients et donc la puissance de leurs invasions sera d’autant plus grande. Cette hyper-définition sensorielle de l’objet subconscient est d’ordre physiologique. Comme si ce classement assez simple, sans les raffinements nécessaires aux concepts, laissait notre énergie psychique disponible pour une acquisition massive multi-piste à grande vitesse d’acquisition. Il en résulte que l’objet subconscient est massif, global. Les pistes de l’enregistrement sont chacune connectée directement à un organe sensoriel. Ce caractère massif rend bien compte de l’effet de son évocation, à l’image de la madeleine de Proust, où une effluve discrète déclenche une remise en situation encore plus prégnante que le vécu lui même. Je désignerai cette situation par le mot {{g|invasion}}. Le stimulus déclenchant étant comme une {{g|gâchette}}. Il faut rappeler une fois de plus que l’objet comporte dans ses attributs, sa pondération propre entre le «plateau» récompense, satisfaction, gratification, jouissance et celui punition, frustration, culpabilisation, souffrance et leurs attributs biochimiques. Ici il faut souligner que «l’invasion» entraînera la restitution de ce contexte amplifiée par sa répétition à l'image des démonstration de Pavlov. Cette remarque doit attirer l’attention sur la dangerosité des déclenchements d’invasions, circonstancielles ou par sollicitations volontaires. Une incitation à l’évocation d’un objet subconscient qui contiendrait un attribut «souffrance» va renforcer l’attribut souffrance donc l’aggraver. Nous verrons qu’il est possible de fournir les outils ayant l’effet inverse. Retenons qu’avant toute manipulation par soi même ou avec l’aide d’un tiers, d’un objet subconscient, il faut absolument que le sujet enfile une {{g|combinaison de protection}}. Cette combinaison et la manière de l’enfiler, réclame une compétence à la portée de chacun, pourvu qu’en plus d’une conception claire de la nature des objets en causes, comme je l’espère l’exposé actuel y contribue, deux techniques bien réglées d’évocation soient réalisées. Ce sont les techniques d’évocation associative et dissociative selon le {{g|protocole}} en pièce jointe à cet essai (ce protocole empreinte à la Programmation Neurolinguistique en se distinguant radicalement de certains de ses enseignements que je qualifie de dangereux, en particulier les ancrages avec intervention physique du praticien). De même que nous avons vu le rapport constitutionnel et réciproque entre objet et outil que ce soit dans l’activité consciente comme subconsciente, nous venons de voir que l’objet possède une structure mémorielle qui varie en fonction de la nature de l’objet et du contexte de sa survenue. Nous avons vu les différences des processus mémoriels d’un point de vue structurel, l’arborescence du conscient versus l’agrégation, fusion du subconscient, mais aussi la différence fondamentale entre les contenus de la mémorisation des objets conscients prédestinés à la communication, à la prévision, au calcul , et les contenus des objets subconscients dont la destination nous échappent par définition mais qui constituent la plus grande part de la psyché. Cette dernière affirmation a été historiquement souvent combattue, voire réprimée par de nombreuses sociétés sans doute pour couper l’individu d’une source de motivation non contrôlable par la norme, comme l’empathie, l’inspiration, dans l’espoir aussi de mobiliser la totalité de l’énergie psychique au profit du collectif ou du pouvoir, en niant la personne et son histoire particulière. Cette amputation qui continue dans l’époque médiatique, conduit une immense proportion des personnes à lutter contre des mécanismes neurophysiologiques et donc à se tourner le dos à elles mêmes. D’un point de vue pratique il est facile d’envisager qu’il est illusoire d’obtenir d’une petite part de notre psychisme conscient, qu’il maîtrise sa part majoritaire subconsciente, non conceptuelle, et son cortège biochimique induit. == La manipulation des objets et les opérations entre les objets. == Partant du modèle du classement par équivalence des objets. Nous pouvons observer que des opérations entre ces objets deviennent possibles et même assez systématiques. Pour ce qui est des objets conscients, un grand nombre d’entre eux se retrouvent qualifiés de concept. Pour exemple des objets chiffres vont se prêter à des opérations, et des relations de comparaison. C’est le fameux 2 plus 2. Mais les simples mots d’un vocabulaire se trouvent combinés dans la langue, dans un discours non prédéfini à l’avance, sauf pour les perroquets, mais en suivant une syntaxe. Voici donc des objets conscients, en mémoire, classés, combinables, pondérables etc. Donc la manipulation des objets conscients et les opérations sont indissociables de l’activité humaine perçue par tout un chacun. Cette activité cérébrale fait autant l’objet d’étude biologique que psychologique avec une convergence chaque jour plus affirmée. La (les) fameuse dyslexie est typique de ce point de vue. Longtemps classée comme débilité ou trouble caractériel, puis handicap, puis génétique elle est présentée avec des mécanismes de plus en plus raffinés, y compris ses imageries fonctionnelles cérébrales comme une particularité non rédhibitoire à l’apprentissage et peut être parfois avantageuse. Pour ce qui est des objets subconscients il faut faire appel à des considérations bien moins communes. Admettre la présence d’objets subconscients est un fait récent, sauf à considérer que la méditation, les transes, les prières, les superstitions, les possessions, référaient au monde de l’invisible y compris au sein même des personnes. Ce subconscient est donc une mise au jour d’un fonctionnement cérébral inhérent au moins à la nature humaine. Nous avons vu que ces objets, issus de l'agrégation des stimuli foisonnants, malgré le filtre de réjection, mobilisent la plus grande part de l’activité cérébrale Nous avons vu que les interactions entre ces objets sont nombreuses et qu’elles émergent parfois sous des formes imprévisibles. Pour exemple, La simple sensation de s’être «lever du bon pied» ou à l’inverse de «voir les choses en noir» qui se succèdent sans explications évidentes. Entre une sensation de bien être total et la tension insurmontable d’un syndrome post-traumatique, point de doute il se passe des choses et il faut essayer de comprendre. Depuis la classique description de la madeleine de Proust et des flash post-traumatiques les indices se multiplient. Ces objets subconscients envahissent l’activité cérébrale à partir d’un stimulus qui peut être banal, évènement «gâchette». L’odeur déclenche l’invasion de la madeleine avec tout son contexte, lieu, personnes présentes, lumière de la salle, couleur de la nappe, crépitement du foyer, voix entendues etc . A un instant, une perception sensorielle par un seul canal sensoriel, déclenche l'invasion d’un événement complexe impliquant tous les canaux sensoriels y compris un canal non supporté par un organe sensoriel qui transmet une sensation de bonheur, le climat {{g|dopaminergique}}. Cet exemple est démonstratif. L’objet subconscient est «global», c’est un duplicata qui toutefois connaître des remaniements complexes au fil de ses ré-évocations. Il est d’une extrême définition, il envahit totalement la personne sans intervention de calcul, de volonté. C’est «l’invasion». C’est comme un réflexe pavlovien de notre activité la plus évoluée. L’artiste nous fait découvrir cette invasion reproductible et heureuse par un discours littéraire. Comme ce récit est facilement compris et qu’il renvoie à des situations semblables pour le lecteur, il faut y voir une invitation empathique. À noter que l’objet subconscient contient tellement d’informations, qu’avec l’entraînement qui convient, son évocation reproduit une situation approfondissant son évaluation consciente. Et voilà qu’un élément de la situation enregistrée mais non prise en compte à son origine revient au premier plan. Cette redécouverte est tellement puissante qu’elle renforce la pondération satisfaction d’une situation bénéfique. Pour exemple chaque fois que je ré-évoque selon mon protocole la situation où je me laisse traîner par mon bateau à voile en pleine mer, portant harnais et sous la vigilance de ma femme, cette invasion renforce sa valeur de bien être. Voilà donc les caractéristiques des objets subconscients qui se dessinent: résultats d’un enregistrement multi-sensoriel à haute définition, classés en fonction de charges satisfaction_répulsion, liées à un &#x22;climat&#x22; neurochimique complexe mais certain, capables de produire non pas un souvenir mais une «invasion» qui peut produire au fil de ses répétitions un renforcement de sa charge satisfaction_répulsion. <blockquote>TRES IMPORTANT ....... [[Essai pour un modèle de psychisme objectif/préconscient et objet gâchette|Illustration de "l' organe psychique", PRE-CONSCIENT et OBJET GÂCHETTE]]</blockquote> Ces invasions sont donc capables de produire un «climat neurochimique» qui va fondamentalement influencer les futures acquisitions psychiques (conscientes ou subconscientes). Dans les circonstances communes ces invasions expliquent bien les sensations générales d’optimisme, ou d’irritabilité que chacun éprouve et reconnaît dans son existence et dont la banalité traduit la bénignité sauf à considérer qu'elles se pérennisent dans un mode obsessionnel. Mais dans les cas de souffrances psychologiques, les potentialités des invasions dans le préconscient, expliquent les fortes perturbations des objets acquis sous l’emprise des invasions toxiques. Le filtre des réjections est perturbé, le filtre du préconscient soumis à une invasion «douloureuse» perturbera le classement et la mémorisation de l’évènement. D'une part le filtre de réjection devient perméable, moins efficace, il laisse passer plus de stimuli comme pour mieux prévoir et parer à la situation traumatisante. C’est l’état de qui-vive, de phobie, des démarches d’évitement. Ce filtre se met à laisser passer des bruits en fait sans intérêt, rejette certain contact anodin, déclenche des fuites devant certaines images pourtant banales etc. Comme nous l’avons vu, la détérioration du filtre expose à l’épuisement neurochimique par surcharge en stimuli. L’épuisement conduit à l’état morbide en particulier la dépression {{g|bio-chimique}}. D'autre part le filtre préconscient du classement est perturbé. Le climat de souffrance s’installe dans le préconscient fréquemment et durablement. Les évènements devant donner lieu à l’acquisition d’objets subconscients satisfaisants, gratifiants sont recouverts par le vert de gris, la morosité, et ceux qui hélas sont pénibles et frustrant cheminent sans entrave vers leur agrégat mémoriel délétère. C’est alors que la manipulation, la combinaison entre objets s’opère, cette fois sous le règne de l'invasion toxique, c'est le &#x22;parasitage&#x22;. Concernant les objets conscients, nous avons exposé qu’un objet conscient, présente une nature conceptuelle, prend sa place dans une arborescence mémorielle construite sur le modèle de l’analyse généralisatrice, possède des attributs opératoires. Nous avons même suggéré que l’intuition du poète, du chercheur relevait d’une capacité à créer des liens nouveaux entre ces objets créant du même coup un nouvelle arborescence et du même coup de nouveaux liens opératoires entre les objets. Ces facultés sont sans doute liées à certaine phase du sommeil. Cet apport encore neurophysiologique contredit l’idée que seul l’effort soit gage de succès et de performance. Au contraire tout concorde dans la physiologie. C’est la qualité de la décontraction du muscle qui annonce la performance de la contraction, pour des raisons biochimiques démontrées. C’est sans doute la performance des sommeils de l’être humain qui lui permet ses performances conceptuelles et subconscientes. Et alors concernant les objets subconscients?.... À ce jour, mise à part les perturbations du sommeil consécutives à tout objet subconscient déclencheur d’épuisement neurochimique, je ne connais pas de démonstration sur l’importance du repos pour l’établissement des liens symboliques entre objets subconscients. Toutefois rappelons nous que le lien symbolique d’homologie bien suggéré dans les empathies nous met sur la voie. Aussi admettre que des liens symboliques s’établissent entre objets subconscients est envisageable. Et je tente d’en confirmer la vraisemblance. Le langage étant d’abord un jeu de symbole, l’idée de solliciter les liens symboliques avec les objets subconscients par un usage particulier du langage est l’objectif central que je retiens de la Programmation Neuro Linguistique. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/concernant une dyslexie| une dyslexie et sa solution]]</blockquote> Un constat intéressant dans cette voie est d’observer que si parfois une invasion comporte une indication temporelle, le plus souvent cette dimension est estompée, voire absente. Pour reprendre l’expérience du vélo, tout s’agrège en mémoire comme si ces expériences n’avaient plus de date. Ce fait extraordinaire pour une capacité comme la mémoire qui contient dans sa définition, la résistance au temps qui passe, témoigne d’une caractéristique particulière à la mémoire du subconscient. Elle n’est pas attachée au temps, au contraire elle semble s’en affranchir. Ceci explique le coté massif des invasions. Les sensations de chaque évènement fusionnent avec celles d’évènements distants. Ce mécanisme fait que le vélo ou le faire- du-vélo, «subconscient» va s’enrichir d’éléments fortement pondérés «positivement» dans l’échelle des satisfactions pour les jours de beau temps et de vacances, alors qu’il peut être dévalorisé par trop d’expériences sous la pluie ou la tempête. Ces cumuls ne sont pas le produit d’une addition des séquences mais d’une fusion des séquences. Ce travail de fusion s’opère pendant le sommeil c’est le plus probable. Nous savons qu’un sommeil non physiologique, pathologique, va entraîner l’amnésie des faits récents, la caricature la plus désastreuse en étant le «lendemain de cuite». Nous devons donc admettre que les liens symboliques entre objets subconscients s’opèrent pendant le sommeil. Il nous reste à concevoir que ces liens ne sont pas prédéterminés par une stratégie consciente comme celle bien codifiée de la répétition de la récitation avant d’aller au lit. (Ici je suggère pour mémoire, d'explorer l'intérêt de faire enfiler sa combinaison de survie à un traumatisé avant qu'il ne s'endorme, un exemple de ce qui peut être conçu comme une urgence thérapeutique). Ces liens symboliques sont hors du champ de la conscience, par contre les invasions qui en découlent s’imposeront, avec toute leur puissance massive, à l’être humain sans égard pour la confiance qu’il porte à son monde conceptuel conscient. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/détail d'un recouvrement|la technique du recouvrement une technique thérapeutique]]</blockquote> La stratégie s’étaye petit à petit. L’invasion par un objet subconscient est d’une puissance telle que l’activité consciente est littéralement écrasée. Les liens symboliques entre objets subconscients s’opèrent pendant le sommeil et donc le climat de ce sommeil est déterminant sur la création de ces liens et donc leurs propres «climats» . Les outils de ces liens ne sont pas univoques au sens ou le lien d’homologie bien identifié dans l’empathie ne donne pas toujours le même résultat pour chacun. La contradiction entre objets, la dévalorisation d’un objet, ou sa mise en valeur, est éprouvée lors des invasions. Hélas ces phénomènes quotidiens sont exclus du champ de l’activité consciente autant par les mécanismes sollicités que par la négligence ou le rejet social à leur encontre. C’est ainsi que la norme sociale, expose la majorité des êtres humains à l’ignorance d’eux mêmes, une incompréhension qui conduit à un sentiment d’impuissance, d’angoisse, faute de reconnaître à la fois les objets et les outils mobilisés dans ces invasions. La méconnaissance des outils et des objets reproduit le stade de l’angoisse primitive donc par quasi réflexe, entraîne le rejet du Je et du Soi du champ de la conscience. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/humanisme et modèle de psychisme objectif|Comment le modèle de psychisme objectif peut contribuer à l'émancipation des êtres humains]]</blockquote> Au contraire une bonne leçon de chose, et la pratique de l’introspection sous protection de la combinaison de protection dont la personne est maîtresse, en autonomie et surtout dans son intimité, permet de maîtriser ces invasions dans toutes leurs ampleurs, leurs connexions et leur puissance, pour y puiser sérénité, force, explication, et finalement résolution des souffrances. L’introspection d’une souffrance, ne doit être envisagée que sous cette protection, au risque certain de la voir ravivée par son évocation. L’exploration d’une plaie se fait en urgence, mais dès lors qu’une cicatrice commence, son exploration est un geste qu’il ne faut entreprendre que sous condition de connaître la présence, la nature, la position d’un corps étranger, son trajet et d’opérer alors sous anesthésie et asepsie parfaite. Dans les autres cas, le patient demande une récupération fonctionnelle plus qu’une restauration formelle. C’est donc la personne elle même qui construira son adaptation, pourvu qu’elle dispose des outils de cette réforme. == La résolution des souffrances, attribut des objets subconscients. == Quelques cas cliniques de ma pratique. Cas 1 :<span id="étrange"></span> Ce cas est fait pour troubler le lecteur qui aurait perçu dans cet essai une tentative d’exposé ramenant tout à la psychologie. Un adolescent de 14 ans m’est adressé par sa mère pour trouble du comportement. Il évoque qu’il veut se venger, se défendre d’agressions qu’il aurait subi. Nous commençons donc par proposer au patient de considérer que de se plaindre à 14 ans c’est normal, que l’âge le plus heureux de la vie n’est sans doute pas pour tout le monde la jeunesse etc. Il en vient à la confidence qu’il est agressé régulièrement par des gens qu’il ne saurait reconnaître et que c’est généralement lorsqu’il range sa mobylette. Alors je m’attache à lui faire décrire ce qui précède et ce qui suit l’agression ….. et là c’est la confusion. Je le rassure sur l’étrangeté qui lui saute aux yeux, et sur le fait qu’il y a une explication à ces «flash». La brutalité de la vision, la régularité des circonstances, son absence de témoin, son étrangeté inachevée, sa période de récupération, m’ont interpellé. Merci mes maîtres, mon premier diagnostic qui sera confirmé est une épilepsie temporale partielle. Pour un généraliste c’est une rencontre exceptionnelle et même pour un neurologue hospitalier ce n’est pas une observation quotidienne dans cette forme. Je l’adresse en neurologie avec l’anamnèse et l’hypothèse soulevée d’épilepsie temporale avec hallucination conduisant à une névrose de persécution. Après deux électroencéphalogrammes le diagnostic est confirmé, le traitement adapté fait disparaître les «crises» et mon accompagnement convainc le jeune patient qu’il a eu une réaction normale, intelligente à une génération d’images de sensations anarchiques auxquelles il a donné un sens. Les sensations étaient sans fondement objectif, liées à l’activité neuronale paroxystique et anarchique de son lobe temporal, mais son effort à leur donner un sens découlait d’une intelligence normale. Il a été guéri de son épilepsie très particulière et en même temps les doutes qu’elle avait fait naître sur sa santé mentale sont effacés. Voilà l’exemple glorieux, issu de ma pratique pour illustrer que la souffrance psychologique n’est pas toujours consécutive à une histoire psychologique. Il convient d'être circonspecte avant de se "lancer" dans des consultation spécialisé sans l'avis du médecin généraliste. Il en va de même pour d'autre spécialité quand un ORL est sollicité pour un bouchon de cérumen historique tout à fait du ressort de l'otoscopie du généraliste qui pratiquera son extraction attentive. Cas 2 : C’est même un cas courant dans les addictions de tous ordres où c’est le trouble fonctionnel neurochimique qui crée la souffrance psychologique en détruisant le circuit de traitement des objets conscients et subconscients. Comme anecdote instructive et pour le moins originale, c’est une intoxication chronique au monoxyde de carbone qui a finalement expliqué l’humeur dépressive d’une famille appelant désespérée le régulateur du SAMU que j’étais, pour des symptômes dépressifs, touchant plusieurs membres de la famille, dans ce début d’hiver, sans évènement particulier, hors des céphalées bizarres. J’ai demandé l’intervention à domicile des sapeurs pompiers qui ont démontré le dysfonctionnement de la chaudière gaz mal entretenue du fait des difficultés financières de la famille. Un enchaînement sociologique en quelque sorte avec intoxication au monoxyde de carbone. Il faudra bien entendu poursuivre le bilan socio-économique qui à lui seul est dépressiogène. Une anecdote, pour toujours élargir une vision parfois trop systématiquement psychopathologique. Cas 3 : Ce sont toutes les démences dégénératives variées, vasculaires, «séniles» qui toutes entraînent des souffrances par dysfonction des fonctions psychologiques et psychiques, troubles de mémoire, qui au bout du compte ré-expose la personne à l’»angoisse primitive» mais cette fois sans l’énergie psychique du nourrisson, de l’enfant à l’adulte jeune l’ayant résolu. C’est la destruction neuronale. C’est la destruction des liens symboliques, et l’invasion anarchique d’autres. La personne rentre en lutte comme elle peut. Le tout contribuant à un épuisement final et après des accès de révolte et d’agressivité parfois suicidaire à une apathie, puis une vigilance vacillante et l’extinction. Toutes ces souffrances sont directement liées à une altération des processus biochimiques et une altération anatomique au point qu’elles sont aujourd’hui prédictibles biologiquement et en imagerie médicale. Cas 4 : un syndrome post-traumatique simple est celui d’un jeune chauffeur de poids lourd, victime d’un accident de renversement de son véhicule sur un rond point. L’accident est spectaculaire, c’est un gros porteur. L’enquête de gendarmerie rapporte une surcharge et un défaut de répartition de charge cause de l’accident et les enregistreurs de bord disculpent le patient. Il est en incapacité totale psychique, deux côtes fracturées, dorsalgie, sommeil très perturbé, invasions visuelles et auditives jour et nuit. Syndrome dépressif, perte d’estime de soi, perte d’appétit, de libido. Il était heureux jusqu’à cet instant, avec une petite fille adorable, une femme aimante et des passions artistiques remarquables. La {{g|combinaison de protection}} anxiolytique est mise en place en usant de l’évocation méthodique d’une situation banale de sa vie de sculpteur dont le climat biochimique est sûrement bénéfique. Par répétition, cette invasion positive se renforce au point qu’en 2 semaines le sommeil et le reste se normalisent. Le patient prend confiance dans la démarche. Il faut maintenant désamorcer les invasions qui persistent sur les gâchettes de certains bruits ou angles lumineux. Ce sont ces fameuses séquences enregistrées à 200 images/secondes avec un son et une acuité incroyable qui passe en boucle dans l’hippocampe. Le patient apprend à bien enfiler tranquillement sa combinaison de protection, il s’entraîne en consultation à différentes techniques de recouvrement à propos d’objets subconscients de très faible valeur négative. Il prolongera avec cette expertise les exercices chez lui et reviendra guéri en 1 mois capable de reprendre le volant sans trouble invasif. C’est un résumé d’un travail méthodique évoqué ci dessus et détaillé dans le document «protocole », mais au bout du compte le patient est autonome et capable de régler d’autres problèmes par lui même. Il est {{g|équipé}}. Cas 5 : Une femme de 47 ans est en deuil depuis 7 ans de sa fille de 19 ans décédée dans un accident. Sa vie n’est plus qu’une plaie. Elle a pourtant un entourage familial très affectueux, et des médecins et des psychologues dévoués. Rien n’y a fait, tout est gris, sans avenir, morne. Ici c’est une souffrance sans réelle solution qu’il faut soulager, c’est la vie qui continue qu’il faut libérer de l’entrave de la tristesse. La première consultation est consacré à la «leçon de chose» adaptée. Elle repart de la première consultation avec «devoir maison» pour la semaine suivante: faire une liste de 2 ou 3 situations banales mais paisibles pour elle. Je lui propose de travailler sur l’évocation en mode associatif d’une visite dans la grande librairie du centre ville qui se trouve dans sa liste. Tous les canaux sensoriels sont sollicités méthodiquement, en suivant la méthode presque scolaire, en respectant les silences (20 secondes minimum) si essentiels à l’invasion du préconscient par le subconscient. Plusieurs éléments dominent l’évocation: le contact avec l’épaisse moquette, l’image des livres en rayon et brutalement un long silence puis {{g|j’ai l’odeur du livre, de l’encre}}. Elle ressort dans une sérénité qu’elle n’avait pas connu depuis 7 ans. Bien sûr quelques séances de plus pour qu’elle devienne experte en «invasion positive» et qu’elle complète le tableau …. d’ailleurs cette odeur d’encre est liée au premier prix de récitation qu’elle a reçu de sa maîtresse, après un succès applaudi par ses camarades, elle qui était si timide! En cherchant elle avait 8 ans sans doute …. d’ailleurs il lui semble entendre très distinctement la voix de cette maîtresse dont subitement elle se surprend à dire le nom. Impossible de tout détailler, mais il faut comprendre que cette personne était désormais capable en toute circonstance en disposant de, ou même en évoquant l’odeur de l’encre de déclencher une invasion plus puissante que la tension de son chagrin, et qui lui transfusait la sérénité, et la confiance. Sa famille l’a retrouvé {{g|comme avant}} et la vie continue. Cas 6 : Plus complexe un homme de 48 ans, consulte très excité, se plaint de sa femme. Au bout de quelques consultations aux motifs variés, d’une hypertension récente à quelques sinusites allergiques, il lâche qu’il a une «double vie», que sa femme l’a appris et que ça se passe mal. Son expression libre témoigne qu’il veut être libre, refaire sa vie, repartir. Alors je lui demande depuis quand il se trouve dans cette situation. En fait il a perdu un de ces collègues du même age il y 1 an. Par ailleurs il décrit son attachement à sa vie de famille, les fêtes de familles. Il se sent surtout mal, déchiré entre des objectifs contradictoires. Alors par systématisme je lui propose de remplacer le recours aux anxiolytiques par une thérapie dont il aurait lui même le contrôle. Ça tombe bien il constate que ses performances sexuelles «ne sont plus comme avant». En revenant de sa quête d’objets disons positifs, je trouve dans sa liste un évènement ancien et personnel. Une virée en mob avec un copain dans ses 16 ans? J’hésite à l’orienter vers cette exploration plutôt inhabituelle, mais finalement je considère cette évocation comme assez pertinente pour la circonstance. Commençons pas le canal tactile, les vibrations de l’engin, les trépidations des petites routes, jusque dans le guidon etc puis la pression du vent, le flottement de la chemise etc puis le canal auditif le bruit du &#x22;moulin&#x22; et «Victor attends moi à droite» .<br /> Voilà je suis rassuré, toujours après le silence sans préjugé du pêcheur à la ligne , il vient de s’entendre appeler son camarade perdu de vue et dont le prénom ne lui revenait pas. Et oui je suis content il a bien trouvé l’enregistrement multi-piste de son subconscient et tout y passe, les odeurs, les images , les couleurs, tout, tout et ce sentiment de liberté, d’émancipation obtenue à l’arrache auprès de parents plutôt réticents, sentiment de maîtrise de l’avenir, de facilité dans ce canal encore à peine évoqué du «monde intérieur» etc. En effet sur l’enregistrement multi-piste, il y a la piste du climat biochimique particulier, des hormones et des neuromédiateurs «qui font du bien». Mon protocole n’y échappe jamais. Voilà le patient habituellement plutôt convaincu de consumérisme, de réussite financière et sociale qui trouve sa sérénité dans l’évocation de l’avenir ressenti à 16 ans et fidèlement restitué par son subconscient. Les séances s’enchaînent renforçant son ressourcement, il se sent plus normal, ne fait plus de référence négative à sa femme. Je lui suggère qu’il n’a sans doute plus besoin de venir me voir pour ce motif. Pour ma part, j’ai fait une hypothèse sur ce cas que je lui ait soumise par les circonvolutions qui conviennent à sa personne particulière. Pour faire court, un tableau assez classique. Une personne qui à 50 ans rencontre l’évidence de sa finitude à l’occasion par exemple du décès d’un proche comparable, ici un collègue ami. Alors s’opère un lien symbolique entre deux objets subconscients. D’une part le JE établi pour juguler l’insupportable «angoisse primitive» et assurer la pérennité du sentiment d’exister, et d’autre part le lien empathique avec une personne qui par sa disparition fait surgir la faiblesse, passée sous silence, du JE, sa finitude. Face à ce profond conflit, non anticipé par une connaissance du subconscient, les velléités du JE pour se distancier de cette évidence de finitude se multiplient ……«Je veux changer de vie, la refaire, changer de maison, de voiture , de femme ». Cette crise est reprise en compte socialement, crise de la 40 aine ou de la 50 aine et son cortège de décisions radicales, irrépressibles au nom d’une définition de la liberté dont on perçoit mal les contours. La démarche entreprise a contribué dans un bon nombre de cas à désamorcer ce conflit en fait majeur dès lors qu’il implique les couches fondamentales du JE. Les motifs de chamboulement s’estompent, c’est l’occasion de reformuler le JE, d’y faire admettre l’objet finitude. Alors le SOI n’est plus miné, il pourra continuer ses fonctions intégratrices habituelles. Il n’était pas question dans cette histoire d’un désamour découlant de conflits larvés antérieurs plus ou moins conscients, mais d’un mécanisme subconscient, entre objets eux mêmes subconscients. Ce type de conflit a été estompé, mis à jour, et finalement résolu par une introspection dans la combinaison de protection de l’adolescent en mobylette. Pour faire court, la finitude de la petite vadrouille a intégré au JE la finitude de la vie et ainsi s’est éteinte la pulsion de vouloir passer outre, par l’illusion de la renaissance. Je parle ici d’un tableau courant que tous les praticiens reconnaîtront même si l’ignorance de son mécanisme l’a fait classer dans les accidents banals de la vie. Cas 7 : L’ amour maternel entravé. Comment pallier à un hiatus ontogénique pour rétablir la voie de la régression - fusion? Une femme de 32 ans, d’une profession médicale dont je suis les enfants et qui me consulte pour elle même pour une banale allergie saisonnière, se présente un jour, plus réservée et surtout je lui trouve un air triste. Ainsi lors de la consultation, je l’interroge sur sa fatigue. Le dialogue s’installe et elle me confie sa déception à ne pas ressentir d’amour maternel comme elle l’envisageait. Cette souffrance dure donc depuis 6 ou 7 ans âge de son premier enfant. Elle en a 2 qui vont bien et sont bien sympathiques, son couple est heureux. Elle n’a parlé à personne de ce qui la tenaille douloureusement. J’entreprends alors un exposé assez rapide et adapté à sa formation avec schéma à l’appui pour lui faire entrevoir dans le modèle, comment l’amour maternel s’installe. La fusion avec l’enfant s’opère au niveau du JE et non pas seulement du SOI. Il s’en suit une forme de parcours dans le sens anti-temporel sur le plateau du SOI, puis sur la courbe en S du JE seul substrat sur lequel peut s’opérer la réelle fusion. Et la question vient naturellement, y a t’il eu un ou des évènements ayant produit un hiatus dans la construction du JE? Elle a connu une enfance sans maltraitance évidente mais le fait que ses parents se soient séparés de façon conflictuelle l’a confiée autour de sa 10ème année à sa grand-mère maternelle très aimante et protectrice. Elle s’étonne de la forme graphique que prend l’exposé, je la sens dubitative. Aussi je lui prescris la première étape du protocole: retrouver 2 ou 3 situations que lui font du bien. L’objectif? Toujours le même que le patient dispose assez vite d’un exercice favorable à la sérénité. Là dessus elle est d’accord pour essayer et lors de deux séances suivantes car elle a de vraies aptitudes à l’exercice elle se trouve confortée par l’évocation du tricot. Alors je reprends mes schémas et elle comprend ses sensations éprouvées, d’une angoisse terrible dans les jours qui ont suivi la naissance de son premier enfant. Elle décrit bien cette paralysie qui l’a saisie alors qu’elle se sent émue, transformée par la naissance et la proximité avec son bébé. Ce blocage très intériorisé est conçu comme un échec qu’elle n’a pas surmonté et elle a continué sa vie dans l’attention et l’affection sans failles à ses enfants mais toujours dans une frustration qu’elle ne s’explique pas. En ayant tracé sous ses yeux une courbe du JE avec la profonde encoche correspondant à son déracinement affectif, elle comprend que sa régression n’a pas pu se poursuivre car elle l’entraînait vers le hiatus mis à jour. Alors s’était un retour brutal à la confrontation avec l’angoisse primitive et l’insurrection de son JE qui lui interdisait d’aller plus loin pour établir la fusion avec l’enfant. Tout s’éclaire mais que faire ? page suivante, vous trouverez le graphique de la {{g|régression}} offrant la possibilité ou non d’une fusion dans le JE en fonction de la continuité du JE ontogénique ou de la «réparation» de cette continuité au dessus du hiatus grâce à la construction d’un «pont tibétain» Prenez le temps de le mémoriser dans le détail. C’est une tentative de modélisation psychologique qui vise d’une part à faire toucher du doigt une réalité complexe et bien sûr subconsciente, mais aussi à proposer une ouverture sur une réparation ontogénique. [[Fichier:Régression.jpg|vignette|voici le schéma qu'il faut mémoriser en détail ]] Donc plusieurs relectures sont indispensables à une bonne critique et une appropriation des concepts. Bien entendu si le modèle fonctionne, ce ne peut être au stade de mes connaissances, une preuve qu’il soit seul à pouvoir aider de tel patient. je n’expose ce que j’ai pratiqué avec la prudence systématique de mon modèle. Le pont tibétain. Rappelons nous, ce dont est capable notre subconscient. Il stocke des objets massifs en quantité de données et est capable de les agréger par de là leurs caractéristiques temporelles. Ainsi dans un autre cas je vous avais livré l’histoire de cette patiente surmontant le deuil de sa fille (de dimension fusionnelle avec son JE) par une invasion autour de l’odeur de l’encre de librairie qui reliait des évènements aussi distants que la remise de son prix de récitation dans son enfance et de ses visites régulières dans la grande librairie. <blockquote>LE PONT TIBÉTAIN ....... [[Essai pour un modèle de psychisme objectif/pont tibétain| la réparation du continuum ontogénique pour combler le hiatus ontogénique]]</blockquote> Cet exemple fait comprendre comment l’analogie avec le pont tibétain m’ait apparu. Au dessus du hiatus d’un JE accidenté, le patient peut construire un pont au mieux multifilaire pourvu qu’il trouve une agrégation d’objets subconscients enjambant temporellement ce hiatus. Finalement c’était simple, partant de son ''hobby'' pour les lainages tricotés, elle retrouve méthodiquement l’évocation des pompons qu’elle confectionnait elle même suivant les conseils affectueux de sa grand-mère et depuis le plus jeune age. Ces pompons à eux seuls formaient souvent des doudous. De plus ils étaient devenus sa madeleine de Proust incarnant l’amour paisible de sa grand-mère. Un peu de travail et la patiente disposait d’un pont tibétain envahissant et bienfaiteur au dessus du hiatus de son JE. Le parcours manquant dans son ontogénie où l’angoisse primitive restait non résolue, était maintenant confortablement franchi par le pont continu d’une guirlande de pompons à toute épreuve. Dès lors la régression pourra s’opérer sans blocage. La patiente m’a averti qu’elle était libérée de sa frustration et que sa relation avec son mari s’était aussi enrichie. Remarquons encore que nous n’avons pas fait d’analyse psychologique des souffrances, des disputes de ses parents, ni même de ces 7 dernières années de frustration. Au contraire nous avons enjambé au plus vite le hiatus du JE, succinctement défini, sans nous intéresser ni à sa profondeur, ni à sa largueur. Nous nous sommes concentrés sur les moyens de jeter par dessus, notre pont tibétain qui comme chacun sait, se moque de la profondeur du précipice enjambé. Encore une fois ce n’est pas la souffrance qu’il faut principalement évoquer en consultation, mais tout ce qui peut barrer la route à son invasion. Vous reconnaissez une fois encore l’attention portée à un protocole bien réglé. D’abord confectionner avec le patient sa combinaison de protection sur mesure. Lui apprendre comment l’enfiler en tout lieu et en un instant. L’aboutissement de cette démarche permet d’aller jusqu’à combler un hiatus ontogénique par une évocation répétée et consolidée d’un objet subconscient alimenté par des expériences survenues avant et se prolongeant après le traumatisme. Le patient prend conscience de cette réparation de ces objets crées consciemment, et par invasions répétées trouve leur réplique dans le subconscient. il en dispose en autonomie complète et étendra l’usage de ses nouvelles compétences comme il en décidera et selon ses besoins. La prudence s’impose puisque cette sorte de prothèse va trouver sa place dans le subconscient du patient. Il faudra qu'il en garde la mémoire dans son dossier. Cas 8 : agression sexuelle contre un enfant, traumatisme d’enfant souffrance d’adulte. Ces traumatismes cumulent dramatiquement à la fois un hiatus ontogénique touchant en particulier l'image de soi et l'altération des outils d'acquisition de l'ontogénie par un parasitage des circuits neuro-humoraux dit de la "récompense". De plus, c’est un fait régulier que l’enfant agressé est victime d’auto-culpabilisation de sa petite personne. Le délabrement fonctionnel se complique de conflit entre objet subconscient dans la phase de construction du premier monde construit. Il va s'établir une infirmité croissante. La libération de la parole de l’enfant est difficile et le silence couvre les années suivantes. Le parasitage du préconscient par l’invasion du sentiment de culpabilité conduit à la souffrance croissante avec ses conséquences fonctionnelles. Comment comprendre et faire reculer les conséquences des effets de plusieurs décennies d'invasions toxiques aboutissant à une ontogénie pathologique et un soi parasité ? Ici il s’agit d’une petite fille agressée sexuellement entre 7 et 11 ans lors de rituel survenant chaque été lors de promiscuité de deux semaines avec deux garçons plus âgés de 3 ans. C’est 25 ans plus tard qu’elle peut révéler ces traumatismes tenus sous silence. Elle qui était décrite si heureuse et rayonnante, décrite par ses enseignants comme à l’aise à tout propos, toujours entourée d’ami(e)s de copains et copines, d’activité associatives, et de succès scolaires etc. Depuis la fin de l'adolescence elle a connu des échecs sentimentaux et pris conscience de souffrances, perturbantes, avec symptomatiquement des troubles du sommeil majeur. Elle a tenté plusieurs prises en charge thérapeutique. Nous comprenons qu’elle est en souffrance depuis très longtemps. Nous comprenons que comme enfant, elle ne pouvait disposer d’aucun outil pour résorber un tel traumatisme. Nous comprenons que dans ce contexte l’énoncé des souffrances ne peut survenir spontanément. Elle est arrivée à bout de force dans son effort pour surmonter silencieusement les conflits développés dans son subconscient depuis le traumatisme de l’enfance. Les séquelles se sont profondément implantées depuis 25 ans . Sa vie est comme entravée. Il est urgent de mettre fin à l’extension du malheur. D’abord l’explication des mécaniques psychiques déclenchées par ces agressions, et du silence maintenu et de ses conséquences va amener à une forme de cicatrisation fonctionnelle de cette plaie ouverte. Pourvu que le silence et l’ombre cessent, la mécanique du malheur peut être stoppé, l'objet d'auto-culpabilisation est ici le moteur infernal qu'il faut disloquer d'urgence. L’{{g|explication}} pour la victime amène à exposer ce qui est connu des stimulations «vitales» (alimentation, sexe) et du circuit de la «récompense». Le mot « récompense » évoque bien que le système nerveux répond à certains évènements par une action biochimique visant à inscrire l’évènement comme bénéfique et donc en favoriser son renouvellement. Cette action est puissante car elle vise à perpétuer les fonctions vitales autant pour l’individu que pour l’espèce. C’est le cas en particulier pour l’alimentation et l’activité sexuelle. <blockquote>CONTESTATION DES MOTS ....... [[Essai pour un modèle de psychisme objectif/des mots à recadrer|retour sur l'usage des mots à propos des viols et des viols d'enfants ! quand il faut comprendre circuit de la soumission au lieu de circuit de la "récompense"]]</blockquote> Ce mot de {{g|récompense}} devient totalement incongru, face aux effets délétères sur l'ontogénie découlant de la perversion de ce système. Cette perversion est flagrante dans le cas des maltraitances sexuelles. L’explication de l’effet délabrant des agressions sexuelles sur enfant tient dans cette perversion «neurochimique». L’agression sexuelle, le viol, est un traumatisme catastrophique car elle détourne les outils neurophysiologique permettant la constitution ontogénique et va induire la production d'objets subconscients toxiques: image de soi, JE sexuel, auto-culpabilisation. Son mécanisme est particulièrement pervers, car il utilise le mécanisme neurochimique de «récompense» pour soumettre la victime à l’agresseur. Nous parlons ici d’un agresseur qui présente à sa victime une succession d’expériences qui va de la plus banale caresse au viol physique. Les premiers attouchements sont présentés sous le jour du jeu, de la découverte, voire de l’émancipation et conduisent à activer une excitation sexuelle graduelle qui enclenche physiologiquement le circuit de la «récompense». Ainsi se développe chez la victime de «l’initié» une tolérance et une attente neurochimique qui submerge sa vigilance armée par des avertissements et des interdits plus ou moins transmis par l’éducation. L’action progressive et maline de l'agresseur met en scène une forme de consentement de la victime. C’est cette «tolérance» qui est avancée par l’agresseur de l’enfant pour se disculper du résultat, en arguant du soit disant consentement de la victime. En effet l’ignorance de la victime sur les mécanismes mis en jeu pour la soumettre, l'expose d'autant à la puissance du mécanisme enclenché. Il est alors facile de comprendre combien l’agression sexuelle contre enfant est facilitée, d’autant qu’elle peut se développer dans un milieu considéré non dangereux comme le milieu familial, associatif, religieux où la première méfiance est levée et où l’enfant est «pris par surprise». Bien entendu l’enfant est ignorant de ce que son circuit dopaminergique permet d’inscrire dans sa mémoire subconsciente, mais il vivra dans un conflit impossible entre son circuit de la «récompense» et la construction de sa personne. Car bien sûr, cette sexualité non délibérée, pervertie, va entraver, perturber, celle qu’il voudra établir dans le reste de sa vie. C’est alors que la gravité de cette agression s’impose avec encore plus de conséquence qu’un viol contre une personne disposant, déjà dans ce domaine, d’un référentiel pour son système de récompense. C’est un cas manifeste de ce que j’appelle par ailleurs un hiatus ontogénique. Ce hiatus comporte une lacune de la construction du JE à propos de la réponse à l’angoisse primitive dans le champ sexuel. Ce hiatus est d’autant plus sévère qu’il touche non seulement à la construction des objets subconscients venants habituellement constituer la base de l’image du corps sexuel dès l’enfance mais aussi à la déformation du circuit de la «récompense» qui est impliquée tout au long de la vie dans le SOI. Dans le modèle plusieurs objets subconscients sont produits avec en premier lieu un «sentiment de culpabilité» très invasif sur le préconscient. Ces invasions parasiteront le vécu postérieur. <blockquote>digression ....... [[Essai pour un modèle de psychisme objectif/hasard et aléa|Hasard et Aléa, réflexion philosophie personnelle]]</blockquote> <blockquote>LE PREMIER REFLEXE !..... [[Essai pour un modèle de psychisme objectif/la combinaison de protection|LE SOUFFRANT ET SA COMBINAISON DE PROTECTION]]</blockquote> Et pourquoi le silence ? C’est un fait général, l’enfant maltraité en particulier sexuellement, garde le silence. Chercher les raisons de ce silence semble ardu. Encore une fois son explication doit prendre en compte la nature des objets subconscients créés lors de ces agressions et liés au circuit de la «récompense ». <blockquote>LE PARADOXE AFFECTIF..... [[Essai pour un modèle de psychisme objectif/paradoxe affectif|l'enfant maltraitant qui refuse l'affection]]</blockquote> Quatre facteurs se conjuguent pour permettre la compréhension : # La perception des agressions est rendue confuse dans le subconscient de l’enfant du fait du climat neurochimique. Leur résurgence renvoie vers le puissant système de {{g|récompense}}. Sous l'influence de ce système les faits perdront leur objectivité, la sidération complète l'incapacité mnésique objective et donc la dénonciation. # Les interdits transmis par l’éducation, et la société en général, où la personne est décrite comme responsable d’elle même, renvoient vers un sentiment de culpabilité, injustement endossé par la victime. C’est la honte de ne pas avoir la bonne image, la maîtrise de soi # La crainte d’être incompris, de la perte d’estime, du rejet et de perdre son SOI d'aillerus encore non atteint dans l'enfance où c'est le JE qui est construction.. #:<blockquote>CONTRIBUER A LA PÉDAGOGIE SEXUELLE ....... [[Essai pour un modèle de psychisme objectif/socio psychologie préventive| quelques éléments psychosociaux à prendre en compte]]</blockquote> # La pulsion sexuelle va s’exprimer à l’adolescence avec force et donner l’élan à une appropriation, individuelle qui peut en cas de fusion bénéfique combler le hiatus ontogénique. Mais ces circonstances palliatives seront entravées le plus souvent puisque la régression-fusion au dessus d’un hiatus ontogénique, comme nous l’avons vu, est empêchée sans réparation préalable, comme celle du {{g|pont tibétain}}. À défaut le silence va occulter les échecs dont la responsabilité est une nouvelle fois endossée par la victime. Voilà donc une explication des destructions et dissimulations cumulatives, consécutives à une maltraitance sexuelle sur l’enfant. La réparation s’opérera en pleine connaissance de ces mécanismes et de façon méthodique. J’insiste sur la faille constitutionnelle neurophysiologique du système de récompense. Elle explique la grande reproductibilité de ce type de maltraitance contre les enfants par des agresseurs dont l’histoire révèle qu’ils reproduisent un schéma acquis par eux lors des maltraitances qu’il ont eux mêmes subies ou dont ils ont été témoins. Cette contagion est d’autant plus forte qu’elle se produit en milieu fermé dont le cercle familial est l’archétype comme les sectes, les groupes et associations etc . Que l’agresseur soit lui même enfant ne change pas le mécanisme morbide. La «tolérance» a conduit à l’aggravation de l’agression d’année en année sur 4 ans de 7 à 11 ans. Toujours dans le silence, elle a su seule dire «NON» à l’agresseur alors que le mal extrême s’accomplissait. Ce long rappel des mécanismes impliqués chez la victime, démontre bien combien le sentiment de culpabilité qui en découle est injuste. Hélas ils annoncent la double peine d’être victime puis de s’en martyriser, comme chez tous les enfants maltraités. En effet après le traumatisme de l’agression, le silence perdure. Alors aucun secours n’est entrepris, aucun soutien salutaire, ni suivi compétent n’est organisé. Le silence s’explique par le conflit entre les invasions subconscientes et les préventions éducatives à propos de la propriété exclusive de son sexe et par conséquent à mesure que cette éducation se complète l’auto-culpabilisation se renforce. Au fil du temps une aggravation du sentiment de culpabilité s’opère face à des parents aimés et aimants, ignorant les souffrances de la victime. Le sentiment de culpabilité pour cause de silence s’accentue donc, et un objet subconscient va lier le regard aimant par exemple des parents, à ce sentiment de culpabilité. Le lien symbolique entre affection et invasion du sentiment de culpabilité s'enracine. L’affection déclenche paradoxalement une invasion toxique. Cet objet subconscient d’auto-culpabilisation, par nature invasive, étend son territoire, et sa présence dans le préconscient devient récurrent et perenne. Dès lors les processus de communication et de fusion seront {{g|parasités}} : Les manifestations d’affections sont ressenties gênantes, évitées, voire repoussées, car elles galvanisent la dissimulation et donc l’auto-culpabilisation, comme un cercle vicieux. L’Incommunicabilité s’établit comme une défense subconsciente dès lors que l’objectif est le silence. La personne s’approchant involontairement de cette défense est vécue comme un agresseur contre l’effort de dissimulation devenu constitutif du préconscient. Alors que le malaise de l’adolescent et du jeune adulte s’aggrave, la distanciation vis à vis en particulier des aimants est une barrière qu’il est conduit à consolider. Ce phénomène parasitera pré-consciemment le ressenti des rapprochements affectifs. Voilà décrit le mécanisme subconscient qui impose la distanciation de l’aimant pour éviter l’invasion culpabilisante. Il découle de cette souffrance chronique une censure affective croissante. L’affection d’autrui devient comme un miroir renvoyant l’image de l’enfant culpabilisé, cette image parasitée devient intolérable pour la victime elle même qui se résignera au renoncement affectif pour y échapper. La rupture des liens affectifs revient à briser ce miroir pour mettre fin à son reflet. Les explications qui précèdent, permettent de comprendre par quel mécanisme s’établit la souffrance. Comme nous savons, cette analyse, cette explication, de type conceptuelle est incapable de dissoudre la souffrance, elle même constituée d’un amoncellement subconscient par 25 ans d’invasion et de parasitage du préconscient. L’organisation de la souffrance. I) Mécanisme de la mise sous silence. Il s’agit d’un enfant ayant subi une agression sexuelle. Dans le texte précédent «l‘explication» nous avons mis au jour: a) que l’agression est souvent «tolérée» sur une longue période par le fait qu’elle utilise une activation pervertie du système neurochimique dit de «récompense» b) qu’elle génère en même temps un sentiment de culpabilité, lié au conflit entre les objets subconscient des agressions subies sous influence du système neurochimique de récompense et les objets subconscients constituants du Je sexuel et finalement du Soi sexuel, influencé par l’éducation et plus généralement la socialisation. (L’implication de l’éducation sera abordée plus loin) c) que dans un tel contexte, le silence est maintenu par un enfant (et même souvent un adulte) qui ne dispose d’aucun outil, d’aucune distance introspective pour échapper à cette mécanique morbide. II) Conséquences du silence Rappelons nous que dans le modèle, les objets subconscients sont dotés de caractéristiques agrégatives, et d’une capacité d’invasion du préconscient. Les invasions sont déclenchées par des situations «gâchette». Certaines vont toucher toutes les victimes et en l’occurrence toute situation mobilisant le Je et le Soi sexuel meurtris, portant des cicatrices invalidantes. D’autres «gâchettes» sont liées aux modalités spécifiques de l’agression, ce sont les «flash» liés aux lieux, aux bruits, aux odeurs, aux contacts etc et au «monde intérieur» comme l’estime de soi, et le contexte biographique. Donc la souffrance ne s’arrête pas avec l’agression, elle se prolonge et même s’accentue au fil des invasions récurrentes qui sont inévitables en l’absence de soins compétents. Le silence induit donc la «double peine» pour la victime car il entraîne l’absence de soin et en conséquence l’extension du traumatisme initial. Le silence va alors compliquer les objets subconscients:A Parasitage du Je et du SoiComme dit plus haut, la période sans soin produira des invasions récurrentes qui parasiteront l’agrégation des nouveaux évènements relatifs au Je et au Soi sexuel de l’adolescent. Ainsi le préconscient, parasité par l’invasion toxique de culpabilisation, avec une force croissante, empêchera la constitution normale de tout objet subconscient de cette sphère. Nous pouvons prendre l’image d'un bruit parasite qui nous empêche de profiter d’une musique pourtant à notre goût et en définitive ne nous apporte pas de bien être. L’image du Soi sera donc altérée. Le vécu sexuel est «automatiquement «parasité» par l’invasion du le sentiment de culpabilité et le circuit de récompense entravé. Dans le cas d’une agression contre un enfant, selon le modèle c’est le JE qui sera marqué d’un hiatus, ce qui empêchera les régressions-fusions et donc entraînera la frustration affective. A Perturbation secondaires, indirectes: 1 D’ordre temporelle a) dans le futur, la suite, de l’évènement traumatique Le modèle montre comment un objet subconscient donc de type agrégatif va grossir au fil du temps. C’est aussi le cas du sentiment de culpabilité, installé par l’agression, et qui va s’agréger à d’autres situations où le Je et le Soi se trouveront en échec ou meurtris. L’enfant puis l’adulte connaîtra une invasion du préconscient par l’objet subconscient de culpabilité dans chacune de ses situations sexuelles et affectives en particulier. La victime endosse une culpabilité suite à toute difficulté, échec, frustration dans lesquels elle n’a même pas de responsabilité. La plaie va donc aussi s’élargir, avec des liens symboliques de culpabilité entre objets subconscients. Les invasions de culpabilité vont donc devenir pérennes. C’est la «double peine» pour l’innocente victime. b) dans le passé de l’évènement traumatique La caractéristique de non-temporalité dans la mémorisation des objets subconscients (cf essai psychisme) conduit à un nouveau risque. Ce flou temporel explique la puissance des invasions. Nous nous rappelons que l’odeur de l’encre si bénéfique dans le cas présenté dans « l’essai psychisme objectif» est un cumul d’expériences vécues tout au long de sa vie mais qui ne révèle sa stratification temporelle que lors d’un exercice mental précis. Le grand risque est que l’ évocation d’un moment T-x survenant en présence du préconscient envahi par le sentiment de culpabilité constitué au temps T, soit à son tour parasité par la dimension culpabilité_frustration. Cette explication schématique explique comment le parasitage dû à l’évènement T peut parasiter des objets antérieurs à l’agression. La plaie peut donc s’étendre dans les deux sens de l’axe du temps. L’agression altère donc non seulement l’avenir de la victime, mais aussi son histoire psychique antérieure à l’agression. 2 D’ordre spatial Par la caractéristique agrégative des objets subconscients, le sentiment de culpabilité si injustement subconsciemment inscrit chez la victime va sortir de la sphère sexuelle et s’étendre à d’autres sphères. En effet le silence lui même va devenir objet de culpabilité en particulier vis à vis des intimes, des aimants d’une manière général. C’est un fait connu que le silence consiste pour la victime à tenter de mettre une barrière en elle-même, à ne pouvoir exprimer sa souffrance pour elle-même. C’est aussi un fait général que le silence maintenu en face d’un intime ou d’un aimant est source d’un nouveau sentiment de culpabilité. Les situations affectives, sollicitant les régressions-fusions à l’instar l’exemple à propos de l’amour maternel, vont déclencher une invasion du préconscient par l’objet subconscient «culpabilité de dissimuler, de tenir le silence etc». Ainsi va s’établir une «gâchette» , ici la relation affective, où l’invasion négative du préconscient par le sentiment de culpabilité va devenir de plus en plus puissant et récurrent. Le parasitage de la vie affective va donc se généraliser et rendre cette sphère comme un objet de souffrance en lui même. Le conduite d’évitement vis à vis de la souffrance conduit à l’évitement affectif, voire la distanciation affective. Nous pouvons parler d’enkystement de la victime dans sa souffrance. En conclusion nous voyons que le traumatisme initial, directement responsable d’une meurtrissure dramatique va se compliquer faute de soins d’une invalidité fonctionnelle beaucoup plus étendue. Ainsi après deux décennie d’ignorance, jusqu’à la révélation faite par l’adulte issu de l’enfant meurtri, tout explique la distanciation affective ressentie par les aimants. L’enfant n’a pas pu se libérer de l’objet «sentiment de culpabilité» et donc l’adulte de l’objet subconscient «perte d’estime de soi» ce qui impose une «conviction préconsciente» d’être «non-aimable». Les aimants voulant s’inscrire en faut en face de cette état subconscient rencontrent les barrières de défense, l’incompréhension et la souffrance s’étend. La souffrance s’aggrave. La vraie cicatrisation vient par la neutralisation et la dissolution des agrégats parasités et accumulés durant ce long silence et més-jugement de soi même. III Soin après rupture du silence. <br />Nous voyons que même une fois le silence rompu, les soins doivent prendre en compte ce qui s’est construit dans le subconscient au fil des années. Les parasitages peuvent se retrouver dans des sphères variées mais la sphère affective est impactée dans tous les cas. La priorité exposée c’est d’abord de faire obstacle aux invasions du sentiment de culpabilité en y opposant à force égale une invasion d’estime de soi, de mérite d’être aimé. Ici le protocole proposé sera sollicité à son maximum. En effet l’objectif est d’abord de maîtriser toute invasion par le sentiment de culpabilité , puis par les techniques de recouvrement de «déparasiter» les objets subconscients. Comme tout au long du modèle, on observe que dès que le patient s’approprie le modèle et le schéma du protocole, il trouve un soulagement. Je souligne qu’une vertu recherchée par ce modèle, est de démontrer au patient qu’il sera acteur de ses soins. Cette prise de conscience est essentielle. En effet à la la suite de l’entraînement pédagogique pendant les consultations, pour apprendre les techniques de recouvrement, les nombreux objets parasités pour la plupart intimes seront manipulés par le patient lui même. Le pédagogue thérapeute ne sera impliqué que si le patient souhaite un soutien en cas de difficulté. Ainsi les anciens enfants maltraités éprouvent une difficulté particulière à retrouver les évènements heureux de leur existence. Voilà pourquoi la protection du préconscient est inaugurale dans la démarche de soin. J’ai tenté une mise en perspective du cheminement psychique. Les explications sont là pour éclairer le conscient et aider à faire entrevoir pourquoi le seul discours ne peut dissoudre la souffrance. Une conclusion essentielle est que la résolution des souffrances psychiques ne peut découler de l’activité du seul conscient. Une démarche éprouvée s’exprime dans le « protocole» mais d’autres voies sont connues et pertinentes à la condition préalable qu’elles commencent par une étape de protection contre les invasions pathogènes. Cette condition est incontournable, l’ignorer est délétère, je pense l’avoir démontré. IV la prévention: C’est sur cette influence que l’éducation doit progresser. Dans le texte «explication» à propos de maltraitance et viol d’enfant la conclusion engage à ne pas se satisfaire du message que le sexe est une affaire strictement personnel y compris relativement au parent. La conduite éducative résumée par «seul(e) toi peut toucher ton sexe, c’est toi seul(e) qui en fait la toilette» ne suffit pas à prémunir l’enfant des manipulations perverses et agressives. Cette conduite participe à la constitution du conflit entre tolérance induite par perversion du «système de récompense et référence éducative. C’est ce conflit psychique insoluble dans le silence qui l’impose pourtant à l’enfant envahi par l’objet «sentiment de culpabilité». Cette conduite éducative est donc une barrière factice, et elle contribue au &#x22;sentiment de culpabilité&#x22; lorsqu'elle est détournée. Ce message très partiel entoure cette zone du corps d’un voile énigmatique sans identifier clairement aux yeux de l’enfant innocent les dangers contre lesquels on tente de le mettre en garde. S’il fait fasse à une intrusion, il comprendra l’aspect transgressif de la situation mais il n’aura pas appris à désobéir aux dominants. Il faut insister auprès des enfants sur les mots de l’indignation et de la dénonciation comme sur ceux des consignes préventives. Conclusion Voici donc décrits quelques cas cliniques qui veulent mettre à l'épreuve et en même illustrer le modèle de psychisme objectif. J'ai choisi un progression dans la complexité des cas afin de laisser au modèle plusieurs occasions de se défendre. Je reste naturellement conscient qu'il faudra que je l'abandonne un jour pour un autre sans hâte quand il aura montré précisément ses limites face des acquis de la neuroscience encore inconnus pour moi. Ce modèle sert aussi de référence pour établir une action thérapeutique dont le trait essentiel est qu'il doit absolument respecter la dignité, l'autonomie et l'intimité du patient. Et pour conclusion je veux insister sur un acquis essentiel de cette modélisation du conscient et du subconscient pour un abord thérapeutique dont le véritable acteur est le patient lui même. L’introspection du subconscient est une activité salutaire, pourvu qu’elle s’appuie sur une connaissance pratique de sa structure et de ses attributs et pourvu qu’elle suive toujours une stratégie de protection en amont, contre les invasions toxiques. Aussi une psychothérapie, centrée sur la souffrance elle même, est de mon point de vue, formellement contre-indiquée. Réclamer au fil des consultations une répétition et un approfondissement des souffrances sans avoir fait enfiler au patient «sa combinaison de protection» est assimilable à l’exploration d’une cicatrice d’ampleur inconnue, à l’aveuglette, sans planche anatomique, ni anesthésie ou asepsie. Se placer d’emblée dans le domaine intime de la personne entraîne le patient vers une nudité qui contrevient à sa dignité, et va entraîner le praticien vers la «posture de gourou». D’abord ne pas nuire dit la déontologie du soignant. D’abord s’équiper d’une bonne anatomie, d’une physiologie démontrée, d’une bonne hémostase, d’une bonne anesthésie, de bons outils et d’une préparation aseptique du patient. L’éthique médicale et sa jurisprudence condamne désormais tout acte médical qui ne serait pas discuté avec un patient dûment informé des causes, des conséquences, des thérapies envisageables et de leur suite. Cette norme fait partie de l'obligation de moyen du au patient. Cette évolution est fondamentale, salutaire, elle conduit à reconnaître la personne du patient comme acteur de lui même jusqu’aux circonstances de son décès. Cette contrainte contribue à guider le soignant vers une posture autocritique qui lui donne la rampe du savoir authentique,celui qui se discute. J'espère que cet essai contribue à une prise en charge du psychisme respectueuse de ces principes. Le protocole en addendum expose des techniques générales largement abordées dans ce qui précède. En tout cas j'espère que les pages de gauche de cet essai et du protocole sont marquée par la libre expression critique et complémentaire, des lecteurs et lectrices, gage d'un véritable acquis, prouvant par là, que ce qui est n'est qu'un cas particulier de ce qui peut être, et qu’un miroir brisé reste un miroir utile. == Protocole de soin découlant du modèle de psychisme objectif == ===Ici commence la leçon de chose...=== -  Le conscient est représenté par une part franchement minoritaire de l'activité neuronale. Il contient des objets nettement figurés, les concepts. Cette représentation veut introduire le fait qu'un recours exclusif au conscient pour la pas compréhension envisageable. [[Fichier:PNL1 8.jpg|vignette]] -  Le subconscient est figuré comme disposant de la plus grande part de la masse et de l'activité neuronale. Il contient des objets mal circonscrits, "poreux" à des degrés divers. Ce schéma n'a pas de démonstration neurophysiologique. Il tente de schématiser les définitions plus complètes données dans l'essai du "miroir brisé". Ce schéma introduit une nouvelle notion. Il s'agit des objets subconscients en particulier dont la propension à l'invasion est marquée par une limite poreuse, pointillée. Il faudra identifier ceux qui sont marqués par "-" comme responsable d'invasion "toxique". Ceci pour rappeler que, comme nous le verrons dans ce protocole, de tels objets peuvent se retrouver circonscrits de façon hermétique par une succession de recouvrements bien conduits, ce qui leur fait perdre leur pouvoir toxique. Ici se retrouve figurée la position fonctionnelle du préconscient, propre au modèle présenté. Le préconscient n'est pas un stade flou du conscient mais une unité fonctionnelle, un filtre actif, paramétré par le contexte neurophysiologique d'une part, par une réjection physiologique d'autre part, et par une réjection psychique de bas niveau comme dans le cas de la sidération traumatique. C'est donc dans ce préconscient que se joue le destin des objets, qu'ils viennent de l'environnement actuel ou qu'ils viennent de processus d'invasion d'objets déjà en mémoire. [[Fichier:PNL1 7.jpg|vignette]] Ces deux derniers alinéas sont cruciaux pour la compréhension du modèle. Il convient de bien comprendre ce que l'on y admet comme postulat. La démonstration dépendra de la confirmation par les neurosciences qu'il existe une ou des aires associatives impliquées dans la création des objets psychiques. Ce postulat n'est donc déjà pas une fantaisie exotique, mais colle avec l'image que l'on nous propose actuellement du fonctionnement sensoriel par exemple.   La notion d'invasion du préconscient est donc une façon simple d'expliquer les perceptions différentes d'un individu à l'autre en fonction des contextes et antécédents. Ces invasions expliquent également très bien comment une évocation se produisant dans un préconscient déjà occupé par une autre, par exemple toxique, va remanier l'objet avant qu'il ne retourne en mémoire. Ce rôle dévolu au préconscient explique simplement le constat clinique de fluctuation mémorielle, d'occultation secondaire, ou d’exacerbation morbide. Comme expliqué dans l'essai, les réarrangements des objets ne sont pas généralisables. Nous en venons à entrevoir la probable extrême personnalisation des objets en particulier subconscients. C'est l'occasion de répéter pourquoi les apprentissages qui suivent s'attacheront à ne proposer que des travaux pratiques avec les objets les plus banals et "universels" possibles. Vouloir dérouler l’écheveau intime est un geste interdit par ce modèle, seul le patient lui-même pourra en être initiateur dès lors qu'il se sera approprié les étapes qui suivent. <blockquote>précision ....... [[Essai pour un modèle de psychisme objectif/invasion involontaire ou organisée|Remarque à propos d'invasion]]</blockquote> Voilà bien le premier objectif du protocole. La réalisation de cet objectif résout la plupart des plaintes exposées par les patients, en terme de troubles adaptatifs, bien entendu dès lors que la cause iatrogène a été écartée. Ainsi les conséquences d'un surmenage ne peuvent être sérieusement résolues sans recours à l'arrêt de travail, la redéfinition de la fiche de poste, et une reconsidération ergonomique, transport, alimentation, éclairage, condition du sommeil et autres charges mentales. Il est médicalement hors de question de se servir des techniques du protocole comme d'un cache-misère pour tenter de repousser la symptomatologie de l'épuisement. L'objectif de la prise en charge doit donc être bien élucidé avec le patient, dans une prise de conscience globale socio-physiologique. [[Fichier:PNL1x6.jpg|vignette]] L'image du cauter sur la jambe de bois est bien utile à garder dans la mémoire du soignant comme une bêtise sans excuse pour un professionnel. -  Le pédagogue qui initie le protocole est idéalement médecin puisque, comme nous l'avons vu, ce qui semble de nature psychique peut parfaitement découler directement d'un dysfonctionnement organique, et donc l'art du diagnostic médical est inaugural de toute prise en charge. Une fois les causes médicales écartées, le pédagogue pourra être un soignant pédagogue entraîné, initié par exemple par cette lecture. Nous sommes donc dans la deuxième consultation, après la leçon de chose et le devoir maison consistant à identifier les objets psychiques pré-sentis par le patient comme bienfaisants et, nous insistons, banals. [[Fichier:PNL1 5.jpg|vignette]] C'est le soignant qui travaille devant le patient en pratiquant l'exercice pour de bon, puisqu'il s'agit d'une situation banale que lui-même connaît. Par exemple le petit-déjeuner et sa tartine grillée. Il démontre la méthode rigoureuse: - Avec le lever de rideau: J'ai la chaleur du lit sur mon corps...... 20 secondes de silence au moins en expliquant qu'un débutant devra laisser encore plus de temps pour que "l' invasion sensorielle tactile" se produise. j'ai le contact du carrelage sous mes pieds .......... silence, et ainsi de suite pour tous les canaux. - Y succède la situation bienfaisante identifiée par le souffrant comme ici le banal petit-déjeuner.   j'ai le bruit de la bouilloire ....... j'ai l'odeur du café ......   j'ai le reflet du café ....... j'ai le contact de la cuillère....... j'ai la résistance du miel dans le pot ....... avec toujours ce long silence indispensable pour "laisser le subconscient s'exprimer". [[Fichier:PNL1 6.jpg|vignette]]   Il faut bien considérer que cet énoncé semblera à tout lecteur comme à l'attente d'une découverte extraordinaire comme d'une rusticité décevante. Et pourtant cette rusticité, faite de phrases "anti-littéraires" est la condition de cette découverte. En effet si la connexion entre objets conscients et langage est consubstantielle, elle est la découverte étonnante de la PNL pour ce qui concerne les objets subconscients. Deux choses sont donc essentielles à enseigner et s'approprier. Passez à côté et vous n'atteindrez jamais l'objectif. La première est que la sollicitation d'un objet subconscient par un des canaux sensoriels ou du "climat neurophysiologique" ne doit rien comporter qui puisse motiver l'activation de l'intelligence conceptuelle. Voilà l'explication de la forme parfaitement élémentaire des phrases. "j'ai l'odeur du café" serait volontiers rectifié par "je sent le café". Eh bien c'est ce qu'il ne faut pas faire, car la moindre référence à un verbe spécifique activera probablement la machine de décryptage linguistique, propre de l'intellect humain et de son activité consciente. Il faudra donc respecter scrupuleusement le dépouillement linguistique prescrit. La deuxième chose essentielle, c'est la pause, le blanc, le vide qui doit suivre chaque invitation à un canal quelconque à renvoyer ce qu'il a enregistré. Au moins 20 secondes peut paraître long, mais c'est un minimum surtout pour un apprenti qui doit penser plutôt à une minute. D'ailleurs lors des premiers exercices, beaucoup d'ouvertures de canal resteront muettes, plus pour certains patients que d'autres. C'est pourquoi j'ai choisi que la première séance soit une démonstration commentée mais effective du soignant, du pédagogue devant le patient. Vous comprendrez pourquoi il est essentiel que la situation bienfaisante choisie soit d'un ordre des plus banals. Il s'agit de travaux pratiques d'acquisition d'une technique. L'objectif est de démontrer et d’entraîner le patient à la découverte du phénomène invasif, puisque au bout de 2 ou 3 séances il se sentira effectivement envahi par la "vraie" odeur du café et de la tartine grillée par exemple. L'acuité ressentie est la confirmation qu'il s'agit bien d'une invasion par un objet subconsient. Bien-sûr les situations banales choisies peuvent être très variées, dans une palette banale déjà large: marcher en forêt ou ailleurs, se coucher sur une serviette de plage dans le sable, une promenade à vélo, caresser un chien etc....Le choix de ce matériel de travaux pratiques sera bien-sûr fait dans la liste que le patient présente après son premier travail maison. La situation exploitée tiendra compte peut-être du flaire du soignant. Par exemple s'il s'agit d'aider un étudiant en difficulté pour une prise de parole à l'oral, une situation de sérénité où le canal auditif est prégnant sera tout indiqué et donc l'évocation de l'écoute d'une musique pourra être d'emblée pertinente. En tout cas c'est l'apprentissage de la technique qui a la priorité. Moi-même qui faisais partie des sceptiques, bien campé dans la rationalité, j'ai dû me plier à cette quasi-discipline sportive, comme de respecter les consignes du prof d'éducation physique qui impose un placement strict des appuis pour faire une simple roulade. Bien-sûr ma devise,"ce qui est n'est qu'un cas particulier des possibles", m'a poussé à cette exploration. Chacun va trouver,  dans la décontraction de cette lecture, l'occasion d'un lâcher prise indispensable. <blockquote>précision ....... [[Essai pour un modèle de psychisme objectif/il faut commencer en amont|Remarque à propos d'invasion]]</blockquote> La démonstration par le soignant pédagogue inaugurera la suite des exercices à domicile par le patient comme devoir maison. Il faut insister sur l'absence de préjugés quand aux premiers résultats, c'est le processus habituel de tout apprentissage. Lors de la séance suivante le pédagogue observera l'exercice réalisé par le patient devant lui. Bien évidemment de nombreuses rectifications s'imposeront. les encouragements présideront - ne dîtes pas "je sens le poids de mon dos dans le sable" mais "j'ai le contact de mon dos sur le sable" puisqu'il faut faire la chasse à tout ce qui motiverait l'activité de l'intellect. - laissez la pause s'écouler, s'écouler  ......... et ainsi de suite, pour voir consolidée la technique de base, encouragée par la découverte de la réponse du subconscient. Si par exemple le canal "j'ai le bruit du café versé (dans le bol)" a été ouvert, vous pourrez encourager le patient à essayer de décrire le "peuplement" du canal auditif lors de cet évocation en mode associatif. Le patient, après avoir surmonté en quelque sorte sa surprise, pourra exprimer que ce "bruit" est en fait comme une musique d'un raffinement que la vie quotidienne gomme par l'urgence. Oui l'analyse quasi spectrale d'un son est possible lors de l'évocation car le subconscient enregistre bien plus de données que le cerveau conscient (sauf à considérer l'expertise d'un ingénieur du son ou d'un musicien concentré à priori sur les harmonies) Au fil des exercices et de leur contrôle en séance, le patient, spontanément ou avec l'aide des calibrations rapportées par le soignant, découvre le caractère particulièrement invasif de tel objet ou tel canal. Cet élément "gâchette" évoqué dans l'essai fonde par la répétition ce qu'on nomme un ancrage. Le rôle de l'ancrage bien rôdé est de mettre à la disposition du patient qui l'a mis à jour un raccourci vers une invasion bienfaitrice, protectrice. La combinaison de ces invasions parfois initiées par un rappel d'ancrage constitue la combinaison de protection qui est mise en avant dans le modèle pour un psychisme objectif. L'exemple le plus universel de l'ancrage est celui que l'enfant et son entourage construit autour du doudou. Il est flagrant de constater l'effet immédiat de réassurance, voir d'invulnérabilité que l'enfant puise dans le contact avec son doudou qui d'ailleurs est largement exploité en urgence par les parents emphatiquement entraînés dans une angoisse alors vite résolue. Bien-sûr, les combinaisons de protection dont nous avons l'ambition ici seront beaucoup plus spécifiques, personnalisées, et adaptées aux souffrances du patient. Il sera fondamentalement acteur de cette combinaison, en étant propriétaire exclusif de cette combinaison dont finalement le soignant sera simple témoin, même s'il a pu suggérer ouvertement telle ou telle opportunité signalée par la calibration. Alors disposant de cette combinaison de protection, le souffrant aura souvent résolu le processus d'épuisement psychique qui l'a fait consulter. En effet dans de nombreux cas de la "vie de fou" qui caractérise l'époque moderne, où le cerveau est sursollicité par 3 téléphones, une radio, une télévision, la conduite d'engin stressant, les nuits sans repos, les vacances suractives, les conflits de toutes sortes, le seul fait de comprendre notre fonctionnement et les moyens de le modérer est la solution attendue. Heureusement les causes de souffrances psychiques tiennent souvent du dépassement du domaine de fonctionnement pour lequel notre cerveau est construit depuis quelques dizaines de milliers d'années. Parfois encore le seul fait d'avoir acquis cette protection permet au patient d'alléger sa charge morale et ainsi de prendre la maîtrise sans aide spécifique. Dans d'autres cas, ce sont des phénomènes invasifs toxiques qu'il faudra apprendre à circonscrire, à refroidir comme l'image d'un cœur nucléaire, puis à reclasser sur l'étagère des mauvais souvenirs dûment étiquetés et ayant perdu leurs capacités incontrôlables d'invasion toxique. Dans cet objectif toujours dans la conduite de travaux pratiques, un nouvel apprentissage débute avec à chaque séance une séquence rigoureuse. Avant tout, enfiler la combinaison de protection. Puis seulement et à propos toujours de situations invasives dont le caractère mineur et banal aura été établi, commencera l' évocation en mode dissociatif. Cette fois les phrases rudimentaires ouvrant les canaux de l'objet désagréable banal comme le bruit du camion poubelle à 5 heures du matin seront introduites cette fois par "c'est moi qui ai le corps tendu....." suivi de ce fameux silence laissant la parole au subconscient, "c'est moi qui ai le bruit du choc des poubelles", "c'est moi qui ne retrouve plus le sommeil" et ainsi de suite pour chaque canal. À l'issue de ces exercices, le patient va expérimenter une mise à distance, un filtrage de l'objet agressif par le préconscient ancré dans la protection. Il va prendre de l'assurance vis à vis de cet effet protecteur. Puis qu’ici c'est le bruit des poubelles qui est la cause du réveil brutal, l'ancrage protecteur, la combinaison de protection devra comporter une sensation sonore dont l'évocation en mode canal sonore est particulièrement apaisante. Ainsi l' évocation en mode dissociatif du bruit des poubelles sera amorti, absorbé par le canal de la combinaison puissamment envahi par le bruit blanc d'un champ de blé mûr sous la brise thermique par exemple. Voilà ce qu'est le recouvrement d'un objet agressif par la combinaison de protection et son ancrage sonore. Dans l'essai pour un psychisme objectif, nous reconnaissons le rôle dévolu au préconscient. L'invasion protectrice qui inaugure toute autre évocation en mode dissociatif va protéger les canaux sensoriels mais aussi imposer son climat neurochimique. L'évocation en mode dissociatif est donc soumise à cette couverture de protection. Comme nous le savons, tout rappel mémoriel va donner lieu, surtout dans le domaine des objets issus du subconscient, à une nouvelle mémorisation, mais cette fois influencée par les canaux et le climat neurochimique de la combinaison de protection. Ce remaniement mémoriel circonstancié va conduire à circonscrire l'objet toxique et lui faire perdre ses liaisons gâchettes, au point que le bruit des poubelles sera d'emblée mixé en quelque sorte, filtré, amorti par celui de la brise sur le champ de blé. Cette fois c'est bien d'une thérapie mémorielle dont il s'agit, et une fois cet exercice maîtrisé sur la situation banale, il pourra être entrepris pour d'autres objets spécifiques aux souffrances du patient. Bien entendu, dès lors qu'il s'agit de choses plus personnelles, le pédagogue ne pourra pas jouer la démo devant le patient. Voilà pourquoi le souffrant doit s'être approprié parfaitement les techniques sur les objets de travaux pratiques, pour se retrouver en autonomie dans la maîtrise dissociative des invasions toxiques qu'il voudra circonscrire dans son intimité. Remarquons que le soignant pourra au mieux anticiper les besoins du patient, en l'aidant à lister les caractéristiques pertinentes de sa combinaison de protection et de ses ancrages protecteurs en fonction des invasions toxiques que le patient pressent. L'exemple du bruit de poubelles conduira le soignant à guider le patient vers une protection particulièrement puissante pour le canal auditif. Donc la composition de la combinaison de protection, dès lors que l'on engage une thérapie aussi complexe que dans les cas 7 et 8 de cet 'essai pour un psychisme objectif, va nécessiter une concertation fine avec un soignant expérimenté et restant imprégné par la prudence de ses propositions relativement à un patient qui par définition ne peut disposer à ce stade d'une clarification complète de ses souffrances. L'expérience apporte un constat trivial. Il faut que le patient dispose d'une combinaison très solide et pluri-compétente, ainsi que d'une procédure d'interruption de toute évocation qui serait responsable de mal-être. Comme abordé dans l'essai, les objets ne sont pas strictement isolés les uns des autres, les liens symboliques établis sans doute physiologiquement pendant le sommeil mêlent les climats neurochimiques d'objets dont l'association n'est pas reproductible entre individu. La encore l'expérience ne dispense pas de la circonspection et du respect du dernier mot laissé à la réflexion et l'intuition du patient. Dans l'exemple 7, nous avons vu comment une évocation d'objets distants sur l'axe temporel permet d'établir au sein du préconscient envahi bénéfique-ment par le climat neurochimique de l'affection de la grand-mère un objet symbolique très puissant agrégeant la manipulation des lainages avec le comblement d'un hiatus ontogénique. Le retentissement bénéfique de ce comblement ontogénique permet d'ouvrir la voie au processus complexe de la régression-fusion entravé depuis plusieurs années. C'est bien le hiatus, de part la mise à nue de l'angoisse primitive, qui entravait la régression-fusion indispensable à l' établissement de l'amour maternel que cette mère s'attendait à éprouver. Ce résultat est donc l'aboutissement du choix judicieux de l'ancrage lainage, en s'appliquant particulièrement sur son lien symbolique avec le canal du monde intérieur "sérénité, amour". Le préconscient a renvoyé dans la suite des objets ontogéniques celui qui constitue le pont tibétain. Le modèle proposé tient donc ses promesses pour guider et clarifier l'ensemble de cette réparation. Dans le cas 8, un écueil supplémentaire s'est constitué du fait de l' objet agressif la gravité de initial avec en particulier un canal neurochimique perverti. Ce canal de la récompense perverti a été dupliqué et agrégé aux évènements affectifs et sexuels d'une ontogénie interrompue, puis d'un SOI en souffrance. Puis par la constante de la double peine, le sentiment de culpabilité constant chez l'enfant maltraité a rendu par association symbolique les objets d'affection et d'amour comme gâchette d'invasion toxique insupportable. Ces invasions toxiques récurrentes puisque déclenchées par les contacts affectifs se sont mêlées aux évocations d'objets divers dont le remaniement mémoriel a conduit au parasitage de leur climat neurochimique. Par exemple tel objet vécu initialement comme heureux a subi ce remaniement mémoriel pour devenir toxique à son tour. Nous avons vu donc que l'on va constater une contagion pour des évènements non directement liés à l'affect. Le parasitage peut toucher aussi bien des évènements antérieurs à l'agression que des évènements plus logiquement postérieurs. Ce parasitage par les aléas des invasions concomitantes dans le préconscient touchera également des objets indépendants des symboles affectifs. Le patient va souffrir d'une amputation de ses objets bienfaisants par leur mutation en objets toxiques. L'image du miroir brisé rend compte de cette mémoire douloureusement perturbée, disloquée. L'application du modèle dans une telle situation est productive d'une vision claire des objectifs attendus de l'application du protocole. Cette application est précédée cette fois par les explications libératoires du sentiment de culpabilité, dont la résolution par un discours superficiel risquerait d'être le fameux cauter sur jambe de bois. Il reste à organiser les objectifs du protocole dans ce contexte complexe. L'urgence est de trouver des objets non parasités pour constituer une combinaison de protection spécifique dans le domaine affectif, estime de soi, sérénité et de ses ancrages confortables. Bien évidemment, comme le protocole le prescrit, aucune étape, en particulier les travaux pratiques sur des objets banals bienfaisants de la vie courante, n'est escamotée. La situation impose plus qu'ailleurs que le patient s'approprie le modèle puisque cette fois c'est sa propre circonspection dans l'évaluation de l'état parasité ou non des objets qui va assurer la puissance de sa combinaison de protection face aux évocations dissociatives thérapeutiques variées qui apportent la réparation fonctionnelle. Avant une réparation de type ontogénique la priorité va au déparasitage des objets ayant subi un remaniement mémoriel toxique. Viendra ensuite la réparation ontogénique par un pont tibétain. + Le modèle et le protocole conduisent à un enchaînement cohérent et éprouvé dans les cas les plus complexes, enkystés. C'est le caractère pédagogique de la démarche qu'il faut retenir. À l'instar de la pertinence du modèle qui trouve sa confirmation à mesure que le patient peut se l'approprier, le protocole dépend dans chaque cas de la place prééminente que prend le patient dans son application. [[Fichier:PNL1 10.jpg|vignette]] La double flèche grise entre l'objet négatif et le préconscient figure l'intervention d'une évocation en mode dissociatif. Cette forme graphique désigne le remaniement qui s'opère dans un préconscient préalablement envahi par la combinaison de protection. Dans la proposition "c'est moi qui ai l'odeur, le contact, le son etc", il y a la protection d'une vision indirecte à travers le filtre de la combinaison de protection. Le patient en quelque sorte se repasse un film dont il est réalisateur, se mettant en scène lui-même. Cette posture est rendue possible face à une situation toxique grâce à la protection filtrante de ses ancrages protecteurs déjà parfaitement rodés. Ce metteur en scène est en quelque sorte derrière une caméra filtrante et lui-même dans sa combinaison de protection. [[Fichier:PNL1 9.jpg|vignette]] Ce travail ayant abouti, l'objet toxique est figuré avec une limite continue, imperméable. Cette représentation tente de figurer la perte du potentiel invasif spontané de l'objet en question. Nous avons vu qu'il s'agit donc d'un remaniement mémoriel d'un objet subconscient par recouvrement des différents canaux, et en particulier par une modification du contexte neurochimique associé. L'évocation en mode dissociatif, sous protection de la combinaison adéquate, permet donc de modifier les données stockées, leur charge émotionnelle, et donc en fait le contexte neurochimique enregistré dans l'objet. L'objet traité ne disparait pas de la mémoire, il est remanié, circonscrit, son contexte neurochimique est modifié et, si sa résurgence survient, il aura perdu en toxicité, en contagiosité. Je résume en disant que le patient rangera l'objet sur l'étagère des mauvais souvenirs. conclusion Le modèle de psychisme objectif, prolongé par son protocole de prise en charge en médecine générale, s'adresse donc à la fois aux praticiens qui cherchent des pistes pour la prise en charge des nombreuses souffrances qui leur seront confiées et aux patients qui cherchent à comprendre une démarche de soin argumentée. J'espère que cet essai sera utile, et en particulier par les reformulations, les critiques, références bibliographiques que la lectrice, le lecteur aura inscrites dans les espaces libres des pages de gauche (de la version pdf). Pour des raisons de responsabilité et d'éthique, je renouvelle des consignes que j'ai faîtes miennes. - Ne pas suivre une posture de gourou hélas répandue et délétère pour le souffrant. - Commencer toute prise en charge par la constitution d'une combinaison protection, ce qui sera suffisant dans la majorité des cas. Toute démarche qui propose une prise en charge directe de la souffrance est selon moi dangereuse.   - Dès que des objets intimes devront être manipulés, c'est le patient qui doit passer maître de ses choix. Le soignant doit apporter des conseils de bon sens. Il faut commencer par combinaison de la protection adaptée, puis choisir l'épine la moins douloureuse, et finir par le pire. Un soignant expérimenté pourra donner des conseils plus détaillés en fonction des données de la calibration et de l'anamnèse. - Il faut accepter de revenir en arrière dans le protocole car, si une invasion douloureuse, c'est que la combinaison de protection n'est pas justement composée ou que simplement la fatigue impose la récupération, car, ne l'oublions jamais, le cerveau est le support du psychisme. C'est un organe  biochimique fatigable. Nul ne saurait aller contre un état d'épuisement en n'instaurant pas d'abord une  récupération biochimique qui viendra avec la mise à l'abri du surmenage, des agressions et des pollutions médiatiques. Bien entendu, un modèle comme celui présenté ne prétend pas détenir la vérité. Comme tout modèle il présente des concepts argumentés et des opérations décrites qui se justifient par l'étendue des situations qu'il permet d'appréhender. La pédagogie en matière de psychisme devrait être aussi centrale dans l'éducation à l'hygiène de vie que le lavage des mains dans l'hygiène des repas. Tout être humain devrait pouvoir se représenter son fonctionnement psychique afin de se comprendre lui-même et de pouvoir mieux comprendre les autres. Par le modèle de psychisme objectif chacun peut disposer d'un miroir de sa psyché et de certains moyens de prévenir sa dislocation et d'obtenir sa réparation. Les limites du modèle sont claires. La genèse des objets décrits, ainsi que leurs relations et les processus de remaniement mémoriels forment un système rationnel. Par le jeu de leurs combinaisons les objets forment des tableaux qui peuvent devenir complexe voire incompréhensible sans recours au modèle. Les psychoses sont en principe hors du champ de cet essai, de mon point de vue, car elles relèvent de la psychiatrie et de ses spécialistes. Ce que j'appelle l'hygiène psychique par contre est son champ d'application jusqu'à la névrose où ce modèle peut contribuer à une juste compréhension psychopathologique et donc à l'organisation des soins. Bonne santé et bonheur à chacun et à tous. == LE PROTOCOLE REGLE POUR LA MEDECINE GENERALE DANS LE MODELE DE PSYCHISME OBJECTIF == <blockquote>LE PREMIER OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole1]]</blockquote> <blockquote>LE DEUXIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole2]]</blockquote> <blockquote>LE TROISIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole3]]</blockquote> <blockquote>LE QUATRIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole4]]</blockquote> <blockquote>LE CINQUIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole5]]</blockquote> <blockquote>LE SIXIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole6]]</blockquote> <blockquote>LE SEPTIÈME OBJECTIF..... [[Essai pour un modèle de psychisme objectif/protocole7]]</blockquote> Et voici UN LIEN DU FICHIER POUR EXPOSER LA DEMARHE AU PATIENT ( la dernière diapo est animée par la barre d'espace) [https://drive.google.com/file/d/1aXmGoN8RORB9F2Cybxb3yTiNjvZP6jOY/view?usp=sharing] attention pour voir le contenu avec les images il faut le télécharger pour l'ouvrir avec Libre Impress... ce lien est externe car wiki common refuse les fichiers .ODP .... ce fichier est libre d'accès Postface La déclaration des droits de l'homme de 1948 contient beaucoup de traits révolutionnaires à mes yeux et nous  devons nous réjouir qu'elle soit citée en préambule de certaines constitutions. De même le préambule à la fondation de l'Organisation Mondiale de la santé pose une définition de la santé très novatrice, et qui me sert de référence dans ce domaine depuis le début de mes études de médecine La première inclut ce que l'on désigne par les droits créances. Ainsi elle reconnaît à toute personne humaine une créance dès sa naissance auprès du reste de l'humanité pour répondre à un certain nombre de besoins fondamentaux comme le logement, la nourriture, l'éducation, la sûreté, la santé. Hélas les états ont réussi à convaincre que ces exigences écrites et signées étaient des utopies trop coûteuses pour les finances des plus riches, et en définitive aucun à ma connaissance n'a ratifié ces textes. Nous observons actuellement la déroute intellectuelle de ces pragmatiques de comptoir face aux pandémies et au dérèglement climatique où leur culpabilité est notoire. La fondation de l'OMS repose sur une conception de la santé universelle où tout est abordé, avec de mon point de vue un génie non dépassé à ce jour. La santé mentale et affective y est décrite comme un droit universel. Cet essai souhaite contribuer à un droit trop superficiellement abordé, celui de disposer des moyens de se comprendre et de comprendre les autres. Bien entendu l'outil linguistique est un préalable dans l'exercice de ce droit et rejoint le droit à l'éducation. J'en profite pour situer la place  qui devrait revenir à une langue spécifiquement faite pour la communication comme la langue espéranto, reconnue par l'UNESCO, dont chacun peut disposer avec efficacité et gratuitement. La contribution de cet essai est de donner matière à réflexion sur la manière de permettre à chaque être humain de s'approprier son fonctionnement psychique. Comme pour d'autres domaines une pédagogie efficace est cruciale. En s'appuyant sur certains acquis, l'essai propose de lever le voile, d'objectiver un domaine trop souvent laissé en friche, où l'être humain perd sa liberté dans le silence de l'inconscience collective. Aux soignants je confie l'usage de cette pédagogie en espérant les aider dans ce domaine difficile, et les autres je les invite à une exploration de la psyché. [[Catégorie:Psychologie]] scjjkyvnwr8umv2zidrdj5h1i7x17zf Dictionnaire de philosophie/Chamfort 0 83799 764919 764800 2026-04-25T06:09:31Z PandaMystique 119061 764919 wikitext text/x-wiki {{DicoPhilo|Chamfort}} == Repères biographiques : naissance, formation, entrée dans les lettres == === Une naissance substituée === L'homme que la postérité connaît sous le nom de Chamfort est baptisé le 22 juin 1740, en l'église Saint-Genès de Clermont, sous le nom de Sébastien-Roch Nicolas, la date traditionnelle de 1741, que donne la notice d'Auguis, a été corrigée par Claude Arnaud à partir des registres paroissiaux. C'est le nom, et ce sont les prénoms, d'un enfant qui vient de mourir en bas âge chez l'épicier Nicolas ; c'est aussi le nom d'un enfant qui n'est pas celui du couple Nicolas. Sa mère biologique est Jacqueline de Cisternes de Vinzelles, dite la dame de Montrodeix, issue d'une très ancienne famille d'Auvergne de noblesse chevaleresque ; épouse depuis 1719 du procureur général Jean-François Dauphin de Leyval, seigneur de Montrodeix, mère déjà de deux filles, elle est enceinte à quarante-quatre ans des œuvres de Pierre Nicolas, chanoine semi-prébendé de la cathédrale de Clermont, parent de l'épicier. Pour étouffer le scandale, un échange de berceaux est arrangé avec la famille Nicolas, dont l'enfant légitime vient de s'éteindre. Le nouveau-né prend l'identité du mort, et l'épouse de l'épicier, Thérèse Creuzet, quarante-quatre ans elle aussi, devient sa mère officielle. Cet épisode, dont les éléments ont été établis par le baron d'Espinchal dans des mémoires inédits et confirmés par les recherches de Claude Arnaud, ne relève pas du simple pittoresque biographique. Claude Arnaud, qui a consacré à cette question les pages les plus neuves de sa biographie, voit dans la découverte de ses origines un événement dont les répercussions sur l'œuvre sont considérables. Vers l'âge de sept ou huit ans, l'enfant apprend de Thérèse Nicolas qu'il descend d'une lignée chevaleresque par sa mère, qu'il aurait pu être un Dauphin de Leyval ou un Vinzelles, et qu'il a été privé de son rang au nom des convenances. Cette découverte laisse sur lui une blessure dont on peut penser que l'œuvre ultérieure porte la trace, tantôt comme ressentiment avoué, tantôt comme méfiance générale à l'égard des institutions sociales, même s'il faut se garder de tout ramener à cette seule clé. L'adoption fait qu'il n'est plus tout à fait de la noblesse, sans être non plus vraiment du peuple : la condition de bâtard, au sens plein, inscrit en lui une double appartenance qui ne se résoudra jamais. Sa mère biologique et son père, le chanoine, semblent être demeurés à distance ; de Pierre Nicolas, mort en 1783, il ne parlera jamais publiquement. C'est à Thérèse Nicolas seule qu'il rendra les devoirs d'un fils, avec une piété filiale qui ne s'est jamais démentie et dont témoignent ses lettres. === Le collège des Grassins === Conduit à Paris à l'été 1750 muni d'une demi-bourse, Sébastien Nicolas entre au collège des Grassins, sur la montagne Sainte-Geneviève, l'un des établissements les plus exigeants de l'université (Arnaud, Chamfort, p. 23-25). Il s'y distingue d'abord par son caractère difficile, puis, à partir de la troisième, par des succès continus ; en rhétorique, il est présenté aux cinq épreuves du Concours général, remporte quatre prix, il manque le thème latin, puis, sur l'insistance du collège, remet ses quatre titres en jeu et l'emporte cette fois sur toute la ligne : son nom est inscrit en lettres d'or sur les cinq tableaux d'honneur du réfectoire. Ce succès, dont le souvenir ne le quittera plus quand il sera question de concours, de couronnes et d'académies, est inséparable d'une seconde formation, plus irréversible encore : la lecture des Anciens. Homère, Plutarque, Lucien, les Stoïciens nourrissent sa géographie mentale et dessinent un idéal de dignité que la société contemporaine ne cessera, à ses yeux, de démentir. Avant d'être renvoyé pour s'être opposé à son professeur de grec Lebeau, il songe un instant à partir pour l'Amérique avec son condisciple Letourneur : « Avant de faire le tour du monde, si nous faisions le tour de nous-mêmes ? » aurait-il dit à Cherbourg. Le trait est rapporté par Sélis, et le mot résume déjà une disposition dont les Maximes feront la méthode. Il quitte alors le collège et refuse l'état ecclésiastique auquel l'habit d'abbé, porté comme la plupart des enfants pauvres formés par l'Église, semblait le destiner. « Je ne serai jamais prêtre, dit-il au principal ; j'aime trop le repos, la philosophie, les femmes, l'honneur, la vraie gloire ; et trop peu les querelles, l'hypocrisie, les honneurs et l'argent. » La déclaration est prémonitoire ; elle trace à l'avance, non sans ironie, les limites que sa vie aura voulu tenir. === Les succès académiques et mondains === Jeté sans fortune dans la vie littéraire, Chamfort, nom qu'il se donne au début des années 1760, vit d'abord de travaux alimentaires et de sermons composés pour des prédicateurs. La reconnaissance vient par les voies convenues : la comédie avec ''La Jeune Indienne'' (1764), puis ''Le Marchand de Smyrne'' (1770) ; l'éloquence académique avec l'Épître d'un père à son fils sur la naissance d'un petit-fils, couronnée par l'Académie française, l'Éloge de Molière qui remporte en 1769 le prix de l'Académie, et l'Éloge de La Fontaine qui, en 1774, lui vaut celui de l'Académie de Marseille face à La Harpe ; la tragédie enfin avec ''Mustapha et Zéangir'', jouée à Fontainebleau en 1776 et qui lui vaut une pension sur les menus-plaisirs ainsi que la place de secrétaire des commandements du prince de Condé, emploi dont il se déchargera bientôt, ne supportant aucune forme de dépendance. Durant ces années, il partage sa vie entre les soins que réclame une santé ruinée par des maladies vénériennes contractées jeune, Spa, Contrexéville, Barèges, et la fréquentation des salons, en particulier celui de Madame Helvétius à Auteuil, qui demeurera pour lui une seconde famille. La réception à l'Académie française, en avril 1781, n'est obtenue qu'à la troisième tentative, après deux candidatures malheureuses et plusieurs désistements, notamment en faveur de Chabanon, qui avait menacé de se suicider en cas d'échec. Chamfort occupe le fauteuil laissé vacant par La Curne de Sainte-Palaye ; il y prononce un discours qui fit date autant par son brio que par ses ambiguïtés. Il y louait, comme il se devait, le roi, la reine, le prince de Condé et la compagnie qui le recevait, mais s'attaquait aussi, non sans audace, à la chevalerie que son prédécesseur avait étudiée, comme à une caste ayant pour vice principal la morgue et le refus de s'allier à d'autres classes, allusion à peine voilée à la noblesse de son temps. Cette dualité entre reconnaissance officielle et critique voilée, qui deviendra la marque de ses années révolutionnaires, est déjà entière dans ce discours. === Mirabeau, Sieyès, les années de la Révolution === La rencontre décisive de la vie intellectuelle de Chamfort est celle de Mirabeau, autour de 1783-1784. Pendant près de sept ans, selon le témoignage de Ginguené (Notice, p. xliii sq.) et l'analyse qu'en donne Arnaud (Chamfort, chap. 11-17), les deux hommes se voient presque chaque jour. Chamfort sert au comte plébéien de conseiller, de conscience, de correcteur et parfois de plume : il rédige ou co-rédige des passages importants des ''Considérations sur l'ordre de Cincinnatus'', des discours et des articles que Mirabeau publie ou prononce sous son propre nom, y compris le Discours contre les Académies que le tribun devait lire à l'Assemblée nationale en 1791 ; une fois Mirabeau mort, Chamfort publiera ce texte sous son propre nom. Cette collaboration souterraine, attestée par la correspondance et rappelée par Ginguené puis par Arnaud, place Chamfort dans une position originale : il est, selon le mot d'Arnaud, « l'éminence grise » de la première Révolution, l'homme qui parle par la bouche des autres et qui fait passer ses formules dans les discours et les journaux, refusant de paraître lui-même à la tribune comme il avait refusé de paraître au théâtre. Un collaborateur de Mirabeau, Dumont, résume : « Pendant que d'autres voulaient attaquer le colosse avec un bélier, Chamfort cherchait à le cribler de traits satiriques. » Sa seconde amitié politique, celle de Sieyès, est de la même veine. Chamfort appelait Sieyès son « puritain » ; l'abbé lui rendait un respect qu'il accordait à peu de ses contemporains. Selon une anecdote rapportée par le comte de Lauraguais et publiée en 1802, mais contestée dès cette date par Suard (voir Arnaud, p. 186-187, et les notes afférentes),, Chamfort aurait lui-même soufflé à Sieyès, au début de 1789, le titre et la formule qui firent le succès du pamphlet le plus célèbre de la Révolution : « Qu'est-ce que le tiers état ? Tout. Qu'a-t-il ? Rien. » Sieyès y ajoutera : « Que veut-il ? Quelque chose. » Vraie ou romancée, l'anecdote dit quelque chose d'exact : dans l'hiver précédant les États généraux, Chamfort était au carrefour des réseaux qui préparèrent la transformation du tiers en Assemblée nationale, et ses formules traversaient les brochures comme les conversations. Il est probable qu'il ait eu, par ces voies obliques, un rôle dans la formulation des mots qui firent la Révolution, sans jamais apparaître en première ligne. Devenu collaborateur du ''Mercure de France'' après 1789, Chamfort entreprend avec Pierre-Louis Ginguené, dont l'amitié sera le dernier appui de sa vie, et avec d'autres la publication des ''Tableaux historiques de la Révolution française'', accompagnés des gravures célèbres de Prieur. Il en fournit le texte des treize premières livraisons, composées chacune de deux tableaux, avant que la maladie et les persécutions ne l'obligent à abandonner l'entreprise, continuée par Ginguené. Nommé par Roland en 1792 à l'un des postes de direction de la Bibliothèque nationale, il y demeure jusqu'à son arrestation. Rallié d'abord aux Girondins, il dirigea brièvement la ''Gazette de France'' sous la même période,, méfiant à l'égard de Robespierre et des Jacobins dès 1791, il se trouve à partir de 1793 dans la position intenable de celui qui a servi la Révolution avec ferveur et qui la voit se retourner contre lui. === L'arrestation, le suicide, la mort === Dénoncé en juillet 1793 par un employé subalterne de la Bibliothèque, Tobiesen Duby, qui convoitait sa place et trouva dans ses propos imprudents les prétextes qu'il cherchait, Chamfort avait critiqué Marat publiquement, puis salué Charlotte Corday comme l'auteur d'une « œuvre sublime »,, Chamfort est arrêté à l'aube du 2 septembre 1793, date anniversaire des massacres de l'année précédente (le dossier du Comité de sûreté générale, Archives nationales F7 4638, est analysé par Arnaud, p. 283-292). Il passe deux jours à la prison des Madelonnettes, dans des conditions que son état de santé rendait presque intolérables : entassement, vermine, privation de soins, menace permanente du pire. Libéré sur ordre du Comité de sûreté générale, il doit vivre sous la surveillance d'un gendarme et jure qu'il ne se laissera jamais reconduire en prison. Lorsque, quelque temps plus tard, on vient lui signifier qu'il doit retourner en détention, au Luxembourg et non aux Madelonnettes, comme il l'apprendra trop tard,, il se retire dans un cabinet voisin, se tire une balle dans la tête qui lui fracasse la cloison nasale et l'œil droit sans pénétrer jusqu'au cerveau, puis, l'arme ayant failli, s'entaille à plusieurs reprises le cou, la poitrine, les cuisses et les mollets au rasoir. Les chirurgiens dénombreront vingt-deux plaies, dont plusieurs profondes, et laisseront la balle en place, jugeant son extraction mortelle. Contre toute attente, il ne meurt pas. Pendant plus de six mois, il survit dans un état de mutilation que Ginguené décrit avec effroi, recevant ses proches, commentant la politique, dictant des notes à son biographe, travaillant même, avec Ginguené et Jean-Baptiste Say, au projet d'une revue philosophique, ''La Décade philosophique'', qui verra le jour après sa mort. Il finit par succomber, non à ses blessures premières, mais à une erreur du chirurgien Brasdor, qui referma ses plaies sans leur ménager d'ouverture : l'humeur se répandit dans le corps et provoqua une violente inflammation de la vessie. Desault, un des plus grands chirurgiens vivants, fut appelé en renfort, mais se trompa de remède et décida trop tard une opération. Chamfort meurt le dimanche 13 avril 1794, veillé par ses derniers amis ; son enterrement, dans l'atmosphère de la Terreur, ne réunit qu'un très petit cortège, Ginguené, Sieyès, Colchen et Van Praet en tête. Son corps, jeté quelque temps plus tard parmi les restes anonymes des cimetières parisiens d'Ancien Régime, finira, selon toute vraisemblance, dans les catacombes. Ses manuscrits, pillés au moment des scellés, ne seront que partiellement retrouvés par Ginguené, qui en tirera en 1795 la première édition de ses Œuvres, celle qui a donné à Chamfort son existence posthume comme moraliste. == L'œuvre et ses formes == L'œuvre de Chamfort, telle qu'elle nous est parvenue, est volontairement hétérogène et ne se laisse pas aisément ranger sous une étiquette unique. Les cinq volumes que rassemble l'édition Auguis en 1824-1825 juxtaposent en effet des registres que la tradition littéraire avait jusque-là tenus séparés : la dissertation académique, l'éloge, la comédie et la tragédie, les contes en vers et les épîtres, les notes sur La Fontaine et sur Racine, les articles critiques destinés au Mercure, les ''Tableaux historiques de la Révolution'', et surtout les deux ensembles qui ont assuré sa survie, les ''Maximes et pensées'' et les ''Caractères et anecdotes'',, tous deux recueillis après sa mort par Ginguené sur les feuillets épars que l'auteur tenait par-devers lui et ne montrait à personne. Il est essentiel, pour bien lire Chamfort, de savoir qu'il n'a jamais voulu publier ces feuillets. Un long préambule, rédigé aux alentours de 1790 et que Ginguené a placé en tête des Maximes, énumère les raisons de ce silence : dégoût du public, peur de mourir sans avoir vécu, certitude que tous les hommes célèbres qu'il a connus ont été malheureux, refus enfin de vouloir plaire encore à qui ne lui ressemble pas. Cette dispersion formelle n'est pas un accident. Chamfort lui-même, dans le premier chapitre de ses ''Maximes générales'', avertit que la maxime n'est qu'un abrégé qui vaut par la finesse des observations dont elle procède, et que l'esprit médiocre transforme en règle absolue ce qui, chez son auteur, n'était qu'un relevé singulier. « Les maximes, les axiômes sont, ainsi que les abrégés, l'ouvrage des gens d'esprit qui ont travaillé, ce semble, à l'usage des esprits médiocres ou paresseux. » L'homme supérieur, poursuit-il, « saisit tout d'un coup les ressemblances, les différences qui font que la maxime est plus ou moins applicable à tel ou tel cas, ou ne l'est pas du tout ». Le fragment n'est donc pas, chez Chamfort, l'expression d'une vérité synthétique, mais l'enregistrement ponctuel d'un regard : il note ce qu'il voit, comme le naturaliste qui découvre, au-delà de ses classes et de ses divisions, « l'insuffisance des divisions et des classes ». Le caractère aphoristique de son œuvre majeure n'est ainsi pas une concession à la brièveté, mais la traduction formelle d'une méthode d'observation qui se défie des systèmes. On aurait tort, cependant, d'isoler les Maximes du reste de l'œuvre. Les Éloges de Molière et de La Fontaine, la ''Dissertation sur l'imitation de la nature'', le ''Discours de réception'' à l'Académie, le petit traité ''Des Académies'' qu'il composa pour Mirabeau, et jusqu'aux ébauches d'une histoire du théâtre ancien et moderne conservées dans le tome IV de l'édition Auguis, forment, avec les fragments moraux, un ensemble cohérent. On y reconnaît partout la même main : celle d'un écrivain pour qui la littérature n'est pas séparable de la peinture des mœurs, et pour qui l'histoire des formes, la fable, la comédie, l'éloge, est aussi une histoire sociale. Les ''Tableaux historiques de la Révolution'', de leur côté, prolongent pour le présent ce que les ''Caractères et anecdotes'' avaient entrepris pour la cour de Louis XV : fixer, dans une série de scènes détachées, le visage changeant d'une société qui se défait. === Les comédies et la tragédie === La carrière théâtrale de Chamfort est brève, cinq pièces entre 1764 et 1776, et inégale, mais elle engage des questions qui resteront au cœur de sa pensée. ''La Jeune Indienne'' (1764), comédie en un acte et en vers inspirée d'un épisode du ''Spectator'' anglais, met en scène une jeune fille élevée dans l'état de nature qui découvre les convenances de la société européenne et s'en étonne ; le thème, proche du Huron de Voltaire et de l'Ingénu, est celui du regard étranger porté sur les mœurs civilisées, et l'on reconnaît déjà, dans cette confrontation entre naïveté naturelle et artifice social, une intuition que les Maximes développeront dans un tout autre registre. ''Le Marchand de Smyrne'' (1770), comédie en un acte en prose, transpose la critique sociale sur un autre plan : un marchand d'esclaves y met en vente des captifs européens, parmi lesquels un gentilhomme et un chevalier, que personne ne veut acheter et qui finissent « donnés pour rien », satire de la noblesse que Chamfort rappellera lui-même, dans sa défense de 1793, comme preuve de ses convictions républicaines. La tragédie de ''Mustapha et Zéangir'', représentée à Fontainebleau en 1776 devant la cour, est l'œuvre la plus ambitieuse et, au jugement d'Arnaud, la plus révélatrice de ses limites d'écrivain dramatique. Le sujet est emprunté à l'histoire ottomane, les amours et la mort de deux frères, fils de Soliman le Magnifique, et le traitement s'inscrit dans la filiation racinienne : plusieurs scènes, selon Auguis, témoignent de la profondeur avec laquelle Chamfort avait étudié la manière de Racine, et « jusqu'où il en aurait peut-être porté l'imitation ». La pièce obtint un succès de circonstance, mais elle fut plus froidement reçue par le parterre parisien. Le demi-échec marqua Chamfort. Il n'écrira plus pour le théâtre, et ce silence volontaire est à la fois un trait de caractère, il ne voulait s'exposer qu'à coup sûr, et le signe d'un déplacement vers un mode d'écriture plus personnel, plus fragmentaire, moins dépendant du jugement collectif : les Maximes. Arnaud formule ce tournant en termes forts : Chamfort « mourut ainsi, sous la Terreur, en écrivain moyen, et presque oublié. De cette vie anthume il ne reste rien, sinon sa longue agonie, perceptible dans les maximes et pensées du second Chamfort. » === La critique littéraire : les Éloges, les Notes sur La Fontaine, le Commentaire sur Racine === Les travaux de critique littéraire de Chamfort ont été longtemps éclipsés par les Maximes, mais ils représentent une part substantielle de l'œuvre et méritent d'être considérés pour eux-mêmes. L'Éloge de Molière (1769), couronné par l'Académie française, est un morceau d'éloquence où la célébration du poète comique se double d'une réflexion sur les rapports entre la comédie et la connaissance morale. Chamfort y défend l'idée que Molière est un philosophe autant qu'un dramaturge, et que la peinture des mœurs, lorsqu'elle atteint une certaine profondeur, vaut un traité de morale. L'Éloge de La Fontaine (1774), couronné par l'Académie de Marseille aux dépens de La Harpe, prolonge cette lecture en y ajoutant une attention au détail poétique : Chamfort y analyse la fable non seulement comme un véhicule d'enseignement, mais comme une forme originale d'écriture dont la naïveté apparente est le fruit d'un art savant. Les Notes sur les Fables de La Fontaine qui accompagnent cet Éloge dans l'édition Auguis offrent un commentaire suivi, livre par livre, où Chamfort alterne observations stylistiques et réflexions morales, elles sont l'un des premiers commentaires détaillés consacrés aux Fables. Le tome V de l'édition Auguis contient, sous le titre d'''Essai d'un commentaire sur Racine'', des notes sur Esther et Athalie qui témoignent d'un égal souci d'analyser le travail du poète dans le détail de son texte. La ''Dissertation sur l'imitation de la nature'', enfin, est un essai théorique où Chamfort aborde la question du naturel dans l'art dramatique : il y distingue l'imitation servile de la nature, qui ne produit que des copies, de l'imitation créatrice, qui saisit les « traits saillants » d'un caractère et les compose en un type intelligible. La question du naturel, qui traverse toute sa réflexion, des personnages de la comédie aux maximes sur la « composition factice » de la société,, trouve ici sa formulation théorique la plus explicite. == La tradition moraliste et ses déplacements == === Chamfort au terme d'une lignée === Chamfort appartient à la lignée des moralistes français qui, de Montaigne à Vauvenargues, ont préféré la forme brève à la construction systématique et ont fait de l'observation des conduites humaines la matière même de la philosophie morale. Il reconnaît ses prédécesseurs sans détour : « Il y a deux classes de moralistes et de politiques : ceux qui n'ont vu la nature humaine que du côté odieux ou ridicule, et c'est le plus grand nombre ; Lucien, Montaigne, La Bruyère, La Rochefoucauld, Swift, Mandeville, Helvétius, etc. ; ceux qui ne l'ont vue que du beau côté et dans ses perfections ; tels sont Shaftesbury et quelques autres. Les premiers ne connaissent pas le palais dont ils n'ont vu que les latrines ; les seconds sont des enthousiastes qui détournent leurs yeux loin de ce qui les offense, et qui n'en existe pas moins. Est in medio verum. » Cette déclaration a l'apparence d'un éclectisme modéré, mais la suite de l'œuvre révèle un parti autrement plus décidé : si la vérité est au milieu, Chamfort campe ordinairement sur le versant sévère, celui qui voit dans la société l'ennemie de la nature et dans les usages consacrés autant d'artifices dont la raison, quand elle se ressaisit, reconnaît l'inanité. Le rapport à La Rochefoucauld est à cet égard le plus significatif. Chamfort lui doit le goût de l'antithèse courte, de la chute paradoxale, de la démystification de l'amour-propre. Mais il déplace le centre d'analyse : chez l'auteur des Maximes, l'amour-propre est une disposition universelle, une loi de la nature humaine abstraite de tout cadre social ; chez Chamfort, il est toujours situé, inscrit dans un ordre de rangs, d'emplois et de préjugés dont il faut aussi dresser l'inventaire. La critique se fait institutionnelle autant que psychologique. « La plupart des nobles rappellent leurs ancêtres, à peu près comme un Cicerone d'Italie rappelle Cicéron » : la pointe ne porte plus seulement sur un trait de caractère, mais sur un état social qui confond la gloire héritée et la gloire due. C'est en ce point que Chamfort prend congé du moraliste classique : il inscrit les maximes dans une sociologie, et il rend à la critique de l'ordre social ce que le pessimisme janséniste avait rendu à la critique de l'amour-propre. === L'ascendant des Lumières === À la tradition moraliste s'ajoute la pression des Lumières. Chamfort a lu Helvétius et fréquenté son cercle, il s'est nourri de Rousseau et de Diderot, il connaît les physiocrates et l'Encyclopédie. De l'utilitarisme helvétien, il retient l'idée que l'intérêt bien compris gouverne les actions humaines plus sûrement qu'aucune vertu, et que la morale sociale est largement le produit des institutions ; de Rousseau, il adopte l'intuition maîtresse selon laquelle l'état social a corrompu un état antérieur plus authentique, et que la plupart des douleurs humaines sont filles de la civilisation. Mais Chamfort n'est ni systématique comme Helvétius ni enthousiaste comme Rousseau. Il ne propose aucune refondation théorique, aucun nouveau contrat social, aucune pédagogie. Son matérialisme est un scepticisme ; son rousseauisme, une nostalgie. À la fois héritier des moralistes du Grand Siècle et contemporain des philosophes, il occupe une position qu'on peut qualifier de liminaire : celle d'un moraliste des Lumières, plus proche, par la méthode, de La Bruyère que de d'Holbach, plus proche, par le jugement politique, de Condorcet que de La Rochefoucauld. == Anthropologie : nature, passions, raison == === La nature et la « composition factice » === La pensée anthropologique de Chamfort repose sur une distinction structurante entre la nature et la société, mais cette distinction ne prend jamais, chez lui, la forme d'un mythe des origines à la manière rousseauiste. Il ne remonte pas à un homme primitif dont il reconstituerait la figure ; il se borne à faire apparaître, par contraste, ce que la socialisation a défait. « La société n'est pas, comme on le croit d'ordinaire, le développement de la nature, mais bien sa décomposition et sa refonte entière. C'est un second édifice, bâti avec des décombres du premier. » L'image vaut d'être méditée : elle récuse le modèle progressiste d'une civilisation qui perfectionnerait la nature, mais sans verser dans l'utopie du retour ; elle suggère que la société travaille toujours avec les matériaux de ce qu'elle défait, et que l'on trouve, çà et là, les débris d'une architecture antérieure, comme ces expressions naïves d'un sentiment vrai qui, par surprise, nous émeuvent dans la conversation des grands et qui sont, dit-il, « un hommage à la nature ». Si la civilisation est une décomposition, c'est qu'elle substitue à la spontanéité des affections primitives un système d'usages, de rangs et d'intérêts qui ne souffre plus d'y paraître. « En général, si la société n'était pas une composition factice, tout sentiment simple et vrai ne produirait pas le grand effet qu'il produit : il plairait sans étonner ; mais il étonne et il plaît. Notre surprise est la satire de la société, et notre plaisir est un hommage à la nature. » Le ressort de la critique n'est donc pas la dénonciation d'une déchéance abstraite ; c'est l'observation que la société du XVIIIe siècle a rendu extraordinaire ce qui devrait être ordinaire, et qu'elle fait de la sincérité une rareté muséale. === Passions et raison === Le rapport entre passions et raison, qui avait occupé toute la philosophie morale du XVIIe siècle, se voit chez Chamfort notablement redistribué. Aux moralistes augustiniens qui avaient fait des passions la source de la corruption humaine, il oppose une thèse exactement inverse : « L'homme, dans l'état actuel de la société, me paraît plus corrompu par sa raison que par ses passions. Ses passions (j'entends ici celles qui appartiennent à l'homme primitif) ont conservé, dans l'ordre social, le peu de nature qu'on y retrouve encore. » C'est la raison, c'est-à-dire le calcul, l'artifice, l'intérêt social, qui a altéré l'homme ; les passions, en ce qu'elles ont d'immédiat et de naturel, en sauvent encore quelque chose. La formule n'est pas dirigée contre la raison en général, Chamfort reste un homme des Lumières, mais contre la raison sociale, c'est-à-dire contre l'instrument par lequel l'homme en société apprend à dissimuler, à ménager et à se vendre. De cette valorisation des passions naturelles découle une manière de stoïcisme tempéré. Chamfort ne recommande ni le triomphe sur les passions ni leur libre cours ; il recommande leur authenticité. Un sentiment vrai, éprouvé à temps, vaut, dit-il, mieux que toutes les réflexions savantes : « Le moraliste qui voudrait faire taire ses passions est comme le chimiste qui voudrait éteindre son feu. » La dignité du caractère, qui donnera son titre à l'un des chapitres des Maximes, est moins une maîtrise qu'une fidélité : le refus obstiné de laisser la société défaire en soi ce qui reste de sensibilité spontanée. == Critique de la société == === Les niches et les rangs === L'image la plus achevée qu'ait laissée Chamfort de la hiérarchie sociale est celle de l'édifice aux niches. Il faut la citer presque entièrement, car elle résume, mieux qu'aucune formule générale, sa manière d'analyser l'ordre monarchique : « On peut considérer l'édifice métaphysique de la société comme un édifice matériel qui serait composé de différentes niches ou compartiments, d'une grandeur plus ou moins considérable. Les places avec leurs prérogatives, leurs droits, etc., forment ces divers compartiments, ces différentes niches. Elles sont durables, et les hommes passent. Ceux qui les occupent sont tantôt grands, tantôt petits ; et aucun ou presque aucun n'est fait pour sa place. Là, c'est un géant courbé ou accroupi dans sa niche ; là, c'est un nain sous une arcade : rarement la niche est faite pour la statue. » L'analogie architecturale permet un renversement du principe aristocratique : les places, loin d'être l'expression des mérites qu'elles couronnent, les précèdent et les commandent ; les hommes s'y insèrent avec les disproportions qu'impose la naissance ou la faveur ; et ce qui choque, c'est moins telle inégalité particulière que la règle générale qui veut que l'instrument ne convienne jamais à son étui. Cette image n'est pas isolée. Elle prolonge une série d'observations où Chamfort met en évidence le caractère purement conventionnel de la considération sociale. « Un sot, fier de quelque cordon, me paraît au-dessous de cet homme ridicule qui, dans ses plaisirs, se faisait mettre des plumes de paon au derrière par ses maîtresses. » La comparaison est volontairement grossière ; elle a pour fonction de rappeler que les ornements sociaux, rubans, croix, charges, décorations, ne valent pas davantage, philosophiquement, que les parures que chacun s'octroie en privé, et que l'adhésion à ces signes trahit chez qui les porte une infériorité morale que nul plumage ne rachète. === Les grands, les riches, les gens du monde === Le chapitre III des ''Maximes générales'', entièrement consacré « à la société, aux grands, aux riches et aux gens du monde », développe une critique qui, sous l'apparence de notes détachées, constitue une véritable sociologie de la cour et des salons. Chamfort y parle en témoin. Il a vu l'aristocratie de très près, elle l'a fêté autant qu'elle l'a humilié,, il a servi comme secrétaire du prince de Condé et comme secrétaire du Cabinet de Madame Élisabeth, sœur de Louis XVI ; il a subi la protection affectueuse du comte de Vaudreuil, favori du comte d'Artois, dont il fut proche sans jamais se laisser acquérir ; il a connu intimement Julie Careau, Marthe Buffon, Henriette de Nehra. Son regard est d'autant plus aigu que la société qu'il peint est celle où il fut à la fois admis et étranger. « La société, écrit-il, est composée de deux grandes classes : ceux qui ont plus de dînés que d'appétit, et ceux qui ont plus d'appétit que de dînés. » La formule, d'abord plaisante, est en fait une synthèse économique : l'inégalité y est ramenée à un déséquilibre de besoins et de moyens qui dérobe à ceux qui pâtissent le nécessaire et à ceux qui possèdent la capacité même d'en jouir. À cette critique économique s'ajoute une critique morale. « On ne peut vivre dans la société, après l'âge des passions. Elle n'est tolérable que dans l'époque où l'on se sert de son estomac pour s'amuser, et de sa personne pour tuer le temps. » Ce que Chamfort dénonce n'est pas seulement le luxe ; c'est l'ennui organisé, le remplissage des heures par des plaisirs convenus, la soumission à des liturgies de politesse que rien n'anime plus. Les « gens du monde », remarque-t-il encore, « ne sont pas plutôt attroupés qu'ils se croient en société », mot qui distingue la véritable société, commerce de pensées et d'affections, de cette agrégation où chacun surveille chacun sans jamais rien échanger. === La noblesse héréditaire et les préjugés === De toutes les institutions qu'il critique, la noblesse héréditaire est celle contre laquelle Chamfort déploie la plus grande énergie. Il y voit non seulement un abus particulier, mais le symptôme de l'impuissance propre à la pensée morale à l'égard des préjugés établis : « Veut-on avoir la preuve de la parfaite inutilité de tous les livres de morale, de sermons, etc. ? Il n'y a qu'à jeter les yeux sur le préjugé de la noblesse héréditaire. Y a-t-il un travers contre lequel les philosophes, les orateurs, les poètes aient lancé plus de traits satiriques, qui ait plus exercé les esprits de toute espèce, qui ait fait naître plus de sarcasmes ? cela a-t-il fait tomber les présentations, la fantaisie de monter dans les carrosses ? » La remarque, frappante par sa conclusion désabusée, engage une thèse générale sur l'impuissance du discours moral face aux institutions : la critique raisonnée ne détruit pas ce que le rang, la fortune et l'habitude soutiennent. Elle explique, par avance, pourquoi Chamfort accueillera avec ferveur la Révolution : seule une transformation politique, et non un supplément d'arguments, peut détruire ce que les arguments n'ont pu défaire. Le rapport entre opinions et institutions se laisse ainsi penser, chez Chamfort, selon une circularité qui n'est pas loin d'anticiper la critique idéologique : les opinions reçues naissent des institutions qui les soutiennent, et les institutions durent parce qu'elles sont reconduites par les opinions qu'elles ont engendrées. Chamfort cite à ce propos l'exemple de l'éducation, pour montrer que celle-ci ne peut être réformée séparément des réformes politiques et religieuses dont elle dépend. « L'éducation n'ayant d'autre objet que de conformer la raison de l'enfance à la raison publique relativement à ces trois objets [législation, religion, opinion publique], quelle instruction donner, tant que ces trois objets se combattent ? » On reconnaît là l'intuition qui sera celle, au siècle suivant, d'un certain républicanisme français : la formation des citoyens exige la transformation simultanée de toutes les sphères où se constitue leur raison. === La question de la bâtardise et du ressentiment === Il importe, pour comprendre une part de la critique sociale chez Chamfort, de la rapporter à son expérience propre, tout en se gardant d'en faire la clé unique de l'œuvre. Claude Arnaud a proposé, dans la biographie qu'il lui a consacrée, une lecture d'ensemble articulée autour de la bâtardise et du ressentiment : « Ayant deux identités, celle, aristocratique, de sa mère ; celle, populaire, de sa famille adoptive,, il prend un surnom littéraire à l'âge de vingt ans : Chamfort. Pourtant il restera toujours aussi double que ce faux patronyme, qui commence en douceur et finit en revendication. » Cette lecture, qui a l'avantage de rendre intelligible la trajectoire dans son ensemble, du courtisan couronné au républicain pourchassé,, a le mérite de prendre au sérieux ce que Chamfort lui-même ne cessait de taire mais qui informe, de manière diffuse, la sévérité de son regard sur les distinctions de rang. Elle a toutefois été nuancée par d'autres approches : Jean Dagen, dans son édition des Maximes (GF, 1968), s'attache davantage à la filiation proprement littéraire et philosophique de la pensée de Chamfort, à son rapport aux moralistes classiques, à la logique interne de la forme fragmentaire, et refuse de tout dériver d'une clé biographique. Georges Poulet, dans ''La Distance intérieure'' (1952), lit Chamfort sous l'angle de l'expérience temporelle, la conscience d'un décalage entre le moi et le monde, sans privilégier le ressentiment. Sainte-Beuve, dans les ''Causeries du lundi'', voyait quant à lui un cas « des plus curieux et des plus nets d'ulcération de l'esprit », formule que Nietzsche reprendra pour la retourner. Il y a donc plusieurs lectures possibles du rapport entre la vie et l'œuvre, et la plus prudente est sans doute celle qui reconnaît dans la bâtardise un facteur important sans en faire le principe explicatif exclusif. Nietzsche a été le premier à lire Chamfort sous l'angle du ressentiment, dans un passage du Gai Savoir qui reste l'un des textes de réception les plus pénétrants qui lui aient été consacrés. Il y voyait, dans le « trop explicable ressentiment » de Chamfort, à la fois la condition de sa lucidité et la raison pour laquelle ce moraliste avait fini par se jeter dans la Révolution plutôt que de demeurer, comme Nietzsche l'eût voulu, dans une supériorité philosophique désintéressée. Dans ''La Généalogie de la morale'' (1887), Nietzsche ira plus loin en intégrant Chamfort à sa théorie du ressentiment comme acte créateur de valeurs. Là où Nietzsche diagnostique une limite, Chamfort n'a pas été « philosophe d'un degré de plus »,, on peut aussi bien voir un geste dont la cohérence est propre à Chamfort : refuser de séparer l'exercice du jugement moral de l'engagement politique. Ce débat entre lecture psychobiographique et lecture proprement philosophique reste, aujourd'hui encore, ouvert. == Amour-propre, lettres, académies == Chamfort hérite de La Rochefoucauld la conviction que l'amour-propre est le ressort caché de la plupart des conduites humaines, mais il en déplace l'analyse du terrain strictement psychologique vers le terrain social. L'amour-propre, tel qu'il le peint, n'est pas seulement la complaisance en soi-même : c'est la dépendance où chacun se trouve du regard d'autrui, et particulièrement du regard de ceux que la société a placés au-dessus. De là cette observation aiguë : « J'ai trois sortes d'amis : mes amis qui me détestent, mes amis qui me craignent, et mes amis qui ne se soucient pas du tout de moi. » La remarque, qui a la brièveté d'un mot, contient une doctrine : l'amitié, dans le monde, n'est pas un commerce des cœurs, mais un arrangement des intérêts et des vanités. Le chapitre qui, dans les Maximes, est consacré « aux savants et aux gens de lettres » prolonge cette analyse dans le champ particulier qui était celui de Chamfort lui-même. Il y décrit la vie littéraire comme une seconde cour, avec ses clientèles, ses jalousies et ses bassesses, et n'épargne pas ses propres pairs. Mais c'est le petit traité ''Des Académies'', que Mirabeau devait lire à l'Assemblée en 1791 sous le titre de Rapport sur les Académies, et que Chamfort publia sous son propre nom après la mort du tribun, qui donne à cette critique sa dimension politique. Chamfort y analyse les académies comme des institutions de l'Ancien Régime, héritées d'un temps où la protection royale régissait la vie des lettres, et il y reconnaît un double vice : elles soumettent la pensée au goût du pouvoir, et elles la hiérarchisent selon les rangs plutôt que selon les talents. La suppression des académies, qu'il appelle de ses vœux, n'est donc pas un geste iconoclaste, mais la conséquence logique d'une doctrine de la liberté intellectuelle : là où la pensée reçoit ses récompenses du pouvoir, elle cesse d'être libre. La publication de ce texte valut à Chamfort la rupture de plusieurs de ses anciens amis, et notamment de l'abbé Morellet, qui lui répondit par une brochure, ''De l'Académie française, ou réponse à l'écrit de M. de Chamfort'' (1791), rappelant avec ironie que Chamfort avait mis vingt ans à entrer à l'Académie qu'il demandait à présent de détruire, qu'il y avait prononcé en 1781 un discours où il en louait l'institution et ses protecteurs, et qu'il y avait été assidu pendant dix ans. « Courage de circonstance », concluait le vieil académicien. Le reproche n'est pas entièrement faux : la critique des académies n'est pas seulement un pamphlet contre un ordre révolu, c'est aussi une pièce dans un procès qu'il se fait à lui-même, le dernier acte d'une rupture par laquelle Chamfort renonce solennellement aux honneurs qu'il avait conquis et consent, à perte, à tout ce que la Révolution exigeait de ceux qui avaient appartenu à l'Ancien Régime. On peut lire dans cette rupture, comme l'a fait Arnaud, l'acte par lequel Chamfort solde définitivement ses comptes avec l'Ancien Régime. Morellet, en répliquant, montrait l'autre face du geste : la part d'inconséquence ou de mauvaise conscience qu'il pouvait aussi contenir. Il reste que Chamfort a renoncé sans retour aux bénéfices d'un monde dont il avait été, pendant vingt ans, l'un des ornements. == Politique : royauté, liberté, République == === La critique de la royauté === La pensée politique de Chamfort, aussi longtemps qu'elle s'est exercée sous la monarchie, a pris la forme d'une critique de l'ordre ancien plutôt que d'une théorie positive de la liberté. Il voit dans le régime de Louis XV et de Louis XVI la perpétuation d'un système où les places, les pensions et les charges forment un réseau de dépendances qui corrompt jusqu'à ceux qui s'en défendent. « Quand les sots sortent de place, soit qu'ils aient été ministres ou premiers commis, ils conservent une morgue ou une importance ridicule » : la remarque vise moins les individus que l'institution qui leur a donné cette morgue. De même, sa critique du serment « foi de gentilhomme », « Louis XV a fait banqueroute en détail trois ou quatre fois, et on n'en jure pas moins foi de gentilhomme », n'est pas un trait contre un roi particulier, mais un exemple de la manière dont les formules consacrées résistent à l'évidence des faits. Cette critique se redouble d'une observation plus profonde sur le mécanisme de la domination. Chamfort note que la servitude la plus humiliante n'est pas celle qu'on subit par contrainte, mais celle qu'on consent par intérêt ou par habitude. « J'ai vu des hommes trahir leur conscience, pour complaire à un homme qui a un mortier ou une simare : étonnez-vous ensuite de ceux qui l'échangent pour le mortier, ou pour la simare même. Tous également vils, et les premiers absurdes plus que les autres. » L'analyse du pouvoir se confond ici avec l'analyse de l'amour-propre : c'est parce que chacun cherche sa considération dans le regard des puissants que le pouvoir dure, et ce qui le soutient n'est pas la force mais la complaisance. === L'éminence grise de la première Révolution === Lorsque la Révolution survient, Chamfort en accueille les principes avec un enthousiasme qui tranche sur le scepticisme de ses années antérieures. Son rôle, dans la préparation et les premiers temps du mouvement, est bien plus actif qu'on ne l'a longtemps supposé, comme l'ont montré les travaux de John Renwick (« Chamfort patriote en coulisse », 1980) puis la biographie d'Arnaud. Il est l'un des hommes du club des Trente, il inspire ou relit des discours de Mirabeau, il participe à la Société de 1789 aux côtés de Sieyès, Condorcet, Bailly, Talleyrand et La Fayette, il fréquente les réunions où se discute le sort de la monarchie. Il est aux côtés des députés pour le Serment du Jeu de Paume et, selon un témoignage rapporté par Arnaud, il aurait inspiré à Mirabeau la phrase célèbre : « Nous sommes ici par la volonté du peuple et nous n'en sortirons que par la force des baïonnettes. » Chroniqueur de la Révolution dans les ''Tableaux historiques'', rédacteur au Mercure, auteur de mots qui circulent de bouche en bouche, « Guerre aux châteaux, paix aux chaumières » ; la noblesse « intermédiaire entre le roi et le peuple, comme le chien de chasse est un intermédiaire entre le chasseur et les lièvres »,, Chamfort se tient, selon sa formule propre, dans l'ombre : « Pendant que d'autres voulaient attaquer le colosse avec un bélier, Chamfort cherchait à le cribler de traits satiriques. » Son républicanisme n'est pas une doctrine abstraite ; c'est la conclusion cohérente de toutes ses critiques antérieures. Si les institutions de l'Ancien Régime corrompaient nécessairement ceux qui y entraient, et si les arguments moraux ne pouvaient les faire tomber, il fallait bien que leur chute vînt de l'action politique, et la République offrait la forme où la dignité du caractère pourrait enfin s'exercer sans se compromettre. Chamfort y a cru littéralement. Il a donné ses pensions, sacrifié son revenu, rédigé pour presque rien dans le Mercure, accepté d'être proposé pour plusieurs postes sans jamais les briguer, et s'est installé dans le rôle, ingrat mais cohérent, de celui qui sert la Révolution en la pensant. === Le républicanisme mélancolique === Mais ce républicanisme n'a pas été sans réserves, et c'est dans le huitième chapitre des Maximes, « De l'esclavage et de la liberté en France, avant et depuis la Révolution », que s'inscrivent ces réserves. Chamfort y observe que les hommes ne passent pas, d'une société à l'autre, sans emporter avec eux les habitudes qu'ils y ont contractées. « Je ne croirai pas à la révolution, disait-il en 1792, tant que je verrai ces carrosses et ces cabriolets écraser les passants » : la formule met en évidence le décalage entre les institutions nouvelles et les mœurs qui les précèdent. De même, sa célèbre traduction ironique de la devise « Fraternité ou la mort », « Sois mon frère ou je te tue », n'est pas un sarcasme conservateur, c'est l'observation qu'une vertu imposée par la menace cesse d'être une vertu, et qu'une fraternité qui se maintient par la terreur détruit le principe même dont elle s'autorise. Il faut bien mesurer la portée de ces réserves. Elles ne viennent pas d'un modéré qui regrette la monarchie ; elles viennent d'un républicain qui s'inquiète de voir la République se dégrader en ce qu'elle dénonçait. L'homme qui s'est rangé aux côtés des Girondins en 1792, qui a salué Charlotte Corday comme la « sainte » d'une cause perdue, qui a refusé, aux pires moments de la Terreur, de se dissocier publiquement de ses amis déjà frappés, n'est pas un opposant d'occasion. C'est un homme qui a tenu, jusqu'à l'épreuve, la position d'un républicain intransigeant, et dont la lucidité a fini par mesurer le prix. Chamfort appartient à cette lignée de républicains désenchantés, tel Condorcet, son contemporain, qui accueillirent la chute de l'Ancien Régime comme une nécessité morale et qui ne cessèrent de craindre que la Révolution, dans sa précipitation, ne produisît de nouveaux despotes à la place des anciens. Sa mort, qui fut la conséquence de cette position et non d'un hasard, donna à sa vie la signification d'un choix. === Les Tableaux historiques === Le projet des ''Tableaux historiques de la Révolution française'', pour lequel il fournit treize livraisons composées chacune de deux tableaux et ornées des gravures de Prieur, avant que la tâche ne soit poursuivie par Ginguené, mérite d'être rattaché à sa pensée politique d'ensemble. Chaque « tableau » est une scène : le Serment du Jeu de Paume, la Prise de la Bastille, la Nuit du 14 au 15 juillet, le Roi à l'hôtel de ville de Paris. La méthode est celle de ses ''Caractères et anecdotes'' transportée sur le théâtre révolutionnaire : décrire les événements comme des instants significatifs, en dégager la valeur morale, en repérer les ambiguïtés. On y voit que Chamfort n'était pas un chroniqueur au sens strict ; il concevait l'histoire comme une suite de scènes où se révélait le caractère d'un peuple, et le récit historique comme la prolongation naturelle de la peinture morale. == Morale de la retraite et dignité du caractère == La critique incessante de la société dans laquelle il vit n'aboutit pas, chez Chamfort, à un programme positif ; elle aboutit à une morale de la retraite. Le chapitre IV des ''Maximes générales'', « Du goût pour la retraite, et de la dignité du caractère », en porte le titre explicite. La retraite, chez Chamfort, n'a rien de la clôture religieuse ni de la méditation stoïcienne dans sa forme classique : elle est le refuge d'un esprit que la fréquentation du monde a fatigué, et la condition de possibilité d'un jugement qui ne se soit pas altéré au contact des intérêts. Il faut donc se retirer, non par haine du monde, mais par fidélité à soi-même. C'est le parti qu'il avait voulu prendre dès 1784, lorsqu'il quittait Paris pour la Provence, et qu'il reprit à plusieurs reprises par la suite. Cette morale de la retraite a un corrélat positif, qui est la dignité du caractère. L'expression est à prendre dans un sens très concret : il s'agit, pour celui qui ne peut plus rien changer à l'ordre social, de maintenir en soi une cohérence entre ce qu'il pense et ce qu'il fait, un refus constant des petites lâchetés qu'exige la vie commune. « Un homme du peuple, un mendiant, peut se laisser mépriser, sans donner l'idée d'un homme vil, si le mépris ne paraît s'adresser qu'à son extérieur : mais ce même mendiant, qui laisserait insulter sa conscience, fût-ce par le premier souverain de l'Europe, devient alors aussi vil par sa personne que par son état. » La dignité, telle qu'elle est pensée ici, n'est pas une position sociale ni même une vertu héroïque : c'est le refus, accessible à tous, de laisser insulter sa conscience. Elle fournit le critère par lequel se distinguent les « honnêtes gens » des « fripons » : « Il faut convenir qu'il est impossible de vivre dans le monde sans jouer de temps en temps la comédie. Ce qui distingue l'honnête homme du fripon, c'est de ne la jouer que dans les cas forcés, et pour échapper au péril ; au lieu que l'autre va au-devant des occasions. » On a souvent vu dans Chamfort un misanthrope. Le mot est trop court. La misanthropie suppose une haine générale de l'espèce ; Chamfort, à l'observer, ressentait plutôt une tristesse particulière à l'égard d'une société qu'il voyait incapable de se réformer. Lorsque la Révolution lui offrit un objet d'engagement, il s'y engagea sans réserve ; lorsque cet engagement lui-même devint douteux, il revint à la retraite, et c'est dans cet aller-retour que se lit l'unité d'une vie morale. Son geste final, refuser de rentrer vivant dans une prison, n'est pas une désespérance philosophique ; il est le prolongement extrême de cette dignité du caractère qu'il avait définie. « Je suis un homme libre, dit-il encore aux personnes présentes, jamais on ne me fera rentrer vivant dans une prison. » La déclaration, qu'il relut et signa au procès-verbal, peut être lue comme l'épitaphe de toute une vie morale : le refus, jusque dans la chair, que la société atteigne ce qui, en l'homme, ne lui appartient pas. == La maxime comme forme philosophique == La question de la forme ne saurait être disjointe, chez Chamfort, de la question de la pensée. Il a réfléchi lui-même à ce que c'est qu'une maxime, et l'on a vu qu'il la considérait avec quelque méfiance, comme l'outil commode des esprits paresseux. Pourquoi, alors, a-t-il choisi cette forme ? Parce qu'elle permet, mieux qu'aucune autre, de restituer ce qu'il appelle les « mille observations fines dont l'amour-propre n'ose faire confidence à personne ». La maxime, chez lui, n'est pas la règle d'une morale ; elle est la trace écrite d'une observation particulière, susceptible de corrections et de démentis, qui ne prétend valoir que par sa vérité occasionnelle. Ses maximes, souligne-t-il dès le premier fragment de ses Produits, n'ont pas valeur universelle : elles doivent être lues et interprétées, comme l'a montré Claude Arnaud, en fonction du trajet qui a mené à leur naissance, avertissement méthodologique capital, et qui commande toute l'herméneutique de son œuvre. Cette conception a une conséquence formelle que l'on reconnaît aisément dans les ''Maximes et pensées'' : les fragments y sont souvent introduits par un « j'ai vu », par un « M*** me disait », par un « quelqu'un disait », qui rappellent que la pensée procède toujours d'un cas. La vérité morale, telle que Chamfort l'entend, n'a pas la généralité abstraite d'un principe ; elle s'attache à un contexte, à une scène, à une personne, et ne s'étend au-delà que par la ressemblance que le lecteur consent à reconnaître. Les ''Caractères et anecdotes'' en sont, plus encore que les Maximes, la mise en œuvre exemplaire. Chaque anecdote est un petit récit qui ne dispense aucune leçon formulée, mais qui laisse au lecteur le soin de tirer, ou non, la vérité qu'elle contient. Il en résulte une poétique de la pensée que l'on peut comparer à celle des Essais de Montaigne ou des Caractères de La Bruyère, mais qui s'en distingue par une ironie plus aiguisée et par une économie de moyens plus stricte. Là où Montaigne développe et où La Bruyère dresse le portrait, Chamfort frappe et passe. Son style, qui fut l'un des plus loués du XVIIIe siècle français, n'est pas un ornement ajouté à la pensée : il en est la condition. La brièveté, le paradoxe, la chute inattendue ne sont pas des effets de surface, mais la manière dont la pensée saisit son objet, en sachant qu'elle ne le tient qu'un instant. Sainte-Beuve a pu dire de Chamfort qu'il écrivait « comme on grave » ; la formule est juste, à condition d'ajouter que l'outil était aussi un instrument de connaissance. == Postérité et lectures == La postérité de Chamfort est sinueuse. Publié posthumément par Ginguené en l'an III (1795) sous le titre de ''Produits de la civilisation perfectionnée'', son corpus fragmentaire fut lu avec gravité par les hommes du Directoire et du premier Empire, qui y cherchaient un jugement sur le monde disparu. Les républicains y reconnurent un des leurs ; les royalistes, un esprit trop libre pour être rangé dans un camp. Le fidèle Ginguené poursuivit son travail d'éditeur malgré la disparition de la majeure partie des manuscrits, pillés au moment des scellés. Les premières Œuvres complètes, celles d'Auguis en 1824, ont joué un rôle important dans cette réception : elles rassemblaient pour la première fois l'ensemble des textes, des éloges académiques aux ''Tableaux historiques'', et elles ont fixé l'image d'un moraliste complet. Stendhal, qui reconnaissait en Chamfort l'un de ses maîtres de prose, en a absorbé le style et les préoccupations au point qu'on a pu lire les ''Caractères et anecdotes'' comme une préfiguration de la manière stendhalienne, même économie de moyens, même goût pour le détail révélateur, même ironie retenue. Chateaubriand, qui avait connu Chamfort personnellement et l'avait fréquenté dans les derniers mois de l'Ancien Régime, lui a consacré dans son ''Essai sur les révolutions'' un portrait resté célèbre, dont la phrase, « son œil bleu, souvent froid et couvert dans le repos, lançait l'éclair quand il venait à s'animer », fixa pour longtemps l'image physique de l'homme. Balzac, selon Pierre Citron, fut un lecteur attentif des Maximes. Sainte-Beuve, dans les ''Causeries du lundi'', en fit le sujet de l'une de ses études les plus longues, y voyant un cas « des plus curieux et des plus nets d'ulcération de l'esprit ». C'est Nietzsche qui lui a rendu l'hommage à la fois le plus appuyé et le plus complexe, principalement dans ''Le Gai Savoir'' (1881-1882), dans la préface de ''Humain, trop humain'' (1886) et dans ses ''Fragments posthumes''. Il voyait en Chamfort « le plus malicieux de tous les moralistes » et « un La Rochefoucauld du XVIIIe siècle, mais plus noble et plus philosophe » ; il saluait dans ses Maximes une œuvre possédant « à l'extrême une force de poisson-torpille ». Nietzsche reconnaissait surtout dans Chamfort le portrait d'une intelligence double, tiraillée entre la lucidité de l'observateur et la ferveur du partisan, et à qui son « trop explicable ressentiment » avait fait manquer sa pleine philosophie. « À supposer que Chamfort fût alors demeuré plus philosophe d'un degré, écrit-il dans ''Le Gai Savoir'', la Révolution eût perdu de son tragique mordant et eût été privée de son aiguillon le plus acéré : elle passerait pour un événement beaucoup plus stupide et n'exercerait pas une telle séduction sur les esprits. » Le propos, plus tard nuancé dans ''La Généalogie de la morale'' où Nietzsche intégrera Chamfort à sa théorie du ressentiment, signale à la fois une parenté reconnue, Nietzsche se reconnaissait dans ce moraliste « riche en profondeurs et en arrière-fonds de l'âme, sombre, douloureux, ardent », et une distance : Chamfort, à la différence de Nietzsche, n'a pas voulu se retirer dans la seule supériorité intellectuelle, il a préféré payer de sa personne, et c'est cela même qui lui donne, aux yeux du philosophe allemand, sa singularité tragique. Au XXe siècle, Chamfort a été lu principalement dans la tradition française du moralisme, à côté de La Rochefoucauld, La Bruyère et Vauvenargues ; Albert Camus, dans une préface souvent citée de 1944, l'a présenté comme un écrivain de la lucidité et du refus, et a contribué à le réintroduire dans le canon moderne. Cioran, à sa suite, l'a placé parmi ses moralistes d'élection. Les éditions modernes, celle de Jean Dagen dans la collection GF (1968), celle de Claude Roy, plus récemment l'anthologie ''La Pensée console de tout'' présentée par Claude Arnaud (2014), ont progressivement rendu disponibles les parties de l'œuvre qui avaient été négligées, notamment les écrits politiques et les ''Tableaux historiques''. La biographie qu'a consacrée à Chamfort le même Claude Arnaud en 1988 a, de son côté, renouvelé en profondeur la connaissance de sa vie : en éclairant la question de la naissance, les réseaux de l'amitié avec Mirabeau et Sieyès, le rôle politique de « l'éminence grise » de la première Révolution, elle a permis de lire enfin Chamfort comme un auteur dont la cohérence n'est pas d'abord celle d'un recueil, mais celle d'une trajectoire. == Conclusion == Chamfort occupe, dans l'histoire de la philosophie morale française, une position qui ne se laisse rattacher à aucune école. Héritier des moralistes classiques par la forme qu'il donne à ses pensées, contemporain des Lumières par la confiance qu'il accorde à l'observation et par sa critique des préjugés, républicain de la première heure par conviction plus que par doctrine, il articule ces héritages avec une indépendance qui lui est propre. Sa critique sociale, l'une des plus incisives de sa génération, ne débouche ni sur un système ni sur une utopie : elle s'appuie sur la conviction simple qu'il existe, par-dessous les compositions factices de la vie commune, une nature humaine qu'il est possible de respecter si l'on ne consent pas à s'en laisser dépouiller. Cette position l'expose à une forme de tragique propre, que les interprètes ont diversement qualifiée, « ulcération de l'esprit » selon Sainte-Beuve, « ressentiment » selon Nietzsche, « bâtardise » selon Arnaud, et dont aucune formule ne rend compte à elle seule. Né en marge, il a porté sa vie entière la marque d'une double appartenance sociale, et c'est sans doute de là que venait une part de sa lucidité et de son besoin de ne jamais s'établir. Mais d'autres facteurs, la maladie chronique, les échecs littéraires, la fréquentation prolongée d'un monde dont il voyait les artifices, ont contribué à façonner un regard que l'on aurait tort de dériver d'une seule cause. La société, chez lui, n'a jamais été simplement l'objet d'une critique extérieure : elle a été, en même temps, le lieu de son humiliation et de son triomphe, un ordre qu'il observait de l'intérieur parce qu'il n'y avait eu sa place que par effraction, mais aussi par talent, par séduction et par un effort de volonté dont il ne faut pas sous-estimer l'étendue. Si la société corrompt par ses institutions ce que la nature avait donné de meilleur, et si la réforme politique elle-même ne peut s'accomplir qu'au prix de nouvelles violences, que reste-t-il à l'homme qui pense ? La réponse de Chamfort, celle qu'il a donnée par ses Maximes et qu'il a scellée par sa mort, est que reste du moins le devoir de ne pas mentir à soi-même. C'est peu ; c'est aussi beaucoup, puisque c'est le seul terrain sur lequel la dignité du caractère, sa seule morale, demeure intégralement entre les mains de celui qui la pratique. On comprend alors que ses Maximes, en dépit de leur apparente dispersion, forment une œuvre : elles sont l'inventaire des occasions dans lesquelles cette dignité s'exerce ou se manque, et c'est à cet inventaire que Chamfort a consacré les observations de toute une vie. Ce qui survit ainsi de lui n'est pas une doctrine, mais une figure et un ton. Figure d'un écrivain qui a refusé toutes les complaisances, et dont les contemporains disaient déjà qu'il écrivait « comme on grave » ; ton d'une ironie qui n'est jamais pure cruauté, parce qu'elle s'applique d'abord à celui qui la formule. Ce ton, la postérité l'a reconnu chez Stendhal, chez Nietzsche, chez tous ceux qui, sans fonder d'école, ont fait de la brièveté et de l'acuité les instruments d'une pensée morale sans illusions. Chamfort est de cette famille : celle des moralistes qui, pour avoir regardé le monde d'assez près, ont conclu qu'il valait mieux le dire que l'expliquer, et dont l'œuvre, précisément parce qu'elle ne se clôt sur aucun système, continue d'être utile à quiconque veut, à son tour, ne pas mentir. == Indications bibliographiques == === Sources primaires === * {{ouvrage|auteur1=Chamfort|responsabilité1=aut.|directeur1=Pierre-Louis Ginguené|titre=Œuvres de Chamfort|lieu=Paris|éditeur=Imprimerie des Sciences et Arts|année=an III (1795)|tome=4 vol.}} : Première publication posthume, à laquelle on doit l'essentiel de ce que nous lisons aujourd'hui sous le nom de ''Maximes et pensées'' et de ''Caractères et anecdotes''. Ginguené y a accompli un travail d'établissement dans des conditions difficiles, une grande partie des manuscrits ayant été volée au moment de la pose des scellés. * {{ouvrage|auteur1=Chamfort|responsabilité1=aut.|directeur1=P. R. Auguis|titre=Œuvres complètes de Chamfort|sous-titre=recueillies et publiées avec une notice historique sur la vie et les écrits de l'auteur|lieu=Paris|éditeur=Chaumerot jeune|année=1824-1825|tome=5 vol.}} : Édition rassemblant les œuvres littéraires, critiques, politiques et morales. C'est à elle que renvoient la plupart des citations du présent travail. La notice d'Auguis, fondée sur les papiers de Ginguené, est le premier récit continu de la vie de Chamfort. Réédition en fac-similé par Slatkine. * {{ouvrage|auteur1=Chamfort|directeur1=Jean Dagen|titre=Maximes et pensées, caractères et anecdotes|lieu=Paris|éditeur=Garnier-Flammarion|année=1968|id=Dagen 1968}} (rééd. 2013). : Édition de référence en format courant, avec introduction, notes et établissement philologique solide des fragments ; c'est celle qui s'est imposée dans l'usage universitaire. * {{ouvrage|auteur1=Chamfort|titre=Maximes et pensées, caractères et anecdotes|préface=[[Albert Camus]]|lieu=Monaco|éditeur=Éditions du Rocher|année=1944}} : Préface historiquement importante qui a contribué à la redécouverte de Chamfort au {{s|XX}} et qui ouvre toute la réception contemporaine. * {{ouvrage|auteur1=Chamfort|directeur1=Claude Arnaud|titre=La Pensée console de tout|lieu=Paris|éditeur=[[Éditions Flammarion|Flammarion]]|collection=GF|année=2014}} : Anthologie récente accompagnée d'un appareil critique à jour et d'une présentation qui prolonge le travail biographique de 1988. === Études === * {{ouvrage|auteur1=Claude Arnaud|titre=Chamfort. Biographie|sous-titre=suivie de soixante-dix maximes, anecdotes, mots et dialogues inédits ou jamais réédités|lieu=Paris|éditeur=[[Robert Laffont]]|collection=Les hommes et l'histoire|année=1988|id=Arnaud 1988}} (rééd. [[Éditions Gallimard|Gallimard]], coll. « Tel », 2003). : Biographie de référence, fondée sur un dépouillement systématique des sources d'archives. Arnaud a établi, en s'appuyant sur les mémoires inédits du baron d'Espinchal, les circonstances de la naissance de Chamfort ; il a reconstitué son rôle politique aux côtés de Mirabeau et de Sieyès ; il a proposé une lecture d'ensemble articulée autour de la bâtardise et du ressentiment. L'ouvrage publie en annexe soixante-dix fragments inédits et une enquête sur le vol des manuscrits. * {{ouvrage|auteur1=John Renwick|directeur1=oui|titre=Chamfort and the French Revolution|lieu=Oxford|éditeur=Voltaire Foundation|collection=Studies on Voltaire and the Eighteenth Century|année=1990}} : Voir aussi, du même auteur : « Chamfort patriote en coulisse », ''Studies on Voltaire and the 18th century'', vol. 183, 1980, {{p.|165}} sq. Travaux qui, sur la base de documents d'archives inédits, ont établi le rôle politique de Chamfort au cours des années 1789-1793 et publié plusieurs lettres inconnues. * {{article|auteur1=Jean Dagen|titre=Chamfort moraliste|périodique=Revue d'histoire littéraire de la France|année=1968}} : Étude préparatoire à l'édition GF qui établit les principales filiations (Montaigne, La Rochefoucauld, La Bruyère, Vauvenargues) et propose une lecture interne de la forme fragmentaire. * {{ouvrage|auteur1=Louis Van Delft|titre=Le Moraliste classique. Essai de définition et de typologie|lieu=Genève|éditeur=[[Librairie Droz|Droz]]|année=1982}} : Ouvrage de référence sur la tradition moraliste française, dans lequel la place de Chamfort est discutée à la lumière de ses prédécesseurs et de ses successeurs directs. * {{ouvrage|auteur1=Maurice Pellisson|titre=Chamfort, étude sur sa vie, son caractère, ses écrits|lieu=Paris|année=1895}} (rééd. Slatkine, 1970). : Première étude érudite importante consacrée à Chamfort après Sainte-Beuve ; elle demeure utile malgré les corrections qu'a imposées la biographie d'Arnaud. * {{ouvrage|auteur1=Émile Doucet|titre=Chamfort et son temps|lieu=Paris|éditeur=Fasquelle|année=1944}} (rééd. Volcans, 1974). * {{ouvrage|auteur1=Julien Teppe|titre=Chamfort, sa vie, son œuvre, sa pensée|préface=[[Jean Rostand]]|lieu=Paris|éditeur=Pierre Clairac|année=1950}} : Deux monographies de la première moitié du {{s|XX}} qui ont accompagné la redécouverte du moraliste. * [[Friedrich Nietzsche]], ''[[Le Gai Savoir]]'' (1882), préface à ''[[Humain, trop humain]]'' (1886), et ''Fragments posthumes'' (1881). : Lieux essentiels de la réception allemande, où Nietzsche fait de Chamfort son moraliste d'élection et reconnaît en lui un frère en pensée. * {{article|auteur1=[[Charles-Augustin Sainte-Beuve|Sainte-Beuve]]|titre=Chamfort|périodique=[[Causeries du lundi]]|volume=t. IV|année=1852}} : Étude parmi les plus pénétrantes du {{s|XIX}}, qui voit dans Chamfort « un des plus curieux et des plus nets cas d'ulcération de l'esprit » et qui a longtemps déterminé la lecture du moraliste. * {{article|auteur1=Pierre Citron|titre=Balzac, lecteur de Chamfort|périodique=L'Année balzacienne|année=1969}} : Article qui montre, à partir de relevés précis, la présence diffuse mais réelle de Chamfort dans l'œuvre de Balzac. * {{chapitre|auteur1=[[Georges Poulet]]|titre chapitre=Chamfort|titre ouvrage=La Distance intérieure|lieu=Paris|éditeur=[[Éditions Plon|Plon]]|année=1952}} : Lecture phénoménologique qui, sous l'angle de la distance et du retrait, dégage l'expérience temporelle propre au moraliste. * {{ouvrage|auteur1=[[Marc Fumaroli]]|titre=La République des lettres|lieu=Paris|éditeur=[[Éditions Gallimard|Gallimard]]|année=2015}} : Ouvrage qui replace la trajectoire de Chamfort dans une histoire plus large des institutions lettrées de l'Ancien Régime. [[Catégorie:Philosophe]] {{DEFAULTSORT:Chamfort}} e3qzv66f7zfesj8crf9ag39zeng3hz4 Les cartes graphiques/Les écritures en VRAM hors ROPs 0 83807 764875 763959 2026-04-24T17:52:34Z Mewtow 31375 /* Les fonctionnalités de Multiple Render Targets */ 764875 wikitext text/x-wiki Le chapitre précédent nous a expliqué comment les ROPs mettaient à jour le ''framebuffer'' et le tampon de profondeur. Cependant, les ROPs ne sont pas les seuls à écrire en mémoire vidéo. Les ''compute shaders'', ''vertex shaders'' et ''pixel shaders'' peuvent écrire des données en mémoire vidéo, dans des tableaux dédiés. Et n'allez pas croire que c'est un petit sujet. La majeure partie des jeux vidéos actuels utilisent des techniques de rendu différé qui ne fonctionneraient pas sans cela ! Et ne parlons pas des ''compute shaders'', qui ne serviraient à rien sans cela. Dans ce chapitre, nous allons détailler comment se font ces écritures en mémoire. : Notons que nous mettons de côté les architectures ''sort-middle'' et les GPU à rendu en ''tile'' dans ce chapitre. ==Les fonctionnalités de ''Multiple Render Targets''== Il faut noter que les API modernes permettent à un ''pixel shader'' d'écrire dans plusieurs ''render-target''. On parle alors de '''''Multiple Render Targets''''', abrévié en MRT. L'implémentation classique est que le ''pixel shader'' peut écrire son résultat dans une ou plusieurs textures. Précisons qu'il s'agit bien du ''pixel shader'' qui écrit dans une texture. Suivant le GPU, l'écriture dans les ''render target'' peut ou non passer par les ROPs. Sur les anciennes versions de DirectX, un seul ''render target'' passait par les ROPs, mais pas les autres. De nos jours, tous les ''render target'' passent par les ROPs. Il est même possible de configurer le mélange ''alpha'' différemment suivant le ''render target''. <noinclude>[[File:MultiRenderTarget.svg|centre|vignette|upright=3|''Multiple Render Target''.]]</noinclude> ===L'éclairage différé=== Le MRT accélère fortement les techniques d''''éclairage différé''', qui séparent les calculs d'éclairage par pixel dans une passe séparée du reste. Ils fonctionnent en deux passes, au minimum. La première calcule toutes les informations nécessaires pour les calculs d'éclairage par pixel. Elle calcule les normales, la couleur diffuse, de quoi calculer les réflexions spéculaires, et d'autres informations du genre. Le tout est mémorisé dans plusieurs "textures" séparées, qui sont lues par un '''pixel shader''' pour obtenir l'image finale. On parle aussi de rendu différé au lieu d'éclairage différé, mais c'est un détail. La première passe calcule la couleur de chaque pixel, la profondeur de chaque pixel, et la normale de la surface pour chaque pixel. Dans l'implémentation la plus simple, ces informations sont écrites dans trois "textures" : une qui contient la couleur diffuse, une autre pour la profondeur, et une autre pour les normales. Il faut alors supporter des pseudo-''framebuffer'' pour chaque "texture". Ils sont appelés des '''''G-buffer''''', ce qui est l'abréviation de tampon géométrique. {| |[[File:Deferred rendering pass col.jpg|thumb|''G-buffer'' pour la couleur.]] |[[File:Deferred rendering pass dep.jpg|thumb|''G-buffer'' pour la profondeur.]] |[[File:Deferred rendering pass nor.jpg|thumb|''G-buffer'' pour les normales.]] |[[File:Deferred rendering pass res.jpg|thumb|Image finale]] |} L'intérêt de l'éclairage différé est d'exécuter le ''pixel shader'' une fois par source de lumière et par pixel. Il y a donc un ''draw call'' par source de lumière, qui lit les ''g-buffer''. La conséquence est que le rendu différé utilise généralement un shader par type de sources de lumières, qu'elles soient ponctuelles, directionnelles, etc. Pour comparer, sans éclairage différé, l'éclairage est réalisé autrement. L'implémentation la plus simple fait les calculs d'éclairage une fois par source et lumière et par objet, avec un ''draw call'' par objet et par source de lumière. On parle alors de '''rendu direct multi-passe'''. La géométrie d'un objet est donc recalculée plusieurs fois, une fois par source de lumière. Par contre, le ''pixel shader'' est généralement assez simple, car on peut utiliser un ''shader'' différent pour les lumières ponctuelles, directionnelles, etc. Mieux que ça : on a tendance à avoir un ''shader'' par ''material'', vu qu'on a généralement un seul ''material'' par objet, les exceptions étant rares. Le cout en termes de performances est alors le suivant : des ''pixels shaders'' très spécialisés et optimisés, mais des calculs géométriques redondants. Une implémentation plus optimisée utilise un seul ''draw call'' par objet. Le ''draw call'' reçoit une liste des sources de lumière. Le ''pixel shader'' lit les sources de lumière une par une dans cette liste, et calcule l'éclairage une source de lumière à la fois, jusqu'à obtenir la couleur finale du pixel. La différence est qu'on a un ''draw call'' par objet, et non un par objet et source de lumière. On parle alors de '''rendu direct simple passe'''. Les calculs géométriques redondants sont éliminés, mais le ''pixel shader'' perd sa spécialisation. Au lieu d'utiliser plusieurs ''pixel shaders'' spécialisés, on utilise un ''über shader'' qui supporte tous les types de sources de lumières et tous les ''materials''. La conséquence est qu'un ''über shader'' tend à être moins bien optimisé, car il utilise plus de registres. Cela est cependant compensé par le fait que le ''pixel shader'' fait peu d'accès mémoire, comparé au rendu différé. Il a beau utiliser plus de registres, ce n'est pas tellement un problème vu qu'il y a moins d'accès mémoire à masquer. Le rendu différé a donc de nombreux avantages et désavantages. Un avantage est que le rendu différé se marie bien avec les effets graphiques de type ''screen space'', comme certaines formes d'occlusion ambiante. Ces effets ont besoin de connaitre la profondeur de chaque pixel, qui est fournie sur un plateau dans un ''g-buffer''. Par contre, la transparence n'est pas prise en charge, de même que l'antialiasing de type MSAA. Il y a aussi des conséquences en termes de performances, car lire les ''g-buffer'' n'est pas gratuit. Le cout en bande passante mémoire, est totalement absent dans le rendu direct, qui se contente de lire les textures des objets. Au final, le rendu différé fait un compromis différent du rendu direct : il échange du temps de calcul contre de la bande passante mémoire et contre la VRAM occupée par les ''g-buffer''. Un autre désavantage est que tous les objets doivent faire leurs calculs d'éclairage avec le peu d'informations présentes dans le ''g-buffer''. Ils doivent donc se débrouiller avec une couleur diffuse, spéculaire, les normales et quelques informations comme l'émissivité. En clair, plusieurs ''materials'' partagent des BRDFs très similaires, voire identique. Le rendu direct n'a absolument pas ce problème et peut utiliser un ''material'' différent par objet, voire plusieurs ''materials'' différents sur un même objet. Ils seront simplement rendus dans des ''draw call'' séparés. ===Une prépasse z implicite=== Les avantages et désavantages de l'éclairage différé sont très nombreux. L'un d'entre eux est que l'on n'a pas d'''overdraw'' : seuls les pixels visibles sont éclairés. Ce n'est pas forcément le cas avec le rendu direct (''forward rendenring''), où des pixels sont éclairés par un ''pixel shader'' et enregistrés dans le ''framebuffer'', avant d'être écrasé par la suite. On dit qu'il y a un certain ''overdraw'', d'autant plus important que les pixels invisibles éclairés sont nombreux. Les techniques d'élimination des pixels cachés limitent la casse, mais elles ne fonctionnent à la perfection que si l'on trie les triangles du plus proche au plus lointain, ce qui n'est jamais fait en pratique. Il est cependant possible d'éliminer tout ''overdraw'' avec le rendu direct, en utilisant une pré-passe z (abordé dans le chapitre sur le ROP). D'ailleurs, le rendu différé effectue une pré-passe z implicitement. En réalité, l'éclairage différé est une sorte de pré-passe z sous stéroïde, qui ne fait pas que calculer le tampon de profondeur final, mais calcule aussi les normales et d'autres informations fournies par la rastérisation. De plus, le rendu différé ne recalcule pas la géométrie dans la seconde passe, alors que le rendu direct avec pré-passe z va le faire. Par contre, cette pré-passe z implicite est à l'origine de plusieurs défauts de cette technique. Déjà, l'usage d'une prépasse z n'est pas compatible avec l'usage de la transparence. Le rendu différé ne fonctionne que pour les objets opaques. La seule solution est de traiter les objets opaques à part des objets transparents. Les objets opaques sont rendus dans une première passe utilisant le rendu différé, alors que les objets transparents sont rendus dans une seconde passe qui utilise le rendu direct.La prépasse z désactive aussi l'antialiasing, même si je ne peux pas expliquer pourquoi ici. ===L'implémentation sur les GPU modernes=== Sans MRT, le rendu différé est très compliqué à implémenter. Chaque ''g-buffer'' demande une passe de rendu, chacune re-calculant la géométrie. Par contre, avec MRT, les différents ''g-buffer'' sont tous calculés en une seule passe, sans recalculer la géométrie plusieurs fois. Il est possible d'ajouter d'autres textures pour d'autres informations, comme des textures pour les paramètres de la lumière spéculaire (couleur spéculaire, illumination). Par contre, on est rapidement limité en termes de nombres de textures. En effet, les GPU modernes supportent entre 4 à 8 textures maximum en sortie pour le MRT. Un ''pixel shader'' a donc accès à 4 ''g-buffer'', rarement plus. Pour une compatibilité maximale, les programmeurs se limitent à 4 textures. De plus, utiliser plus de textures aurait un impact en matière de consommation mémoire, et de bande passante. Pour limiter la casse, il est possible de regrouper des informations séparées dans un seul ''g-buffer'', pour gagner de la place. Par exemple, la couleur diffuse est une couleur RGB codée sur 24 bits, là où une texture utilise souvent des pixels RGBA codés sur 32 bits. Il est alors d'utiliser l'octet pour la composante A pour stocker une autre information, comme une information de métallicité (utilisée pour calculer la couleur spéculaire). Un autre défaut du MRT est que son usage désactive de nombreuses optimisations intégrées dans les ROPs, comme le ''z-fast pass''. De telles optimisations demandent en effet que les ROPs n'écrivent que dans un seul ''render target'' : le tampon de profondeur. LA vitesse des ROPs est alors doublée, sans compter que la bande passante mémoire est mieux utilisée. Mais dès qu'on active le MRT, ces optimisations sont désactivées. En comparaison, elles sont activées lors d'une prépasse z normale. Enfin, le MRT désactive automatiquement l'antialiasing matériel. Précisément, c'est l'antialiasing de type ''multisampling'' (MSAA) qui est désactivé, même s'il est possible d'utiliser du ''supersampling'' ou un antialiasing par post-traitement. En conséquence, l'usage de l'éclairage différé désactive totalement le MSAA. ==La fonctionnalité de ''stream output''== Une fonctionnalité des ''geometry shaders'' est la possibilité d'enregistrer leurs résultats en mémoire. Il s'agit de la fonctionnalité du '''''stream output'''''. On peut ainsi remplir une texture ou le ''vertex buffer'' dans la mémoire vidéo, avec le résultat d'un ''geometry shader''. Notons que celle-ci mémorise un ensemble de primitives, pas autre chose. Cette fonctionnalité est utilisée pour certains effets ou rendu bien précis, mais il faut avouer qu'elle n'est pas très souvent utilisée. Aussi, les concepteurs de cartes graphiques n'ont pas optimisé cette fonctionnalité au maximum. Le ''stream output'' n'a généralement pas accès prioritaire à la mémoire, comparé aux ROP, et n'a souvent accès qu'à une partie limitée de la bande passante mémoire. Notons qu'il existe deux formes de ''stream output'' : une qui permet aux ''vertex shader'' d'écrire dans une texture, l'autre qui permet aux ''geometry shaders'' de le faire. Notons que le ''stream output'' fournit un flux de primitives, pas de sommets, même pour le flux sortant d'un ''vertex shader''. En clair, beaucoup de sommets sont dupliqués et ont n'a pas d{{'}}''index buffer''. Les résultats du ''stream output'' sont donc assez lourds et prennent beaucoup de mémoire. [[File:Stream output.png|centre|vignette|upright=2.5|Stream output]] ==Les instructions atomiques des ''compute shaders''== Dans le chapitre précédent, nous avions parlé des ROPs, et notamment de pourquoi on ne peut pas les émuler dans un ''shader''. Le problème est que plusieurs instances de shaders peuvent lire une même donnée, faire un traitement, et la remplacer par leur résultat. Et l'ordre entre ces instances de shaders n'est pas garanti. Le même problème peut survenir dans un ''compute shader'', à savoir un shader utilisé pour du GPGPU. Un ''compute shader'' peut accéder à un ou plusieurs tableaux en mémoire, voire des structures de données plus complexes. Mais restons sur des tableaux. Les tableaux en question sont appelés des ''Unordered Access Views'', leur nom indiquant qu'aucune garantie n'est donnée sur l'ordre des écritures. Il n'y a pas de tri entre instances de shaders pour que les shaders écrivent leurs données dans leur ordre de lancement. À la place, les écritures dans un ''compute shader'' sont immédiates. Les shaders peuvent lire et écrire dans la mémoire vidéo dans le désordre. Le problème est qu'il y a des données qui ne doivent pas être traitées par plusieurs instances d'un ''compute shader'' à la fois. Heureusement, les ''compute shaders'' disposent d'un mécanisme pour éliminer ce problème. La solution en question est similaire à ce qu'on trouve sur les architectures multicœurs, qui sont confrontées au même problème. Il y a des données qui ne doivent pas être traitées par plusieurs ''threads'' à la fois. La solution est d'ajouter au processeur des '''instructions atomiques''', qui lisent, modifient et écrivent une donnée, sans qu'aucune instruction ne puisse les déranger. De telles instructions empêchent tout accès mémoire à la donnée manipulée, tant qu'elles ne sont pas terminées. Le terme atomique veut dire qu'elles donnent l'impression de s'exécuter en une seule fois, elles ne donnent pas l'impression d'associer une lecture, une opération et une écriture séparées. Les GPU modernes ont des instructions atomiques, utilisables uniquement dans les ''pixel shaders''. Par contre, leur implémentation matérielle est différente. Les CPU multicœurs rendent leurs instructions atomiques par divers mécanismes. Le plus simple bloque totalement le bus mémoire, pour empêcher aux autres cœurs d'accéder à la mémoire RAM. Le cout en performance est alors énorme. Une solution alternative utilise les mécanismes de cohérence des caches. L'idée est de bloquer certaines lignes de cache, afin qu'aucun autre cœur ne puisse lire ou écrire la ligne de cache réservée. Mais les GPU ne peuvent pas faire cela. Les méthodes précédentes fonctionnent quand on a un bus mémoire partagé entre 2-4 cœurs, mais ont un cout en performance trop important au-delà. Aussi, les GPUs font autrement. Ils exécutent les instructions atomiques en dehors du processeur de shader ! À la place, chaque cache est associé à une '''unité atomique''' (''atomic unit''), qui exécute les opérations atomiques directement dans le cache, en dehors des processeurs de shader. Pour exécuter une instruction atomique, les processeurs de shaders envoient l'instruction aux unités atomiques, qui les exécutent directement dans le cache. Les unités atomiques peuvent recevoir plusieurs instructions atomiques en même temps, mais elles forcent l'exécution des instructions atomiques à se faire une par une. {{NavChapitre | book=Les cartes graphiques | prev=Les Render Output Target | prevText=Les Render Output Target | next=Le support matériel du lancer de rayons | nextText=Le support matériel du lancer de rayons }}{{autocat}} ev7cbimok6inie38b95mqth224qm3mg 764892 764875 2026-04-24T17:58:32Z Mewtow 31375 /* Les instructions atomiques des compute shaders */ 764892 wikitext text/x-wiki Le chapitre précédent nous a expliqué comment les ROPs mettaient à jour le ''framebuffer'' et le tampon de profondeur. Cependant, les ROPs ne sont pas les seuls à écrire en mémoire vidéo. Les ''compute shaders'', ''vertex shaders'' et ''pixel shaders'' peuvent écrire des données en mémoire vidéo, dans des tableaux dédiés. Et n'allez pas croire que c'est un petit sujet. La majeure partie des jeux vidéos actuels utilisent des techniques de rendu différé qui ne fonctionneraient pas sans cela ! Et ne parlons pas des ''compute shaders'', qui ne serviraient à rien sans cela. Dans ce chapitre, nous allons détailler comment se font ces écritures en mémoire. : Notons que nous mettons de côté les architectures ''sort-middle'' et les GPU à rendu en ''tile'' dans ce chapitre. ==Les fonctionnalités de ''Multiple Render Targets''== Il faut noter que les API modernes permettent à un ''pixel shader'' d'écrire dans plusieurs ''render-target''. On parle alors de '''''Multiple Render Targets''''', abrévié en MRT. L'implémentation classique est que le ''pixel shader'' peut écrire son résultat dans une ou plusieurs textures. Précisons qu'il s'agit bien du ''pixel shader'' qui écrit dans une texture. Suivant le GPU, l'écriture dans les ''render target'' peut ou non passer par les ROPs. Sur les anciennes versions de DirectX, un seul ''render target'' passait par les ROPs, mais pas les autres. De nos jours, tous les ''render target'' passent par les ROPs. Il est même possible de configurer le mélange ''alpha'' différemment suivant le ''render target''. <noinclude>[[File:MultiRenderTarget.svg|centre|vignette|upright=3|''Multiple Render Target''.]]</noinclude> ===L'éclairage différé=== Le MRT accélère fortement les techniques d''''éclairage différé''', qui séparent les calculs d'éclairage par pixel dans une passe séparée du reste. Ils fonctionnent en deux passes, au minimum. La première calcule toutes les informations nécessaires pour les calculs d'éclairage par pixel. Elle calcule les normales, la couleur diffuse, de quoi calculer les réflexions spéculaires, et d'autres informations du genre. Le tout est mémorisé dans plusieurs "textures" séparées, qui sont lues par un '''pixel shader''' pour obtenir l'image finale. On parle aussi de rendu différé au lieu d'éclairage différé, mais c'est un détail. La première passe calcule la couleur de chaque pixel, la profondeur de chaque pixel, et la normale de la surface pour chaque pixel. Dans l'implémentation la plus simple, ces informations sont écrites dans trois "textures" : une qui contient la couleur diffuse, une autre pour la profondeur, et une autre pour les normales. Il faut alors supporter des pseudo-''framebuffer'' pour chaque "texture". Ils sont appelés des '''''G-buffer''''', ce qui est l'abréviation de tampon géométrique. {| |[[File:Deferred rendering pass col.jpg|thumb|''G-buffer'' pour la couleur.]] |[[File:Deferred rendering pass dep.jpg|thumb|''G-buffer'' pour la profondeur.]] |[[File:Deferred rendering pass nor.jpg|thumb|''G-buffer'' pour les normales.]] |[[File:Deferred rendering pass res.jpg|thumb|Image finale]] |} L'intérêt de l'éclairage différé est d'exécuter le ''pixel shader'' une fois par source de lumière et par pixel. Il y a donc un ''draw call'' par source de lumière, qui lit les ''g-buffer''. La conséquence est que le rendu différé utilise généralement un shader par type de sources de lumières, qu'elles soient ponctuelles, directionnelles, etc. Pour comparer, sans éclairage différé, l'éclairage est réalisé autrement. L'implémentation la plus simple fait les calculs d'éclairage une fois par source et lumière et par objet, avec un ''draw call'' par objet et par source de lumière. On parle alors de '''rendu direct multi-passe'''. La géométrie d'un objet est donc recalculée plusieurs fois, une fois par source de lumière. Par contre, le ''pixel shader'' est généralement assez simple, car on peut utiliser un ''shader'' différent pour les lumières ponctuelles, directionnelles, etc. Mieux que ça : on a tendance à avoir un ''shader'' par ''material'', vu qu'on a généralement un seul ''material'' par objet, les exceptions étant rares. Le cout en termes de performances est alors le suivant : des ''pixels shaders'' très spécialisés et optimisés, mais des calculs géométriques redondants. Une implémentation plus optimisée utilise un seul ''draw call'' par objet. Le ''draw call'' reçoit une liste des sources de lumière. Le ''pixel shader'' lit les sources de lumière une par une dans cette liste, et calcule l'éclairage une source de lumière à la fois, jusqu'à obtenir la couleur finale du pixel. La différence est qu'on a un ''draw call'' par objet, et non un par objet et source de lumière. On parle alors de '''rendu direct simple passe'''. Les calculs géométriques redondants sont éliminés, mais le ''pixel shader'' perd sa spécialisation. Au lieu d'utiliser plusieurs ''pixel shaders'' spécialisés, on utilise un ''über shader'' qui supporte tous les types de sources de lumières et tous les ''materials''. La conséquence est qu'un ''über shader'' tend à être moins bien optimisé, car il utilise plus de registres. Cela est cependant compensé par le fait que le ''pixel shader'' fait peu d'accès mémoire, comparé au rendu différé. Il a beau utiliser plus de registres, ce n'est pas tellement un problème vu qu'il y a moins d'accès mémoire à masquer. Le rendu différé a donc de nombreux avantages et désavantages. Un avantage est que le rendu différé se marie bien avec les effets graphiques de type ''screen space'', comme certaines formes d'occlusion ambiante. Ces effets ont besoin de connaitre la profondeur de chaque pixel, qui est fournie sur un plateau dans un ''g-buffer''. Par contre, la transparence n'est pas prise en charge, de même que l'antialiasing de type MSAA. Il y a aussi des conséquences en termes de performances, car lire les ''g-buffer'' n'est pas gratuit. Le cout en bande passante mémoire, est totalement absent dans le rendu direct, qui se contente de lire les textures des objets. Au final, le rendu différé fait un compromis différent du rendu direct : il échange du temps de calcul contre de la bande passante mémoire et contre la VRAM occupée par les ''g-buffer''. Un autre désavantage est que tous les objets doivent faire leurs calculs d'éclairage avec le peu d'informations présentes dans le ''g-buffer''. Ils doivent donc se débrouiller avec une couleur diffuse, spéculaire, les normales et quelques informations comme l'émissivité. En clair, plusieurs ''materials'' partagent des BRDFs très similaires, voire identique. Le rendu direct n'a absolument pas ce problème et peut utiliser un ''material'' différent par objet, voire plusieurs ''materials'' différents sur un même objet. Ils seront simplement rendus dans des ''draw call'' séparés. ===Une prépasse z implicite=== Les avantages et désavantages de l'éclairage différé sont très nombreux. L'un d'entre eux est que l'on n'a pas d'''overdraw'' : seuls les pixels visibles sont éclairés. Ce n'est pas forcément le cas avec le rendu direct (''forward rendenring''), où des pixels sont éclairés par un ''pixel shader'' et enregistrés dans le ''framebuffer'', avant d'être écrasé par la suite. On dit qu'il y a un certain ''overdraw'', d'autant plus important que les pixels invisibles éclairés sont nombreux. Les techniques d'élimination des pixels cachés limitent la casse, mais elles ne fonctionnent à la perfection que si l'on trie les triangles du plus proche au plus lointain, ce qui n'est jamais fait en pratique. Il est cependant possible d'éliminer tout ''overdraw'' avec le rendu direct, en utilisant une pré-passe z (abordé dans le chapitre sur le ROP). D'ailleurs, le rendu différé effectue une pré-passe z implicitement. En réalité, l'éclairage différé est une sorte de pré-passe z sous stéroïde, qui ne fait pas que calculer le tampon de profondeur final, mais calcule aussi les normales et d'autres informations fournies par la rastérisation. De plus, le rendu différé ne recalcule pas la géométrie dans la seconde passe, alors que le rendu direct avec pré-passe z va le faire. Par contre, cette pré-passe z implicite est à l'origine de plusieurs défauts de cette technique. Déjà, l'usage d'une prépasse z n'est pas compatible avec l'usage de la transparence. Le rendu différé ne fonctionne que pour les objets opaques. La seule solution est de traiter les objets opaques à part des objets transparents. Les objets opaques sont rendus dans une première passe utilisant le rendu différé, alors que les objets transparents sont rendus dans une seconde passe qui utilise le rendu direct.La prépasse z désactive aussi l'antialiasing, même si je ne peux pas expliquer pourquoi ici. ===L'implémentation sur les GPU modernes=== Sans MRT, le rendu différé est très compliqué à implémenter. Chaque ''g-buffer'' demande une passe de rendu, chacune re-calculant la géométrie. Par contre, avec MRT, les différents ''g-buffer'' sont tous calculés en une seule passe, sans recalculer la géométrie plusieurs fois. Il est possible d'ajouter d'autres textures pour d'autres informations, comme des textures pour les paramètres de la lumière spéculaire (couleur spéculaire, illumination). Par contre, on est rapidement limité en termes de nombres de textures. En effet, les GPU modernes supportent entre 4 à 8 textures maximum en sortie pour le MRT. Un ''pixel shader'' a donc accès à 4 ''g-buffer'', rarement plus. Pour une compatibilité maximale, les programmeurs se limitent à 4 textures. De plus, utiliser plus de textures aurait un impact en matière de consommation mémoire, et de bande passante. Pour limiter la casse, il est possible de regrouper des informations séparées dans un seul ''g-buffer'', pour gagner de la place. Par exemple, la couleur diffuse est une couleur RGB codée sur 24 bits, là où une texture utilise souvent des pixels RGBA codés sur 32 bits. Il est alors d'utiliser l'octet pour la composante A pour stocker une autre information, comme une information de métallicité (utilisée pour calculer la couleur spéculaire). Un autre défaut du MRT est que son usage désactive de nombreuses optimisations intégrées dans les ROPs, comme le ''z-fast pass''. De telles optimisations demandent en effet que les ROPs n'écrivent que dans un seul ''render target'' : le tampon de profondeur. LA vitesse des ROPs est alors doublée, sans compter que la bande passante mémoire est mieux utilisée. Mais dès qu'on active le MRT, ces optimisations sont désactivées. En comparaison, elles sont activées lors d'une prépasse z normale. Enfin, le MRT désactive automatiquement l'antialiasing matériel. Précisément, c'est l'antialiasing de type ''multisampling'' (MSAA) qui est désactivé, même s'il est possible d'utiliser du ''supersampling'' ou un antialiasing par post-traitement. En conséquence, l'usage de l'éclairage différé désactive totalement le MSAA. ==La fonctionnalité de ''stream output''== Une fonctionnalité des ''geometry shaders'' est la possibilité d'enregistrer leurs résultats en mémoire. Il s'agit de la fonctionnalité du '''''stream output'''''. On peut ainsi remplir une texture ou le ''vertex buffer'' dans la mémoire vidéo, avec le résultat d'un ''geometry shader''. Notons que celle-ci mémorise un ensemble de primitives, pas autre chose. Cette fonctionnalité est utilisée pour certains effets ou rendu bien précis, mais il faut avouer qu'elle n'est pas très souvent utilisée. Aussi, les concepteurs de cartes graphiques n'ont pas optimisé cette fonctionnalité au maximum. Le ''stream output'' n'a généralement pas accès prioritaire à la mémoire, comparé aux ROP, et n'a souvent accès qu'à une partie limitée de la bande passante mémoire. Notons qu'il existe deux formes de ''stream output'' : une qui permet aux ''vertex shader'' d'écrire dans une texture, l'autre qui permet aux ''geometry shaders'' de le faire. Notons que le ''stream output'' fournit un flux de primitives, pas de sommets, même pour le flux sortant d'un ''vertex shader''. En clair, beaucoup de sommets sont dupliqués et ont n'a pas d{{'}}''index buffer''. Les résultats du ''stream output'' sont donc assez lourds et prennent beaucoup de mémoire. [[File:Stream output.png|centre|vignette|upright=2.5|Stream output]] ==Les instructions atomiques des ''compute shaders''== Dans le chapitre précédent, nous avions parlé des ROPs, et notamment de pourquoi on ne peut pas les émuler dans un ''shader''. Le problème est que plusieurs instances de shaders peuvent lire une même donnée, faire un traitement, et la remplacer par leur résultat. Et l'ordre entre ces instances de shaders n'est pas garanti. Le même problème peut survenir dans un ''compute shader'', à savoir un shader utilisé pour du GPGPU. Un ''compute shader'' peut accéder à un ou plusieurs tableaux en mémoire, voire des structures de données plus complexes. Mais restons sur des tableaux. Les tableaux en question sont appelés des ''Unordered Access Views'', leur nom indiquant qu'aucune garantie n'est donnée sur l'ordre des écritures. Il n'y a pas de tri entre instances de shaders pour que les shaders écrivent leurs données dans leur ordre de lancement. À la place, les écritures dans un ''compute shader'' sont immédiates. Les shaders peuvent lire et écrire dans la mémoire vidéo dans le désordre. Le problème est qu'il y a des données qui ne doivent pas être traitées par plusieurs instances d'un ''compute shader'' à la fois. Heureusement, les ''compute shaders'' disposent d'un mécanisme pour éliminer ce problème. La solution en question est similaire à ce qu'on trouve sur les architectures multicœurs, qui sont confrontées au même problème. Il y a des données qui ne doivent pas être traitées par plusieurs ''threads'' à la fois. La solution est d'ajouter au processeur des '''instructions atomiques''', qui lisent, modifient et écrivent une donnée, sans qu'aucune instruction ne puisse les déranger. De telles instructions empêchent tout accès mémoire à la donnée manipulée, tant qu'elles ne sont pas terminées. Le terme atomique veut dire qu'elles donnent l'impression de s'exécuter en une seule fois, elles ne donnent pas l'impression d'associer une lecture, une opération et une écriture séparées. Les GPU modernes ont des instructions atomiques, utilisables uniquement dans les ''pixel shaders''. Par contre, leur implémentation matérielle est différente. Les CPU multicœurs rendent leurs instructions atomiques par divers mécanismes. Le plus simple bloque totalement le bus mémoire, pour empêcher aux autres cœurs d'accéder à la mémoire RAM. Le cout en performance est alors énorme. Une solution alternative utilise les mécanismes de cohérence des caches. L'idée est de bloquer certaines lignes de cache, afin qu'aucun autre cœur ne puisse lire ou écrire la ligne de cache réservée. Mais les GPU ne peuvent pas faire cela. Les méthodes précédentes fonctionnent quand on a un bus mémoire partagé entre 2-4 cœurs, mais ont un cout en performance trop important au-delà. Aussi, les GPUs font autrement. Ils exécutent les instructions atomiques en dehors du processeur de shader ! À la place, chaque cache est associé à une '''unité atomique''' (''atomic unit''), qui exécute les opérations atomiques directement dans le cache, en dehors des processeurs de shader. Pour exécuter une instruction atomique, les processeurs de shaders envoient l'instruction aux unités atomiques, qui les exécutent directement dans le cache. Les unités atomiques peuvent recevoir plusieurs instructions atomiques en même temps, mais elles forcent l'exécution des instructions atomiques à se faire une par une. <noinclude> {{NavChapitre | book=Les cartes graphiques | prev=Les Render Output Target | prevText=Les Render Output Target | next=Le support matériel du lancer de rayons | nextText=Le support matériel du lancer de rayons }}{{autocat}} </noinclude> 2ps0rgh8do5rkzm540e3yz3v414lpi7 Pour lire Platon/Guide des dialogues/Apologie de Socrate 0 83824 765001 764671 2026-04-25T08:06:43Z PandaMystique 119061 765001 wikitext text/x-wiki == Introduction générale == {{wikisource|Apologie de Socrate (Platon)|Apologie de Socrate}} === L’événement et sa portée === [[Fichier:Socrate du Louvre.jpg|vignette|droite|upright=0.9|Portrait de Socrate, marbre, copie romaine d’époque impériale reproduisant un original grec attribué à Lysippe (IV{{e}} siècle av. J.-C.). Musée du Louvre, Paris (inv. Ma 59).]] En l’an 399 avant notre ère, à Athènes, un vieil homme de soixante-dix ans comparaît devant un tribunal populaire composé de cinq cent un jurés citoyens. Il s’appelle Socrate, fils de Sophronisque ; il est accusé d’impiété et de corruption de la jeunesse. Au terme d’une longue journée d’audience, à une faible majorité d’abord (telle que, selon ses propres mots en 36a, un basculement de trente voix aurait suffi à l’acquittement), puis à une majorité plus large pour la peine capitale, il sera condamné à mort. Quelques semaines plus tard, il boira la ciguë dans sa cellule, devant ses disciples, après le retour du bateau sacré de Délos. Cet événement, déjà traumatisant en son temps, est devenu le mythe fondateur de la philosophie occidentale : le moment où la cité met à mort celui qui prétendait y exercer, par la parole et l’examen, un magistère moral. L’''Apologie de Socrate'' est l’œuvre par laquelle Platon, alors âgé d’une quarantaine d’années, rend compte de ce procès. On situe sa composition probablement entre 390 et 385, soit une dizaine d’années après les faits. Le texte se présente sans cadre fictionnel : nul narrateur, nul personnage introductif, nulle scène préalable comme il en existe dans la plupart des autres dialogues. Nous sommes plongés d’emblée dans la parole de Socrate, au moment où il se lève pour prendre la parole. Contrairement à la plupart des dialogues platoniciens, Platon s’efface presque entièrement : comme le remarque B. Piettre dans son commentaire, dans aucune autre œuvre on n’a l’impression d’entendre avec une telle proximité la parole de Socrate, « comme s’il nous était donné d’assister au procès »<ref name="piettre">Bernard Piettre, ''Platon, Apologie de Socrate'', traduction, présentation et notes de Bernard et Renée Piettre, Paris, Le Livre de Poche (Librairie générale française), coll. « Libretti », 1997, p. 21.</ref>. Cela ne signifie pas que l’''Apologie'' soit une transcription sténographique du plaidoyer : Platon recompose, réorganise, stylise. Mais il s’efforce, probablement plus que dans tout autre dialogue, de restituer la voix, le ton, l’argumentation du maître. Il convient de rappeler que l’''Apologie'' de Platon n’est pas la seule défense posthume de Socrate. Xénophon a également rédigé une ''Apologie'' qui nous est parvenue, brève et d’un ton psychologique différent, ainsi que des ''Mémorables'' qui reprennent certains motifs<ref>Xénophon, ''Apologie de Socrate'' et ''Mémorables'', trad. P. Chambry, Paris, Garnier-Flammarion, 1967.</ref>. D’autres disciples, comme Eschine de Sphettos, ont composé des écrits socratiques aujourd’hui perdus<ref>Voir Gabriele Giannantoni, ''Socratis et Socraticorum Reliquiae'', 4 vol., Naples, Bibliopolis, 1990.</ref>. Un pamphlet hostile, l’''Accusation de Socrate'' du sophiste Polycrate (probablement composé vers 393-392), circulait et aurait donné à Platon l’occasion de répondre indirectement. La concurrence entre ces « socratiques » explique vraisemblablement en partie le soin que Platon met à camper son propre Socrate, qui finira par s’imposer comme la figure canonique dans la postérité. L’enjeu de l’''Apologie'' dépasse de loin la réhabilitation posthume d’un homme. À travers le procès de Socrate, Platon met en accusation la cité qui l’a condamné ; il ouvre l’espace d’une autre politique, où la philosophie, cet « amour du savoir » (''philosophía''), apparaît comme la véritable vocation civique. Condamner le philosophe, c’est pour Athènes se condamner elle-même, préférer l’ignorance au savoir, la facilité au courage, la flatterie à la vérité. L’''Apologie'' constitue ainsi, selon une formule souvent reprise, l’un des textes fondateurs de la philosophie comme discours distinct, à la fois opposé à la sophistique et à la rhétorique, et radicalement engagé dans l’existence concrète. Elle offre en outre une cristallisation exemplaire de ce qu’on appellera le « dialogue socratique », genre dont Platon fera sa forme propre de pensée. === Contexte historique du procès === Pour comprendre la portée du texte, il faut garder à l’esprit la situation d’Athènes en 399. La cité sort épuisée de la longue guerre du Péloponnèse (431-404), qui l’a opposée à Sparte et s’est soldée par la défaite totale d’Athènes. Après la capitulation, Lysandre, le général spartiate, a imposé un gouvernement oligarchique (les Trente) qui a régné par la terreur pendant environ huit mois (404-403) : exécutions sommaires, confiscations, exil des démocrates. La démocratie a été rétablie par un soulèvement armé parti de Phylè en 403, et, dans le cadre des accords de réconciliation conclus sous l’archontat d’Euclide, une amnistie générale a été proclamée pour ne pas ajouter la guerre civile aux malheurs déjà subis : il était désormais interdit, sous peine de sanctions, de se référer aux événements antérieurs à la restauration<ref>Sur cette amnistie, qu’il ne faut pas confondre avec le décret de Patroclide de 405 (qui portait sur la réhabilitation des ''atimoi''), voir Aristote, ''Constitution d’Athènes'', 39-40 ; et Xénophon, ''Helléniques'', II, 4, 38-43.</ref>. Mais les plaies étaient béantes, et le ressentiment courait souterrainement. Or Socrate avait été, dans les années antérieures, un familier de personnages qui incarnaient précisément ces désastres. Alcibiade, son disciple brillant et fantasque, avait entraîné Athènes dans la désastreuse expédition de Sicile (415-413), scandalisé la cité par l’affaire de la mutilation des hermès, puis fini par trahir sa patrie en passant chez Sparte. Critias, autre de ses proches, avait été l’un des chefs, peut-être le principal, du gouvernement des Trente, artisan de la terreur oligarchique. Charmide, oncle de Platon et lui aussi de l’entourage socratique, avait également appartenu à ce régime. Même si Socrate lui-même avait refusé de collaborer avec les Trente (comme il le rappellera dans son plaidoyer à propos de l’arrestation de Léon de Salamine), sa réputation se trouvait entachée. Le procès de 399, bien que portant officiellement sur des griefs religieux, fonctionne donc aussi comme un règlement de comptes politique, que l’amnistie interdisait pourtant de mener ouvertement. Eschine le rhéteur, quelques décennies plus tard, dira sans détour que les Athéniens avaient condamné Socrate « parce qu’il avait été le maître de Critias »<ref>Eschine, ''Contre Timarque'', I, 173.</ref>. L’accusation est portée par trois hommes. Mélétos, poète tragique obscur, plutôt jeune, est le plaignant officiel, celui qui a déposé la plainte auprès de l’archonte-roi, magistrat compétent pour les affaires religieuses. Mais Socrate sait parfaitement que le véritable moteur de la procédure est Anytos, riche tanneur, homme politique influent de la démocratie restaurée, qui avait participé à la chute des Trente. Son fils, raconte Xénophon, fréquentait Socrate et préférait ses entretiens à la tannerie paternelle : hostilité d’autant plus vive<ref>Xénophon, ''Apologie de Socrate'', 29-31.</ref>. Dans le ''Ménon'' de Platon (90b-95a), Anytos apparaît comme le type même du démocrate borné, ennemi viscéral des sophistes et plus largement des intellectuels<ref>Platon, ''Ménon'', 89e-95a.</ref>. Le troisième accusateur, Lycon, est un orateur dont la fonction semble avoir été de soutenir la plaidoirie par une péroraison énergique. La plainte, dont Diogène Laërce nous a conservé le texte<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 40.</ref>, s’énonce approximativement ainsi : <blockquote>Socrate est coupable de ne pas reconnaître les dieux que reconnaît la cité et d’introduire des divinités nouvelles ; il est aussi coupable de corrompre la jeunesse. Peine requise : la mort.</blockquote> Trois griefs, donc : la négation des dieux traditionnels, l’introduction de nouvelles divinités, la corruption de la jeunesse. Ces trois chefs d’accusation sont intimement liés dans la logique de l’accusation : en introduisant de nouvelles divinités et en niant les anciennes, Socrate aurait, par son enseignement, détourné les jeunes gens du respect dû à la religion civique, donc corrompu la cité dans ses fondements. L’accusation d’impiété (''asébeia'') était une accusation politique au sens fort, puisque la religion à Athènes n’était pas une affaire privée mais la substance même du lien civique. === Le cadre procédural === Le procès se tient à l’Héliée, le tribunal populaire, probablement dans un local situé sur l’agora. Les jurés (501 ce jour-là, nombre impair pour éviter les égalités) ont été tirés au sort le matin même parmi les six mille citoyens qui s’étaient inscrits comme héliastes pour l’année. Une journée entière est consacrée à la procédure, dont le temps est rigoureusement partagé entre l’accusation et la défense au moyen de la clepsydre, horloge à eau. Chaque partie parle pour son propre compte : ni procureur ni avocat. Il est permis de faire corroborer son discours par un orateur plus habile (ce dont Mélétos semble avoir bénéficié avec Lycon), ou de lire un discours écrit par un logographe. La tradition rapporte que Lysias, le plus grand logographe de l’époque, aurait composé pour Socrate un plaidoyer de défense ; Socrate en aurait reconnu la beauté avant de le rejeter comme ne lui convenant pas<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 40 ; Cicéron, ''De l’orateur'', I, 231.</ref>. La procédure, pour un procès où la loi n’a pas fixé la peine à l’avance (on parle alors d’''agôn timētós'', « procès à peine à estimer »), comporte deux votes. Après les plaidoiries, un premier vote tranche sur la culpabilité. En cas de condamnation, l’accusateur propose une peine (ici, la mort), l’accusé doit proposer une contre-peine, et un second vote choisit entre les deux sans possibilité de moyen terme. Cette contrainte procédurale pèse lourd sur la suite : les jurés, contraints de choisir entre deux propositions extrêmes, se trouvent ainsi, par la stratégie de Socrate refusant de proposer une peine crédible, poussés à voter la mort. C’est la procédure en deux temps qui explique la structure tripartite de l’''Apologie'' telle que Platon nous l’a transmise : d’abord le grand plaidoyer de défense (17a-35d), puis le discours de contre-proposition pénale après le verdict de culpabilité (35e-38b), enfin une dernière allocution prononcée après la condamnation à mort, adressée tour à tour aux jurés qui ont voté contre lui et à ceux qui l’ont soutenu (38c-42a). Il faut ajouter que les procès athéniens étaient des spectacles autant que des procédures. Le public y assiste ; les plaideurs usent de toute la rhétorique, des larmes de la famille éplorée, des supplications ostentatoires, des témoignages de moralité. Aristophane, dans ''Les Guêpes'' (422), ridiculise la passion que les Athéniens portaient à ces mises en scène judiciaires et le plaisir qu’ils prenaient à voir les accusés se répandre en lamentations. Socrate, comme on le verra, refuse délibérément toute cette théâtralité, ce qui nourrira, après la condamnation, son reproche aux juges : ils l’ont condamné non pas parce qu’il était coupable, mais parce qu’il n’a pas consenti à s’abaisser. === Structure et dispositif du texte === Lu rétrospectivement à travers la grille qu’Aristote constituera dans sa ''Rhétorique'', le plaidoyer de Socrate laisse reconnaître, dans son grand plan, les parties canoniques du discours judiciaire : on y distingue successivement l’exorde (17a-18a), la diabolè ou dénigrement des accusations antérieures (18a-19d), la narration ou ''diḗgēsis'' qui expose les faits (19d-24b), la réfutation proprement dite (24b-28a), l’amplification et la péroraison (28a-35d). Il ne s’agit pas de prétendre que Platon a composé son texte en suivant consciemment un schéma déjà codifié (la ''Rhétorique'' aristotélicienne est postérieure), mais de remarquer que le plaidoyer épouse, dans ses grandes articulations, les usages rhétoriques de son temps. Cette conformité apparente est constamment subvertie par l’ironie socratique : Socrate adopte la forme du discours judiciaire tout en la démentant dans son contenu, en refusant ses procédés et en retournant ses attentes. Le texte fonctionne ainsi comme une parodie philosophique de la rhétorique : il emprunte à l’art oratoire sa structure, mais seulement pour en exhiber la vanité quand il s’agit de la vérité. == Lecture suivie du texte == === Le premier discours : la défense (17a-35d) === ==== L’exorde (17a-18a) : la vérité contre l’éloquence ==== Dès les premiers mots, Socrate pose le ton. La formule d’ouverture, <blockquote>Quel effet, Athéniens, ont produit sur vous mes accusateurs, je l’ignore,</blockquote> est un exorde classique (en grec ''prooímion'') dont la fonction rhétorique, comme le rappelle Aristote dans la ''Rhétorique'' (III, 14), est de capter la bienveillance et l’attention de l’auditoire<ref>Aristote, ''Rhétorique'', III, 14, 1415a22-b30.</ref>. Socrate s’en sert pour établir immédiatement l’antithèse qui structurera tout son plaidoyer : ses accusateurs ont parlé avec persuasion, mais n’ont dit « rien de vrai ou presque » ; lui, en revanche, dira « toute la vérité ». Cette opposition entre l’éloquence ornée des adversaires et la parole nue de Socrate est un retournement ironique savamment préparé. Les accusateurs ont mis les juges en garde contre le « redoutable discoureur » qu’est Socrate. Mais, rétorque-t-il, s’ils entendent par là celui qui dit la vérité, il concède qu’il est un orateur, bien que pas à leur manière. Ses discours ne seront pas, dit-il, « des discours élégamment tournés, comme les leurs, ni même des discours qu’embellissent des expressions et des termes choisis », mais « des choses dites à l’improviste dans les termes qui [lui] viendront à l’esprit ». L’opposition technique est nette : d’un côté le discours apprêté, fondé sur la sélection du vocabulaire (''onómata''), la tournure des phrases (''rhḗmata'') et les arrangements (''kósmos'') ; de l’autre une parole qui se veut « au hasard », sans préparation. Socrate demande aux juges de lui pardonner cette façon de parler : il a soixante-dix ans, comparaît pour la première fois de sa vie devant un tribunal, et il est donc « étranger à la langue en usage ici ». Comme un véritable étranger qui parlerait dans son dialecte, il entend s’exprimer comme il le fait ordinairement, sur l’agora ou devant les comptoirs des changeurs. Le juge, conclut-il, doit juger sur le fond : <blockquote>si mes allégations sont justes ou non. Telle est en effet la vertu du juge, tandis que celle de l’orateur est de dire la vérité. (18a)</blockquote> Cette prise de position initiale est philosophiquement lourde de conséquences. Elle reformule, dès l’ouverture, l’opposition fondamentale entre la rhétorique (l’art de persuader, tel que le pratiquent sophistes et logographes) et la philosophie (recherche de la vérité par l’examen rationnel). Les sophistes, comme Gorgias ou Protagoras, avaient fait de la rhétorique un instrument neutre, capable de « faire de l’argument le plus faible l’argument le plus fort » (formule qui reviendra explicitement contre Socrate au chef d’accusation). Socrate, à l’inverse, affirme que la parole a pour fonction première de manifester le vrai, et que celui qui se défend en justice ne doit pas jouer des passions ou des artifices, mais soumettre les arguments à l’examen rationnel des jurés. On notera pourtant que cette protestation de simplicité est elle-même une figure rhétorique sophistiquée : celui qui clame qu’il ne sait pas parler parle déjà, et fort bien. Il s’agit de la ''dissimulatio artis'' que Cicéron théorisera plus tard : l’art supérieur consiste à cacher l’art. L’ironie socratique commence dès l’exorde. Socrate se présente comme un ''idiṓtēs'' (un simple particulier, un « idiot » au sens grec), étranger aux codes du tribunal, mais cette posture est elle-même un dispositif stratégique qui retourne contre l’accusation la suspicion de sophistique : ce n’est pas Socrate qui manipule les mots, ce sont les accusateurs. L’inversion est complète. ==== Les « anciens accusateurs » : la calomnie de longue durée (18a-19d) ==== Socrate introduit ensuite une distinction cruciale : il doit répondre à deux catégories d’accusations, celles de ses « accusateurs récents » (Mélétos, Anytos, Lycon), mais aussi, et d’abord, celles de ses « anciens accusateurs », qui ont « depuis de nombreuses années » répandu une image fausse de lui. Ceux-là, il les redoute davantage que les nouveaux, pour trois raisons convergentes. Ils sont d’abord nombreux : il ne s’agit pas de trois personnes identifiables, mais d’une rumeur collective. Leurs accusations sont ensuite anciennes : elles ont eu le temps de s’enraciner dans les esprits. Enfin, ils ont agi auprès des juges « dès l’enfance », à un âge où « vous aviez le moins de défiance », de sorte que les jurés en ont reçu l’empreinte avant même d’avoir l’âge de l’examiner. Quelle est la teneur de cette calomnie ancienne ? Socrate la résume en une formule qui reviendra plusieurs fois dans le texte comme un chef d’accusation fantasmatique : <blockquote>Il existe un certain Socrate, un savant, un « penseur » qui s’intéresse aux choses qui se trouvent en l’air, qui mène des recherches sur tout ce qui se trouve sous la terre et qui de l’argument le plus faible fait l’argument le plus fort. (18b)</blockquote> Cette caricature hétéroclite condense en réalité trois traits initialement distincts. Il y a d’abord la figure du physicien à la manière des présocratiques (Anaxagore, Diogène d’Apollonie), qui spéculait sur les phénomènes célestes (''tà metéōra'') et souterrains. Il y a ensuite celle de l’athée, puisque interroger la nature par la raison revenait, dans la perception populaire, à nier les dieux traditionnels (Anaxagore avait été poursuivi pour cette raison vers 433, Protagoras également, et tous deux avaient été contraints à l’exil). Il y a enfin celle du sophiste, expert en retournements dialectiques, capable de faire triompher n’importe quelle cause par le seul art des mots. L’incohérence de ce portrait (un philosophe de la nature qui serait en même temps un manipulateur rhétorique) ne l’empêche pas d’être efficace dans l’opinion. C’est le propre de la rumeur (''diabolḗ'') : elle n’a pas à être cohérente pour être puissante. Socrate le reconnaît avec lucidité : la force de cette calomnie vient précisément de ce qu’elle ne repose sur aucune source identifiable, qu’on ne peut donc ni l’interroger, ni la réfuter. Combattre ces accusateurs anonymes, dit Socrate, « c’est comme se battre contre des ombres » (18d). C’est une difficulté propre au philosophe dans la cité : face à l’opinion établie, il n’a pas d’adversaire identifiable, donc pas de prise dialectique. Socrate désigne cependant une source probable : les comédies, et en particulier ''Les Nuées'' d’Aristophane, représentées en 423 (vingt-quatre ans avant le procès)<ref>Aristophane, ''Les Nuées'', représentées pour la première fois aux Grandes Dionysies de 423 av. J.-C.</ref>. Il la mentionne d’abord anonymement, parlant d’un <blockquote>Socrate qui se balançait, en prétendant qu’il se déplaçait dans les airs et en débitant plein d’autres bêtises concernant des sujets sur lesquels je ne suis un expert ni peu ni prou. (19c)</blockquote> Le nom d’Aristophane sera explicitement prononcé peu après. Dans cette pièce, le poète comique met en scène un Socrate juché dans une corbeille suspendue, pour mieux « mêler sa pensée subtile à l’air », invoquant les Nuées comme divinités substitutives à celles de la religion populaire, enseignant à un paysan, Strepsiade, puis à son fils Phidippide, comment faire triompher le « Raisonnement injuste » et ruiner par cet apprentissage la piété filiale. La pièce s’achève d’ailleurs sur l’incendie du « Pensoir » socratique. L’enjeu pour Socrate n’est pas seulement de corriger une image fausse : c’est de montrer que les accusations de Mélétos se rabattent exactement sur cette caricature (négation des dieux, introduction de nouveautés religieuses, corruption de la jeunesse), de sorte que contre-attaquer la comédie, c’est déjà dissoudre la plainte. Il y a là un geste tranché : Socrate refuse explicitement d’être confondu, d’une part avec les physiciens qui spéculent sur la nature, d’autre part avec les sophistes qui enseignent la rhétorique contre rémunération. Il énumère d’ailleurs plusieurs sophistes célèbres (Gorgias de Léontinoi, Prodicos de Céos, Hippias d’Élis) et rappelle l’anecdote d’Événos de Paros, qui faisait payer cinq mines pour son enseignement (20b) : somme considérable, correspondant à environ un an et demi de salaire d’un ouvrier qualifié<ref name="brisson">Platon, ''Apologie de Socrate. Criton'', trad. et notes de Luc Brisson, Paris, GF-Flammarion, 2016, p. 131, note 54.</ref>. Socrate, lui, n’a rien à vendre, et c’est précisément cela, comme on le verra, qui témoigne de la pureté de sa démarche. Notons enfin une dimension cruciale de ce moment : Socrate récuse par avance toute identification à la figure du philosophe-penseur retiré du monde, que Platon décrit dans le ''Théétète'' (174a) par l’anecdote célèbre de Thalès tombant dans le puits en contemplant les étoiles<ref>Platon, ''Théétète'', 174a.</ref>. La défense de Socrate sera celle d’un homme de l’agora, immergé dans la cité, engagé dans l’examen de ses concitoyens. Le philosophe socratique n’est pas un contemplatif éloigné des affaires humaines : c’est au contraire le plus urbain des hommes, celui qui ne quitte jamais la ville (comme il le dit dans le ''Phèdre''), celui dont l’activité est fondamentalement politique, même s’il n’exerce aucune charge politique. ==== La narration : l’oracle de Delphes et la naissance de la mission (19d-24b) ==== Pour expliquer l’origine de la calomnie, Socrate engage ce qui correspond à la narration (''diḗgēsis'') du discours rhétorique. Il entreprend de raconter comment il est devenu ce personnage que certains considèrent comme un savant. Cette narration, qui occupe une part importante du discours, contient deux éléments structurants : le récit de l’oracle de Delphes et l’exposé de l’enquête qui s’ensuivit. ===== Le savoir humain et le savoir plus qu’humain (20d-21a) ===== Avant de raconter l’oracle, Socrate pose une distinction fondamentale qui constitue peut-être la pièce conceptuelle centrale de tout le plaidoyer. On dit qu’il est « savant » (''sophós'') : soit. Mais savant en quoi ? Il existe, dit-il, un savoir qui excède la mesure humaine, celui auquel prétendent, moyennant rétribution, les sophistes. Ce savoir-là, Socrate ne le possède pas ; et il aurait « des chances d’être un savant » seulement dans un sens plus modeste, celui d’un savoir qui « se rapporte à l’être humain », une sagesse humaine (''anthrōpínē sophía''). La distinction est capitale. Elle sépare deux ordres de connaissance : celui qui porte sur les choses divines (la nature, le cosmos, les causes premières), que Socrate refuse de revendiquer ; et celui qui porte sur l’humain, sur ce qu’il convient de faire pour vivre bien. Cette distinction préfigure le partage que toute l’histoire de la philosophie reprendra entre philosophie théorique et philosophie pratique, et elle annonce également la réorientation socratique qu’évoque Cicéron dans un passage célèbre : <blockquote>Socrate a fait descendre la philosophie du ciel sur la terre, l’a introduite dans les villes et même dans les maisons, et l’a obligée à s’enquérir de la vie, des mœurs, des choses bonnes et mauvaises. (''Tusculanes'', V, 10-11)<ref>Cicéron, ''Tusculanes'', V, 4, 10-11 : « Socrates autem primus philosophiam devocavit e caelo et in urbibus conlocavit et in domus etiam introduxit... »</ref></blockquote> La philosophie cesse d’être cosmologie pour devenir éthique. Pour prouver l’existence et la nature de ce savoir proprement humain, Socrate invoque un témoin insolite mais sans appel : « le dieu de Delphes », c’est-à-dire Apollon pythien. Le recours à la parole oraculaire, dans un tribunal populaire attaché à la religion civique, est rhétoriquement habile : il retourne l’accusation d’impiété en présentant Socrate comme un serviteur du dieu. ===== L’oracle et l’enquête (21a-23c) ===== [[Fichier:John Collier - Priestess of Delphi.jpg|vignette|gauche|upright=0.85|John Collier, ''La Prêtresse de Delphes'', 1891, huile sur toile, Art Gallery of South Australia. La Pythie est figurée assise sur son trépied, dans les vapeurs qui montent de la faille, laurier en main. C’est à cette prêtresse que Chéréphon aurait posé sa question, selon le récit que fait Socrate en ''Apologie'' 20e-21a.]] C’est le moment où surgit, dans le texte, le récit de l’oracle. Chéréphon, ami d’enfance de Socrate (un homme à la passion impétueuse, démocrate, exilé sous les Trente et revenu avec la démocratie, que la comédie moquait pour sa maigreur ascétique et sa « mine d’endive »<ref>Aristophane, ''Les Guêpes'', v. 1408 ; ''Les Oiseaux'', v. 1296 ; ''Les Nuées'', v. 104.</ref>), était allé un jour à Delphes et avait eu l’audace de demander à la Pythie s’il existait quelqu’un de plus sage que Socrate. La Pythie, prêtresse d’Apollon, parle au nom du dieu et rend des oracles aux consultants : elle répondit que « personne n’était plus sage ». Chéréphon est mort entre-temps (probablement vers 403), mais son frère, présent à l’audience, pourra en témoigner. Cette réponse divine met Socrate dans un profond embarras. Il a « conscience de n’être savant ni peu ni prou ». Mais le dieu, par définition, ne peut mentir : « la loi divine l’interdit » (21b). Comment résoudre l’énigme (''aínigma'') ? Socrate décide alors d’entreprendre une vérification. Il va chercher quelqu’un de plus sage que lui, afin de pouvoir revenir à Delphes et dire : <blockquote>ce dieu m’avait désigné comme le plus sage, mais voici qui l’est davantage.</blockquote> Cette démarche, loin d’être un geste d’orgueil, est présentée comme un service rendu au dieu : c’est pour vérifier l’oracle, non pour le contredire, que Socrate entreprend son enquête. Il accorde à l’oracle une autorité suffisante pour l’interroger méthodiquement, selon un principe qui rappelle la maxime exégétique attribuée à Héraclite : « le maître dont l’oracle est à Delphes ne dit ni ne cache rien : il fait signe »<ref>Héraclite d’Éphèse, fragment DK 22 B 93 (Diels-Kranz) = fragment 14 Conche. Voir Marcel Conche, ''Héraclite. Fragments'', Paris, PUF, coll. « Épiméthée », 1986, p. 168-170.</ref>. L’enquête est méthodiquement menée dans trois directions, que Socrate parcourt successivement. Il va d’abord trouver un homme politique (dont il tait le nom, conformément à la pudeur judiciaire) qui passait pour sage. Après l’avoir interrogé, il constate que cet homme se croit sage mais ne l’est pas. Socrate tire alors la leçon capitale qui donnera son contenu à la sagesse humaine : <blockquote>Il y a des chances que je sois moi-même plus sage que cet homme. Car aucun de nous, il est vraisemblable, ne sait rien qui en vaille la peine ; mais lui pense savoir alors qu’il ne sait pas, tandis que moi, tout comme je ne sais pas, je ne pense pas non plus savoir. (21d)</blockquote> Tel est le célèbre savoir du non-savoir socratique : non pas une ignorance totale, mais la conscience lucide et réfléchie de sa propre ignorance, qui vaut davantage que l’illusion de la science. Socrate répète l’opération avec d’autres hommes politiques, et chaque fois la déception est la même, mais pire : plus l’homme est réputé, plus son ignorance est grande ; plus il est humble, plus il est proche du vrai. Socrate passe ensuite aux poètes : auteurs de tragédies, poètes dithyrambiques et autres. Il leur demande ce que signifient leurs propres œuvres, espérant d’eux un savoir, puisqu’ils produisent de la beauté. Il découvre alors qu’ils composent « non par savoir, mais par une sorte de disposition naturelle et par inspiration, comme les devins et les oracles » (22c). Les poètes disent beaucoup de belles choses sans savoir ce qu’elles veulent dire ; et, comme les hommes politiques, ils se croient, à cause de leur art, savants dans d’autres domaines où ils ne le sont pas. L’inspiration poétique est ainsi reconnue comme réelle, mais dissociée du savoir : le poète est possédé par une muse, non par une compétence. Cette analyse, qui reviendra dans le ''Ion'', est une pièce importante de la pensée platonicienne sur l’art<ref>Platon, ''Ion'', 533d-535a.</ref>. Socrate examine enfin les artisans (''cheirotéchnai''). Ici, la situation est plus nuancée. Les artisans possèdent une compétence réelle, une ''tékhnē'', que Socrate ne songe pas à leur dénier. Mais cette compétence les induit à se croire savants « dans les choses les plus importantes », c’est-à-dire dans les questions morales et politiques, alors qu’ils ne le sont pas. L’artisan, parce qu’il sait faire une paire de chaussures, se croit en droit d’avoir un avis éclairé sur la justice. C’est là un point crucial : Socrate reconnaît la légitimité de la ''tékhnē'' dans son domaine propre, mais refuse l’extrapolation de la compétence technique à la sagesse pratique. La conclusion de l’enquête est double. D’une part, Socrate conclut à la véracité de l’oracle : sa sagesse consiste en ce qu’il ne croit pas savoir ce qu’il ne sait pas. D’autre part, il comprend que l’oracle ne le désignait pas ''lui'' spécifiquement comme sage, mais se servait de son nom à titre d’exemple : <blockquote>il y a des chances, Messieurs, pour qu’en réalité le sage, ce soit le dieu, et que dans ce fameux oracle il veuille dire que la sagesse humaine a bien peu de valeur, et même aucune ; et il est clair qu’en désignant Socrate il s’est servi de mon nom pour me prendre en exemple, comme s’il disait : « Le plus sage d’entre vous, hommes, est celui qui, comme Socrate, a reconnu qu’en réalité sa sagesse ne vaut rien. » (23a-b)</blockquote> Socrate devient ainsi, non pas un savant, mais un exemple (''parádeigma'') par lequel le dieu invite tous les hommes à reconnaître la misère de leur prétention au savoir. La sagesse n’est pas une propriété de l’individu, mais une relation à l’ignorance ; elle est, on pourrait dire, éminemment ''maïeutique'' : elle fait accoucher les autres de la conscience de leur propre ignorance. ===== La mission et la naissance de la haine (23b-24b) ===== De cette interprétation de l’oracle naît la mission socratique. Socrate continue, « en service pour le dieu » (''hypēresía toû theoû''), à enquêter sur quiconque prétend être sage, pour manifester chaque fois qu’il ne l’est pas. Cette activité l’a réduit à « une grande pauvreté », car elle lui a occupé toute sa vie au détriment de ses affaires. Mais elle a aussi suscité contre lui des haines innombrables, chaque fois qu’il a démasqué l’ignorance d’un puissant ou d’un réputé. On touche ici à un mécanisme psychologique qu’il faut bien mesurer : nul n’aime être convaincu d’ignorance, surtout publiquement ; celui qui le fait, même par amour du vrai, se constitue des ennemis à proportion de sa rigueur. Les jeunes gens de bonne famille, ceux qui disposent de loisir (''scholḗ''), prennent plaisir à le voir faire ; ils tentent à leur tour d’imiter sa démarche, et ainsi « se font eux-mêmes haïr par ceux qu’ils examinent » (23c), qui ne s’en prennent pas à ces jeunes, mais à Socrate. Ce dernier devient ainsi le responsable imaginaire d’une activité critique qui déborde largement sa personne. C’est le ressort profond de l’accusation de « corruption de la jeunesse » : ce n’est pas que Socrate ait enseigné le mal, c’est que ses méthodes, imitées par ses disciples, font éclater un scandale qu’on veut lui imputer. C’est ainsi que s’est formée la réputation selon laquelle Socrate serait un « corrupteur de la jeunesse », et qu’on a repris contre lui la vieille caricature : un homme qui fait des recherches sur le ciel et la terre et qui fait triompher la mauvaise cause. Socrate tire la conclusion rhétorique : « c’est en disant la vérité que je me fais des ennemis », ce qui est, dit-il, la preuve qu’il dit vrai. Les causes de l’accusation sont là : non dans une faute réelle, mais dans le ressentiment de ceux qu’il a démasqués. Cette section du plaidoyer est philosophiquement fondamentale. Elle met en place plusieurs concepts clefs du socratisme tel que Platon l’entend. D’abord, la philosophie comme examen (''exétasis'') et non comme doctrine : on ne peut enseigner la philosophie de Socrate parce qu’elle n’est pas un corps de propositions à transmettre, mais une pratique à exercer. Ensuite, le savoir de l’ignorance comme seule forme accessible du savoir humain. Enfin, la philosophie comme mission divine, ce qui lui confère une légitimité supérieure à celle des institutions politiques. Cette dimension religieuse de la philosophie est essentielle à l’économie du texte : si la mission est divine, elle ne peut être interrompue par un décret humain, fût-il celui d’un tribunal souverain. On notera également que cette démarche, en démasquant l’ignorance des prétendus savants, introduit une différence entre savoir et non-savoir sur des sujets où la démocratie athénienne supposait, pour délibérer, qu’il n’y en avait pas. Comme l’explique un passage du ''Protagoras'' (319c-d), rédigé par Platon peu après l’''Apologie'', les assemblées démocratiques distinguent les sujets techniques (sur lesquels seuls les compétents s’expriment) et les sujets politiques (sur lesquels tous les citoyens, cordonniers, potiers, tanneurs ou menuisiers, peuvent donner leur avis)<ref>Platon, ''Protagoras'', 319b-d.</ref>. La délibération collective suppose que sur les sujets politiques, il n’existe pas de différence de compétence entre les citoyens. Or l’enquête socratique a précisément pour effet de réintroduire cette différence sur les objets où l’institution démocratique la refoulait. Se prétendre ignorant soi-même et révéler l’ignorance d’autrui sur les questions de justice ou de vertu, c’est mettre en cause le principe majoritaire là où il s’applique. On comprend en quoi, malgré les apparences, la posture socratique est subversive pour la démocratie athénienne : elle frappe à sa racine épistémologique. ==== La réfutation de Mélétos (24b-28a) ==== Socrate en vient maintenant aux accusations officielles. Il relit la plainte, <blockquote>Socrate est coupable de corrompre la jeunesse et de reconnaître non pas les dieux que la cité reconnaît, mais, au lieu de ceux-là, des divinités nouvelles,</blockquote> et entreprend de l’examiner point par point. Il utilise alors la prérogative que la loi athénienne accorde à l’accusé : interroger directement son accusateur, qui est tenu de répondre. Ce qui suit est l’un des grands morceaux dialectiques de l’''Apologie''. Socrate, en un véritable elenchos (cette réfutation par interrogation qui est sa marque de fabrique), démonte successivement les trois volets de l’accusation. On notera d’emblée un jeu de mots grec qui court tout l’interrogatoire : le nom de Mélétos (''Mélētos'') évoque le verbe ''mélei'' (« se soucier de »). Socrate va reprocher à Mélétos, précisément, de ne pas se soucier (mélein) des choses dont il prétend se soucier. L’ironie est ciselée jusque dans l’onomastique. La méthode que Socrate utilise ici est l’''elenchos'' : il part des thèses de l’interlocuteur, l’amène par des questions à en reconnaître les conséquences, puis lui fait constater la contradiction entre ces conséquences et d’autres thèses qu’il tient également pour vraies. Cette procédure, qui ne démontre rien positivement mais montre qu’une thèse est intenable, est le moteur de la dialectique socratique dans les dialogues de jeunesse de Platon<ref>Sur la méthode de l'elenchus, voir Gregory Vlastos, « The Socratic Elenchus », ''Oxford Studies in Ancient Philosophy'', I, 1983, p. 27-58.</ref>. ===== Qui rend les jeunes meilleurs ? (24b-25c) ===== Premier volet : la corruption de la jeunesse. Socrate commence par un piège dialectique. Si Mélétos accuse quelqu’un de corrompre les jeunes, c’est qu’il a à l’esprit ce qui les rend meilleurs. Qu’il le dise donc. Mélétos, pris au dépourvu, balbutie : « Les lois ». Mais ce n’est pas une personne, objecte Socrate. Il insiste : quel ''homme'' rend les jeunes meilleurs ? Mélétos répond alors, au gré d’une improvisation visiblement embarrassée : les juges, puis les membres du Conseil, puis ceux de l’Assemblée, bref tous les Athéniens ; tous, sauf Socrate. Socrate retourne alors l’argument par une analogie mémorable, celle des chevaux. Suppose-t-on que tous les hommes rendent les chevaux meilleurs, et qu’un seul les corromprait ? Non, c’est évidemment le contraire : pour les chevaux comme pour tous les animaux, seuls quelques spécialistes savent les rendre meilleurs, et la plupart des gens, s’ils s’en occupent, les nuisent. Il en va de même pour les jeunes gens. L’éducation est un art, et l’art suppose la compétence, qui n’est pas le partage du plus grand nombre. En prétendant que tous éduquent bien sauf Socrate, Mélétos révèle qu’il n’a jamais sérieusement réfléchi à ce dont il parle : il s’est désintéressé de la question. Ce qui est précisément ce que le jeu de mots sur son nom entendait suggérer. Ce premier argument est intéressant par ce qu’il laisse apercevoir de la position de Socrate à l’égard de la démocratie. L’éducation, comme le souligne le commentaire de C. Chrétien, est « une affaire politique tant la formation de l’homme paraît indissociable de celle du citoyen »<ref name="chretien">Claude Chrétien, ''Platon, Apologie de Socrate'', Paris, Hatier, coll. « Profil philosophie », 1993, p. 44.</ref>. Or, pour Mélétos et pour les Athéniens en général, la cité est à elle-même sa propre pédagogie : chaque citoyen forme, par son exemple et sa participation à la vie publique, les futurs citoyens. Socrate, à l’inverse, soutient que l’éducation, comme les autres arts, relève d’une compétence particulière, ce qui va à l’encontre du présupposé démocratique d’une compétence civique également partagée. En paraissant ne se battre que sur un détail logique, Socrate met en cause, à travers cet argument, l’un des présupposés majeurs de la démocratie athénienne : celui selon lequel chaque citoyen serait naturellement compétent pour la délibération politique. ===== Corrompre volontairement ? (25c-26a) ===== Deuxième pièce du dispositif : Socrate demande à Mélétos s’il le pense corrompre les jeunes volontairement ou involontairement. Mélétos, rageusement, répond : volontairement. Mais Socrate montre alors que cette réponse est intenable. Car si les méchants font du mal à leur entourage, et les bons du bien, alors corrompre volontairement les gens qui nous entourent (avec lesquels on vit) c’est s’exposer soi-même à en pâtir. Personne, pas même le plus ignorant, ne choisit délibérément de se nuire à soi-même. Donc, ou bien Socrate ne corrompt pas, ou bien, s’il corrompt, c’est involontairement. Et dans ce cas, la loi ne prévoit pas un procès mais une remontrance privée : si on m’avait averti, j’aurais cessé. En me traînant devant le tribunal, Mélétos prouve que son but n’est pas de me corriger mais de me punir ; ce qui est contradictoire avec l’idée d’une faute involontaire. Cet argument repose sur l’un des principes les plus fermes du socratisme, le célèbre paradoxe socratique selon lequel nul ne fait le mal volontairement (''oudeís hekṓn hamartánei''). Socrate y croit sincèrement : si l’on savait vraiment ce qu’est le bien, on ne pourrait pas ne pas le vouloir. Le vice n’est pas une perversion de la volonté, c’est une forme d’ignorance. Cette thèse, qui paraîtra contre-intuitive à toute la tradition postérieure (notamment chrétienne, qui mettra l’accent sur la malice du mal), sera développée dans plusieurs dialogues platoniciens, notamment le ''Gorgias'' et le ''Protagoras''<ref>Platon, ''Gorgias'', 466a-468e, 509c-e ; ''Protagoras'', 352b-358d.</ref>. Aristote, dans l’''Éthique à Nicomaque'', la critiquera comme négligeant la réalité de la ''akrasía'' (faiblesse de la volonté)<ref>Aristote, ''Éthique à Nicomaque'', VII, 2-3, 1145b21-1147b19.</ref>. Mais l’argument sert ici surtout à piéger Mélétos dans une contradiction : soit tu m’accuses d’une faute involontaire, et le procès est illégitime (car la procédure judiciaire vise des fautes intentionnelles) ; soit tu m’accuses d’une faute volontaire, mais celle-ci est psychologiquement impossible (personne ne choisit de se nuire à soi-même). Dans les deux cas, la plainte s’effondre. Remarquons la précision juridique : Socrate joue habilement sur la distinction athénienne entre fautes volontaires (justiciables) et involontaires (pour lesquelles la remontrance privée, la ''nouthesía'', était la procédure appropriée). ===== L’athéisme et les divinités démoniques (26a-28a) ===== Troisième volet : la question religieuse, qui est le cœur même de l’accusation. Socrate demande à Mélétos de préciser son propos : l’accuse-t-il de reconnaître des dieux différents de ceux de la cité, ou de ne reconnaître aucun dieu du tout ? La distinction est cruciale, car la plainte elle-même est ambiguë (elle évoque des « divinités nouvelles », ce qui présuppose que Socrate croit à des divinités, mais lui reproche aussi de ne pas reconnaître celles de la cité). Mélétos, avec une maladresse que Socrate exploite pleinement, s’emporte et répond : « aucun dieu du tout ». Il ajoute même, piégé par sa propre fureur, que Socrate prétend, à la manière d’Anaxagore, que « le soleil est une pierre et la lune une terre ». Socrate saisit l’occasion avec une précision chirurgicale. D’abord, il ridiculise la confusion : Anaxagore, en effet, a soutenu cette thèse physicienne, mais les livres d’Anaxagore, qui se trouvent au marché (à l’orchestre, endroit de l’agora où l’on vendait les livres), coûtent « tout au plus une drachme » ; pourquoi donc accuser Socrate d’avoir inventé ce qu’on peut lire partout et qui n’est pas de lui ? Le trait est doublement dévastateur : il innocente Socrate et il prouve l’incompétence de Mélétos, qui ne distingue pas Socrate d’Anaxagore. Ensuite, il tend son piège principal. La plainte officielle dit que Socrate introduit de nouvelles divinités (''daimónia''). Or Mélétos vient d’affirmer que Socrate n’admet aucun dieu du tout. Ces deux affirmations sont contradictoires : on ne peut pas à la fois reconnaître des divinités et ne reconnaître aucun dieu. Mélétos se contredit lui-même, et sous serment, car la plainte avait été déposée sous serment réciproque (''antōmosía''). Socrate poursuit par un syllogisme subtil. Peut-on reconnaître des « phénomènes démoniques » (''daimónia prágmata'') sans reconnaître l’existence de démons ? De même que l’on ne peut reconnaître des phénomènes hippiques sans reconnaître les chevaux, ni des phénomènes musicaux sans reconnaître les musiciens, on ne peut reconnaître des phénomènes démoniques sans reconnaître les démons. Or les démons, selon la religion grecque traditionnelle, sont soit des dieux soit des enfants de dieux. Donc, si Socrate reconnaît des démons, il reconnaît aussi des dieux, ou à tout le moins des êtres divins. La plainte se contredit elle-même : Mélétos affirme à la fois que Socrate ne reconnaît aucun dieu et qu’il reconnaît des démons, donc des dieux. Ce raisonnement est brillant sur le plan dialectique, mais il a suscité la perplexité des commentateurs. Il repose sur une définition traditionnelle des démons comme « enfants des dieux », qui n’est pas toujours stabilisée dans la culture grecque (chez Hésiode, les démons sont plutôt des hommes de l’âge d’or devenus esprits), et laisse entière la question de savoir ce que sont les « nouvelles divinités » dont Socrate était réellement accusé. La plupart des commentateurs modernes estiment que l’accusation visait précisément le fameux ''daimónion'' socratique, la voix intérieure divine dont Socrate parlera plus loin, qui serait apparue aux Athéniens comme une divinité privée, nouvelle, donc impie car non reconnue par la cité. Socrate, en déplaçant le débat sur la question abstraite de l’existence ou non des démons, élude habilement cette difficulté. C’est un procédé dialectique, non un argument de fond. Il faut aussi percevoir le geste de fond. Comme le note Claude Chrétien, Socrate, par ce raisonnement, rattache sa croyance en des « phénomènes démoniques » à une croyance minimale mais ferme en la divinité, sur un mode qui relève d’une théologie négative : il ne dit rien de positif sur les dieux, mais affirme seulement que quelque chose, dans l’expérience humaine, manifeste leur existence<ref name="chretien-30">Claude Chrétien, ''Platon, Apologie de Socrate'', ''op. cit.'', p. 30-31.</ref>. Cela est cohérent avec son agnosticisme sur les mythes (dans le ''Phèdre'', Socrate refuse de spéculer sur les aventures de Borée enlevant Orithye<ref>Platon, ''Phèdre'', 229b-230a.</ref>) et avec sa dévotion pratique à la religion de la cité (on le voit obéir aux rites dans plusieurs dialogues). Socrate est pieux en acte, agnostique en théorie : il reconnaît une transcendance divine, sans prétendre en décrire la nature. Cette position, fine et paradoxale, est à l’origine d’une tension féconde dans toute la théologie philosophique ultérieure. À la fin de cette section, Socrate conclut qu’il a suffisamment montré que l’accusation de Mélétos est sans consistance. Mais, ajoute-t-il avec lucidité, il sait bien que ce n’est pas elle qui le fera condamner : c’est la vieille calomnie, la haine accumulée au fil des années. D’autres hommes justes, avant lui, ont subi le même sort, et beaucoup en subiront après. ==== La mission divine et le modèle héroïque (28a-30c) ==== Ayant réfuté l’accusation formelle, Socrate entreprend alors ce que Piettre appelle une « amplification »<ref>Piettre, ''op. cit.'', p. 45-46 (sur le découpage du plaidoyer en réfutation et amplification).</ref> : il justifie tout son mode de vie. L’''Apologie'' bascule ici d’un plaidoyer juridique vers une proclamation philosophique. La question n’est plus « suis-je coupable de ces griefs précis ? » mais : « comment justifier un mode d’existence qui expose à la mort ? » C’est à partir de ce moment que l’''Apologie'' cesse d’être un simple plaidoyer pour devenir un manifeste. ===== Le modèle d’Achille (28b-d) ===== Socrate anticipe une objection qu’un auditoire athénien pouvait sincèrement formuler : n’as-tu pas honte, Socrate, d’avoir mené une existence qui t’expose à mourir ? Il y répond par l’évocation des héros homériques, et notamment d’Achille, la figure de référence de la vertu guerrière grecque. Quand Thétis, sa mère, lui annonça qu’il mourrait s’il vengeait Patrocle en tuant Hector, Achille répondit, selon l’''Iliade'' : <blockquote>que je meure immédiatement, pour peu que je punisse le coupable, plutôt que de rester ici, à être la risée de tous, assis sur mes vaisseaux, poids inutile de la terre.<ref>Homère, ''Iliade'', XVIII, v. 96-104 ; cité par Socrate en ''Apologie'', 28c-d.</ref></blockquote> Achille a donc méprisé la mort pour préserver l’honneur. Celui qui occupe une place, explique Socrate, doit y rester, au péril de sa vie, « sans tenir compte d’autre chose que du déshonneur ». Cet argument est une adaptation du modèle homérique, et non une simple reprise. Socrate transforme l’héroïsme aristocratique d’Achille (celui d’un demi-dieu, fils d’une déesse) en une vertu démocratique accessible à tout soldat de la phalange hoplitique : il s’agit de tenir son poste, quelle que soit sa place, qu’on l’ait choisie ou qu’on y ait été affecté par son chef (28d). La vertu n’est plus aristocratique, elle est civique ; elle n’est plus la propriété d’une élite, elle est accessible à quiconque occupe sa place avec fermeté. Cette démocratisation de la vertu héroïque prépare la transposition qui va suivre. Socrate rappelle d’ailleurs son propre passé militaire. Il a combattu à Potidée (432-429), à Amphipolis (424), et surtout à Délion (424), où son courage fut loué par Alcibiade dans le ''Banquet'' (219e et suivants<ref>Platon, ''Banquet'', 219e-221c.</ref>) et par le général Lachès dans le dialogue du même nom (''Lachès'', 181a-b<ref>Platon, ''Lachès'', 181a-b.</ref>). Comme ces soldats qui ne quittent pas leur poste, Socrate ne peut quitter celui qui lui a été assigné, par le dieu. ===== Le poste assigné par le dieu (28d-29a) ===== Socrate pose alors la transposition capitale : <blockquote>le poste qu’on m’a assigné, moi, est celui du philosophe, qui doit vivre en philosophant, en s’examinant soi-même et en examinant les autres. Je ne peux le quitter par crainte de la mort, pas plus qu’un soldat ne peut quitter le sien.</blockquote> La philosophie est ainsi présentée comme une assignation divine, équivalente à l’ordre d’un chef de guerre, et plus impérieuse encore, puisque l’ordre vient du dieu. Cette analogie entre vie philosophique et vie militaire, qui fera carrière dans toute la tradition stoïcienne (Sénèque, Épictète, Marc Aurèle en useront abondamment<ref>Voir notamment Épictète, ''Entretiens'', I, 9, 24 ; III, 24, 31-36 ; Marc Aurèle, ''Pensées'', III, 5 ; VII, 45.</ref>), fonde la philosophie comme service, comme ''officium'', comme devoir qu’on ne peut déserter sans se déshonorer. ===== L’ignorance de la mort (29a-b) ===== Vient alors l’un des passages les plus célèbres du texte, où Socrate renverse la psychologie commune du courage : <blockquote>Craindre la mort, Athéniens, ce n’est rien d’autre que se donner pour savant sans l’être ; c’est donner l’impression qu’on sait ce qu’on ne sait pas. (29a)</blockquote> Car personne ne sait ce qu’est la mort, ni si elle n’est pas pour l’homme le plus grand des biens ; mais on la redoute comme si l’on savait qu’elle est le plus grand des maux. C’est là, dit Socrate, la forme la plus répréhensible d’ignorance : croire savoir ce qu’on ne sait pas, donc la même erreur que celle des faux sages qu’il a démasqués dans son enquête. Le raisonnement est d’une rigueur remarquable. Il articule le savoir du non-savoir à l’éthique du courage. Socrate, lui, sait qu’il ne sait rien de la mort ; il ne la craint donc pas. Mais il sait en revanche, et c’est la seule « exception » à son ignorance proclamée, que <blockquote>commettre une injustice et désobéir à un meilleur que soi, dieu ou homme, cela je sais que c’est mauvais et honteux. (29b)</blockquote> On voit ici le dispositif éthique qui va commander toute la suite : entre un mal certain (l’injustice et la lâcheté) et un mal supposé mais incertain (la mort), le sage choisit sans hésiter d’éviter le premier. Le courage philosophique n’est donc pas un mépris enthousiaste de la mort, comme celui d’Achille, c’est une lucidité sur ce qui est réellement à craindre. Ce renversement de la psychologie héroïque en lucidité rationnelle est l’un des gestes fondateurs de la philosophie morale. ===== L’hypothèse de l’acquittement conditionnel (29c-30c) ===== Socrate imagine alors une situation extrême, une sorte d’expérience de pensée. Supposons que les juges lui offrent de l’acquitter à la condition qu’il cesse de philosopher. Alors Socrate répondrait : <blockquote>Athéniens, je vous suis reconnaissant et je vous aime, mais j’obéirai au dieu plutôt qu’à vous ; et tant qu’il me restera un souffle de vie, tant que j’en serai capable, je ne cesserai, soyez-en sûrs, de philosopher, de vous exhorter et de m’expliquer avec tel ou tel d’entre vous. (29d)</blockquote> Il continuerait à dire à chacun la formule qui résume toute sa mission : <blockquote>Ô excellent homme, toi qui es d’Athènes, la cité la plus grande et la plus réputée pour son savoir et sa puissance, tu n’as pas honte de t’occuper de ta fortune et des moyens de t’enrichir le plus possible, de ta réputation, des honneurs, alors que de ton intelligence, de la vérité, de ton âme et des moyens de la perfectionner, tu ne t’en occupes et ne t’en soucies aucunement ? (29d-e)</blockquote> On est ici au cœur du message socratique, tel que Platon l’a consigné. Le renversement qu’opère ce passage est philosophiquement majeur. D’une part, Socrate affirme que son obéissance au dieu l’emporte sur son obéissance à la cité : c’est, en puissance, toute la doctrine de la désobéissance civile au nom d’une norme transcendante. D’autre part, il renverse la hiérarchie des biens : la vertu ne vient pas de l’argent, mais l’argent et tous les autres biens viennent de la vertu ; il faut donc se soucier prioritairement de son âme (''psuchḗ''), et non de ses biens matériels ou de sa réputation. L’''Apologie'' est ainsi, dans la philosophie occidentale, l’un des textes où s’origine ce thème du souci de soi (''epiméleia heautoû'') compris comme soin de l’âme et examen permanent de soi-même, thème qui parcourra toute la tradition ultérieure, des écoles hellénistiques aux spirituels chrétiens, jusqu’aux lectures contemporaines de Michel Foucault qui en fera un objet majeur de ses derniers cours au Collège de France<ref name="foucault-hs">Michel Foucault, ''L’Herméneutique du sujet. Cours au Collège de France, 1981-1982'', éd. F. Gros, Paris, Gallimard/Seuil, coll. « Hautes Études », 2001, en particulier les leçons des 6, 13 et 20 janvier 1982.</ref>. Socrate ajoute alors l’une de ses déclarations les plus provocatrices : <blockquote>Là-dessus, Athéniens, croyez-en ou non Anytos, acquittez-moi ou ne m’acquittez pas, toujours est-il que je ne changerai pas de conduite, même si je devais souffrir mille morts. (30c)</blockquote> La défense ne demande plus un acquittement ; elle proclame la pérennité de la mission, quel que soit le verdict. Socrate, à ce moment précis du plaidoyer, cesse d’être un accusé pour devenir un apôtre. Cette attitude explique, rétrospectivement, l’incompréhension et l’irritation des jurés : il ne se défend pas, il les défie. ==== Socrate, « taon de la cité » (30c-31c) ==== Socrate affirme alors, avec une audace étonnante, <blockquote>si vous me condamnez à mort, ce n’est pas à moi, mais à vous-mêmes, que vous ferez le plus de tort. (30c)</blockquote> Car ni Mélétos ni Anytos ne peuvent le léser véritablement : ils peuvent le tuer, l’exiler, le priver de ses droits civiques (''atimía''), choses que certains tiendraient pour de grands malheurs, mais lui ne les tient pas pour tels. Le vrai mal est celui que font à leur âme ceux qui entreprennent de tuer injustement. Cette thèse, que Platon développera dans le ''Gorgias'' (469c) sous la forme « il vaut mieux subir l’injustice que la commettre »<ref>Platon, ''Gorgias'', 469c : « [...] je choisirais de subir plutôt que de commettre l’injustice. » Voir aussi 474b-479e.</ref>, est probablement la plus radicale de toutes les thèses morales de l’antiquité. Surgit alors la célèbre image du taon. Socrate est <blockquote>un homme attaché à la cité par le dieu, comme le serait un taon au flanc d’un cheval de grande taille et de bonne race, mais qui se montrerait un peu mou en raison même de sa taille et qui aurait besoin d’être réveillé par l’insecte. (30e)</blockquote> Athènes est ce cheval noble mais assoupi ; Socrate est l’insecte qui le pique, le réveille, le harcèle. Le dieu lui a donné cette mission, qui explique qu’il passe son temps à aborder chacun, « comme un père ou un frère plus âgé », pour le persuader d’avoir souci de la vertu. Cette image mérite qu’on s’y arrête, tant elle est dense. Elle articule trois éléments. D’abord, la noblesse du cheval : Athènes n’est pas critiquée absolument, mais reconnue pour ce qu’elle est, la plus belle cité du monde grec, de « grande taille et de bonne race ». Ensuite, son engourdissement : cette grandeur même la rend molle, somnolente, incapable de s’ébrouer spontanément. Enfin, la nécessité du taon : seule une figure dérangeante, insupportable, inutile en apparence, peut réveiller la cité. Le taon n’est pas à sa place dans le cheval ; il est un corps étranger, irritant ; mais précisément, c’est de cette position dérangeante que vient son utilité. La philosophie est pensée ici comme critique nécessaire, comme dissidence féconde, comme décalage qui maintient la cité vivante. On voit se dessiner une dialectique subtile. Socrate est indissociablement dedans et dehors : citoyen d’Athènes, engagé dans sa cité, respectueux de ses lois au point d’accepter la mort plutôt que de fuir (comme l’exprimera le ''Criton''<ref>Platon, ''Criton'', 50a-54d.</ref>), et en même temps étranger à ses conformismes, à ses illusions, à ses complaisances. Sans le taon, le cheval dormirait ; mais le cheval peut aussi, d’un mouvement irrité, écraser le taon. C’est exactement ce qui se passe au procès. L’image contient en elle-même une prophétie : tuer le taon, c’est se priver de la piqûre bienfaisante, condamner la cité au sommeil. D’où la prédiction de Socrate : <blockquote>en suite de quoi, vous passeriez votre vie à dormir, à moins que le dieu, ayant souci de vous, ne vous envoie quelqu’un d’autre. (31a)</blockquote> La suite de l’histoire, à tout le moins celle de la pensée, dira que cet autre sera Platon lui-même, puis Aristote, et la longue lignée des philosophes que l’''Apologie'' aura rendus possibles. Socrate apporte ensuite une preuve empirique de son désintéressement : sa pauvreté. Si son activité avait un but intéressé, si elle rapportait un salaire, on pourrait douter de la pureté de ses motivations. Mais ses accusateurs, malgré leur acharnement, n’ont pu produire aucun témoin attestant qu’il ait jamais exigé ou reçu un salaire. Sa misère est la meilleure preuve qu’il dit vrai. Cette insistance sur la gratuité de son enseignement est une pique adressée aux sophistes, qui se faisaient richement rémunérer, et un trait supplémentaire qui distingue la philosophie socratique de la ''téchnē'' marchande des sophistes. Socrate n’est pas un prestataire de services ; il est un serviteur du dieu. ==== Le démon et la prudence politique (31c-32e) ==== Une objection se présente naturellement : si Socrate est ce grand conseiller des particuliers, pourquoi ne monte-t-il pas à la tribune pour conseiller la cité elle-même dans ses assemblées ? La réponse est le fameux passage sur le ''daimónion'' socratique. ===== Qu’est-ce que le démon de Socrate ? (31c-d) ===== Socrate confie aux juges ce qu’il a déjà dit « maintes fois en maints endroits » : <blockquote>il m’advient quelque chose de divin et de démonique (''theîón ti kai daimónion''), une voix intérieure qui, depuis [mon] enfance, [...] chaque fois qu’elle m’advient, me détourne toujours de ce que je me propose de faire, mais jamais ne m’y encourage. (31c-d)</blockquote> Cette voix a trois caractéristiques remarquables. Elle est toujours dissuasive : « jamais elle ne m’y encourage ». Elle est personnelle : elle ne s’adresse qu’à Socrate. Elle est présente depuis l’enfance, donc constitutive de son rapport au monde. Elle s’est précisément opposée à son entrée en politique. Il s’agit donc, littéralement, de cette « divinité nouvelle » que l’accusation lui impute, ce que Mélétos, ironise Socrate, a d’ailleurs « consigné dans son acte d’accusation » (31d). Cette ironie est cinglante : l’accusation a pris pour un crime ce que Socrate revendique comme une grâce. La nature du ''daimónion'' a fait l’objet de multiples interprétations, dès l’Antiquité et jusqu’aux temps modernes. Plutarque a consacré un traité entier à la question (''Du démon de Socrate'') dans lequel il discute plusieurs hypothèses<ref>Plutarque, ''Du démon de Socrate'' (''De genio Socratis''), dans ''Œuvres morales'', t. VIII, trad. J. Hani, Paris, Les Belles Lettres, 1980.</ref>. À l’époque moderne, on l’a interprété tour à tour comme une hallucination d’un névrosé<ref>F. Lélut, ''Du démon de Socrate, spécimen d’une application de la science psychologique à celle de l’histoire'', Paris, Trinquart, 1836.</ref>, comme une manifestation de l’inconscient<ref>Arthur Koestler, ''Le Démon de Socrate'', Paris, Calmann-Lévy, 1970.</ref>, comme la voix de la conscience morale<ref>G. W. F. Hegel, ''Leçons sur l’histoire de la philosophie'', tome II (sur Socrate), trad. G. Marmasse, Paris, Vrin, 2007, p. 316-321.</ref>, comme une inspiration divine authentique<ref>Henri Bergson, ''Les Deux sources de la morale et de la religion'' (1932), dans ''Œuvres'', éd. du Centenaire, Paris, PUF, 1959, p. 1027.</ref>, comme une intuition irrationnelle<ref>E. R. Dodds, ''Les Grecs et l’irrationnel'' (1951), trad. M. Gibson, Paris, Flammarion, coll. « Champs », 1977, chap. VII.</ref>. Nietzsche y voyait, de manière originale, la monstruosité d’un homme chez qui l’instinct, contrairement à l’ordinaire, ne crée pas mais critique, et chez qui la conscience rationnelle est au contraire créatrice : Socrate comme « homme théorique », rupture dans l’histoire de l’esprit grec dionysiaque<ref name="nietzsche-nt">Friedrich Nietzsche, ''La Naissance de la tragédie'' (1872), § 13-15, trad. P. Lacoue-Labarthe, dans ''Œuvres philosophiques complètes'', t. I, Paris, Gallimard, 1977.</ref>. Il faut probablement admettre, avec Claude Chrétien, que le démon est irréductible à une simple astuce défensive ou à un symbole : Socrate y croyait réellement, au point de risquer sa vie en le suivant<ref>Chrétien, ''op. cit.'', p. 28-29.</ref>. Son caractère purement négatif (il inhibe, ne prescrit jamais) en fait un signe du divin dans la vie humaine, mais un signe essentiellement limitatif : la divinité indique seulement ce qu’il ne faut pas faire, et laisse à l’homme la responsabilité de chercher, par l’examen rationnel, ce qu’il doit faire. Cette structure, où le divin ne donne pas la vérité mais seulement la limite, est cohérente avec la théologie négative que Socrate manifeste dans tout le plaidoyer : nous ne savons pas positivement ce que sont les dieux, mais nous recevons d’eux des signes qui nous empêchent de nous égarer. ===== Pourquoi pas la politique ? (31d-32a) ===== Socrate explique que si le démon l’a détourné de la politique, c’est pour préserver sa vie : « s’il y avait longtemps que j’avais entrepris de faire de la politique, il y a longtemps que je serais mort ». Et il formule alors une sentence vertigineuse, qui est peut-être la plus critique de l’''Apologie'' à l’égard de la démocratie athénienne : <blockquote>il n’y a personne au monde qui puisse garder la vie sauve s’il s’oppose loyalement à vous ou à toute autre collectivité, et s’il cherche à empêcher qu’il ne se produise dans la cité de nombreuses injustices et illégalités. Mais nécessairement tout vrai champion de la justice, s’il veut garder la vie sauve ne serait-ce qu’un peu de temps, doit vivre en simple particulier (''idiōteúein'') mais non en homme public. (32a)</blockquote> Cette sentence est d’une portée immense. Elle signifie que la politique telle qu’elle se pratique à Athènes est incompatible avec la justice. Le juste, s’il veut vivre, doit rester à l’écart des affaires publiques ; et s’il y entre, il doit s’attendre à mourir. C’est la cassure socratique avec la tradition civique grecque, qui voyait dans la participation politique (''politeía'') la plus haute réalisation de l’homme libre. L’homme proprement libre, pour les Grecs classiques, c’est le citoyen qui prend part aux assemblées ; l’''idiṓtēs'' qui se retire dans la sphère privée est, sinon méprisé, du moins considéré comme incomplet. Socrate renverse cette hiérarchie : la vraie vie politique, pour le juste, passe par le retrait de la politique officielle et par une politique privée, celle de la discussion personne à personne, de l’enseignement moral qui opère non par les discours publics mais par l’examen intime de chacun. C’est, comme le suggère la présentation de la collection Flammarion, « l’espace d’une autre politique »<ref name="brisson-mace-presentation">Arnaud Macé, « Présentation », dans Platon, ''Apologie de Socrate'', traduction par Luc Brisson, Paris, GF-Flammarion, 2017.</ref>. Cette thèse, qu’on peut lire comme une désertion civique, est aussi une critique profonde des conditions de la délibération démocratique. Elle rejoint ce que Platon développera dans la ''République'' : la cité idéale est celle où la philosophie serait au pouvoir, non celle où elle est écrasée par le plus grand nombre. Mais l’''Apologie'' n’est pas encore la ''République'' : Socrate n’y propose pas une contre-cité, il y constate seulement qu’aucune cité existante ne permet au juste de participer à ses affaires sans se renier. ===== Les deux épisodes probants (32a-e) ===== Socrate prouve cette thèse par deux épisodes biographiques, choisis avec soin. Le premier se situe sous la démocratie, en 406, l’année du procès des généraux des Arginuses. Les Athéniens avaient remporté une victoire navale importante contre Sparte près des îles Arginuses (au large de Lesbos), mais les généraux victorieux avaient été empêchés par une tempête de ramasser les cadavres et les naufragés athéniens, violation grave des usages religieux. Rentrés à Athènes, ils furent mis en cause ; mais au lieu de leur garantir un procès individuel comme l’exigeait le droit athénien, l’Assemblée, emportée par la colère populaire, voulut les juger en bloc. Socrate siégeait ce jour-là au Conseil, comme prytane pour sa tribu, l’Antiochide. Il fut le seul des cinquante prytanes à refuser de mettre aux voix cette motion collective, malgré les menaces et les cris de la foule<ref>Le récit détaillé du procès des généraux des Arginuses se trouve chez Xénophon, ''Helléniques'', I, 7, 1-35.</ref>. Les orateurs voulaient le faire arrêter sur-le-champ, les citoyens eux-mêmes l’y encourageaient ; il tint bon. Les généraux furent néanmoins jugés et six d’entre eux exécutés. Peu après, Athènes regretta sa décision, mais Socrate avait risqué sa vie pour la légalité, sans succès immédiat. Le second épisode se situe sous l’oligarchie, en 404. Les Trente l’avaient convoqué avec quatre autres citoyens à la Tholos (la rotonde, siège des prytanes occupée par le régime) et lui avaient ordonné d’aller chercher à Salamine un riche citoyen démocrate, Léon, pour qu’il soit exécuté et que ses biens soient confisqués. C’était une manœuvre classique des Trente : compromettre un maximum de citoyens dans leurs crimes pour les rendre solidaires du régime<ref>Xénophon, ''Helléniques'', II, 3, 39 ; Platon, ''Lettre VII'', 324d-325a.</ref>. Socrate, lui, refusa l’ordre. Il rentra simplement chez lui pendant que les quatre autres allaient chercher Léon, qui fut assassiné. Socrate, rappelle-t-il, aurait probablement payé cela de sa vie si les Trente n’avaient pas été renversés peu après (c’était le cas : le régime tomba en 403). Ces deux épisodes sont politiquement remarquables, et Platon les a sans doute choisis avec une intention nette. Ils montrent Socrate s’opposant également aux excès de la démocratie (procès des Arginuses) et à ceux de l’oligarchie (affaire de Léon), par fidélité à une justice supérieure au régime en place. Il n’est ni un démocrate de conviction ni un oligarque : il est un homme qui, dans l’un et l’autre cas, risque sa vie pour ne pas commettre d’injustice. Cette double symétrie est cruciale : elle répond par avance à tous ceux qui, dans la démocratie restaurée de 399, voudraient voir en Socrate un sympathisant des Trente, en raison de ses liens avec Critias et Charmide. Platon montre au contraire que Socrate a résisté aux Trente au péril de sa vie. Mais il montre également qu’il a résisté à la démocratie elle-même, quand celle-ci violait le droit. La neutralité politique de Socrate, ou plutôt cet au-delà du partisanisme, constitue une part de sa radicalité, qui déconcerte tous ceux qui voudraient l’enrôler dans un camp. ==== Socrate et ses « disciples » (33a-34b) ==== Socrate en vient alors au dernier volet du premier discours : la question des jeunes gens qu’on l’accuse d’avoir corrompus. Il récuse d’abord le terme même de « disciple » : <blockquote>je n’ai jamais, moi, été le maître (''didáskalos'') de personne. (33a)</blockquote> Cette affirmation est importante. Elle distingue radicalement Socrate des sophistes, qui se présentaient comme maîtres (''didáskaloi'') et vendaient un enseignement structuré ; Socrate n’a jamais promis un enseignement, jamais fait payer, jamais suivi un programme ; il a parlé à quiconque voulait l’écouter, jeunes et vieux, riches et pauvres, sans distinction, et n’est pas responsable de ce que chacun devient au sortir de la conversation. Cette posture est philosophiquement significative : elle implique que la philosophie n’est pas transmissible comme une technique, mais seulement comme une pratique qu’on ne peut qu’imiter. Socrate produit alors un argument a contrario d’une grande force. Si réellement il avait corrompu les jeunes, pourquoi n’est-ce pas ''eux-mêmes'', devenus adultes, qui viendraient témoigner contre lui ? Ou du moins leurs proches, parents, frères, qui auraient à se plaindre de cette corruption et en seraient les premiers concernés ? Or, bien au contraire, nombre de ses familiers, ou de leurs proches, sont présents à l’audience pour le soutenir. Socrate en énumère plusieurs, nommément, dans un passage qui vaut témoignage historique : Criton et son fils Critobule, Lysanias de Sphettos père d’Eschine (l’auteur de dialogues socratiques), Antiphon père d’Épigène, Nicostratos frère de Théodotos, ainsi qu’Adimante (le frère aîné de Platon) et plusieurs autres<ref>''Apologie'', 33d-34a. Sur ces personnages, voir Debra Nails, ''The People of Plato: A Prosopography of Plato and Other Socratics'', Indianapolis, Hackett, 2002.</ref>. <blockquote>Je pourrais citer pour vous beaucoup d’autres hommes, parmi lesquels il aurait fallu que Mélétos produise, au cours de son discours, quelque témoin. (34a)</blockquote> Cette preuve par les témoins absents est d’une grande force logique : l’accusateur a été incapable de trouver, parmi tous ceux qui auraient dû être les premières victimes, un seul pour le blâmer. C’est ce qu’on appelle un argument ''a silentio'' : le silence des supposées victimes prouve l’innocence de l’accusé. On notera que Platon se fait ici historien. En nommant les disciples présents, il fixe un moment dans le temps et offre à la postérité un témoignage vérifiable. Il se nomme lui-même plus loin (34a, puis 38b), parmi les amis prêts à se porter caution pour l’amende. Cette présence documentaire est rare dans les dialogues platoniciens, où Platon s’efface généralement : ici, il est témoin du procès de son maître. ==== Le refus du pathos (34b-35d) ==== Socrate aborde alors la péroraison de son premier discours. Il sait parfaitement ce qu’on attend d’un accusé athénien au moment crucial : larmes, supplications, présentation de la femme et des enfants éplorés, appel à la pitié, théâtralité de la détresse. Cette mise en scène, connue de tous par les comédies d’Aristophane et par l’habitude des tribunaux, était devenue quasi rituelle<ref>Sur la caricature du tribunal populaire, voir Aristophane, ''Les Guêpes'', v. 548-630.</ref>. Socrate a trois fils, dont l’un est déjà adolescent (''meirákion'') et les deux autres encore petits ; il pourrait les faire paraître, lui qui ne refuse pas d’être un homme. Mais il ne le fera pas. Pourquoi ? Deux motifs convergent. D’abord, par souci de l’honneur : un homme de sa réputation, réelle ou supposée, ne peut s’abaisser à ces scènes sans se ridiculiser et sans « ridiculiser la cité ». Les citoyens étrangers qui l’observent et qui connaissent la réputation d’Athènes s’étonneraient de voir les plus éminents de ses hommes se comporter de manière indigne. Socrate invoque la ''dóxa'' (l’opinion) d’Athènes aux yeux du monde grec pour justifier son refus de jouer le jeu. Mais surtout, et c’est le second motif, plus profond : il ne serait pas juste de supplier le juge. Et ici, Socrate formule une analyse capitale de la fonction judiciaire : <blockquote>le juge ne siège pas pour réduire la justice en faveur (''charízesthai''), mais pour décider de ce qui est juste ; et il a fait serment non de favoriser qui lui plaît, mais de rendre la justice selon les lois. (35c)</blockquote> Le juge athénien prêtait en effet un serment (l’''héliastikós hórkos'') par lequel il s’engageait à juger selon les lois<ref>Sur le serment héliastique, voir Démosthène, ''Contre Timocrate'', 149-151 ; Adriaan Lanni, ''Law and Justice in the Courts of Classical Athens'', Cambridge, Cambridge University Press, 2006, p. 75-76.</ref>. Supplier les juges, c’est leur demander de se parjurer, donc d’introduire le parjure dans la cité, donc de commettre une impiété effective contre les dieux garants du serment. Le geste de Socrate est ici d’une cohérence parfaite et quasi mathématique. Lui qui est accusé d’impiété ne peut, à l’instant critique, demander aux juges de commettre une vraie impiété (le parjure) pour le sauver. Ce serait confirmer dans les faits, activement, l’accusation qu’il réfute en paroles. Il préfère la mort à cet abaissement, qui serait en outre, non plus imaginairement mais réellement, une atteinte aux dieux de la cité. Par ce refus, Socrate démontre par les actes ce qu’il prétendait par les mots : il est le véritable pieux, et ce sont les accusateurs qui, en voulant la mort d’un juste, pratiquent la vraie impiété. Le premier discours s’achève là. Les juges votent. Socrate est déclaré coupable. La majorité est étroite : si trente voix s’étaient portées sur l’autre bord, Socrate aurait été acquitté. Pour un jury de 501, cela suggère un vote d’environ 280 contre 221 (chiffres que Diogène Laërce confirme dans son récit<ref>Diogène Laërce, ''Vies et doctrines des philosophes illustres'', II, 41.</ref>, mais qui ne sont pas dans Platon). Ce qui est frappant, c’est la relative faiblesse de la condamnation : l’acquittement était à portée. === Le second discours : la contre-peine (35e-38b) === La procédure athénienne exige maintenant que Socrate propose une peine alternative à celle réclamée par l’accusation. Mélétos a proposé la mort. L’usage voulait qu’on proposât une peine sensiblement moins sévère (un lourd exil, une amende importante) pour donner au jury une alternative crédible. Le calcul tacite, dans les procès à peine à estimer, consistait à offrir une sanction à peine en deçà de celle demandée par l’accusateur, de manière à ne pas trop décevoir les attentes du jury tout en se ménageant un sort moins dur. Socrate va adopter une tout autre stratégie. ==== La contingence du vote (35e-36b) ==== Socrate remarque d’abord, avec une ironie qui frise la provocation, qu’il est étonné non pas d’avoir été condamné, mais de l’avoir été à une si faible majorité. Il s’attendait à une condamnation bien plus nette. Si trente voix de plus avaient basculé, il aurait été acquitté. Il observe aussi que, ce qui le perd véritablement, ce n’est pas Mélétos : car sans l’appui d’Anytos et de Lycon, le seul Mélétos, compte tenu des voix obtenues, aurait dû payer mille drachmes d’amende pour n’avoir pas recueilli le cinquième des suffrages (règle destinée à décourager les plaintes frivoles). En divisant malicieusement les voix reçues entre ses trois accusateurs, Socrate montre que Mélétos seul n’aurait pas obtenu sa condamnation. Cette remarque, en apparence technique, est profondément déstabilisante : elle montre que la procédure qui vient de condamner Socrate est elle-même contingente, dépendante du nombre d’accusateurs autant que du fond du dossier. Elle suggère, au passage, que la véritable force du parti de l’accusation réside dans Anytos, l’homme politique, non dans Mélétos, le plaignant nominal. Le procès apparaît donc comme un montage politique, sous un habillage religieux. ==== La proposition du Prytanée (36b-37a) ==== Quelle contre-peine proposer ? Socrate prend la question au sérieux, mais dans un sens retourné : quelle peine mérité-je ? Il rappelle toute sa vie : avoir négligé les affaires, l’argent, les magistratures, les assemblées et les honneurs, pour se consacrer au service privé de la vertu, <blockquote>en essayant de convaincre chacun d’entre vous de ne pas se préoccuper de ses affaires personnelles avant de se préoccuper, pour lui-même, de la façon de devenir le meilleur et le plus sensé possible. (36c)</blockquote> Que mérite un homme ainsi ? Un bon traitement, dit-il, et non une peine. Il propose donc non pas un châtiment, mais une récompense : être nourri aux frais de l’État au Prytanée. Le Prytanée était à Athènes l’édifice public où la cité nourrissait, aux frais de l’État, les prytanes en exercice, les hôtes officiels et les citoyens illustres, notamment les vainqueurs des jeux Olympiques et les bienfaiteurs de la patrie. C’était la plus haute distinction civique, l’équivalent d’une reconnaissance par l’État comme héros ou sauveur de la cité. Socrate explique qu’il la mérite plus que quiconque : <blockquote>si celui-ci [le vainqueur olympique] vous procure l’apparence du bonheur, je vous en offre, moi, la réalité ; lui n’a aucun besoin d’être nourri, mais moi, j’en ai besoin. (36d-e)</blockquote> L’argument est double : Socrate est un bienfaiteur réel (plus que le champion olympique, dont la gloire n’est que sportive) et il est pauvre (donc il a besoin de ce soutien alimentaire, alors que le champion en a moins besoin). Cette proposition est manifestement provocatrice, et aucun commentateur n’en doute. Socrate ne joue plus le jeu de la procédure ; il retourne le tribunal. Pour un jury qui vient de le condamner, proposer d’être traité en héros civique est une humiliation délibérée. Comment comprendre cette audace ? Plusieurs explications se combinent. D’abord, une cohérence logique : Socrate est convaincu de n’avoir commis aucune injustice, il refuse donc de s’infliger une peine comme s’il était coupable. Ensuite, une fidélité à sa parole : s’il proposait une peine qu’il estime injuste, il trahirait son principe d’agir toujours selon le juste. Enfin, peut-être, une acceptation anticipée de la mort : il est âgé (soixante-dix ans, espérance de vie largement dépassée dans l’Antiquité), il a accompli sa mission, il ne craint pas la sentence, il n’a donc aucune raison de ruser. À quoi s’ajoute, plus subtilement, un calcul dramatique : proposer une vraie contre-peine reviendrait à reconnaître la compétence du tribunal ; en proposant une récompense, Socrate refuse symboliquement la sentence avant même qu’elle ne tombe. ==== L’examen des autres peines et la proposition d’amende (37a-38b) ==== Socrate continue son raisonnement avec une rigueur didactique : puisque je sais que je ne me cause volontairement de tort à personne, je ne vais pas, loin de là, m’en causer à moi-même en proposant une peine qui serait un tort. Il passe alors en revue, méthodiquement, les peines possibles. La prison ? Ce serait passer sa vie soumis au pouvoir des Onze, les magistrats qui administraient les prisons et les exécutions, donc à une sujétion indigne. Une amende lourde assortie de contrainte par corps jusqu’au paiement ? Cela revient au même : il n’a pas d’argent. L’exil ? C’est ici que Socrate développe sa réponse la plus fine. Il serait absurde, dit-il, de choisir l’exil : si ses propres concitoyens ne supportent plus ses entretiens, au point d’en vouloir « se débarrasser », pourquoi les étrangers les supporteraient-ils davantage ? Il serait chassé de ville en ville. Et ne pourrait-il vivre en se taisant ? Non, et ici vient l’un des sommets du texte : cesser de philosopher équivaudrait à désobéir au dieu. <blockquote>Il n’y a pas pour un homme de plus grand bien que de s’entretenir chaque jour de la vertu et des autres sujets dont vous m’entendez discuter, en examinant moi-même les autres ; car une vie sans examen n’est pas digne d’être vécue par un homme. (38a)</blockquote> Cette dernière formule, en grec ''ho anéxetastos bíos ou biōtós anthrṓpōi'', est probablement la plus célèbre de toute l’''Apologie'' et peut-être de toute la philosophie antique. Elle condense le programme de la philosophie socratique : la vie doit être soumise à un examen (''exétasis'') constant, à une interrogation rationnelle sur ses buts et ses valeurs. Sans cet examen, on ne vit pas une vie proprement humaine. Formule vertigineuse, qui fait de la philosophie non pas un luxe intellectuel mais la condition même d’une existence digne de ce nom. Elle suggère qu’il existe un seuil d’humanité : en deçà de l’examen, l’homme n’est pas pleinement homme. La philosophie cesse alors d’être une option ajoutée à la vie pour devenir l’élément qui en fait une vie humaine. Finalement, Socrate concède une mine d’argent (somme modique, correspondant à peu près à trois mois de salaire d’un ouvrier qualifié), mais accepte, sur la pression de ses amis (Platon, Criton, Critobule, Apollodore), de proposer trente mines, avec leur caution personnelle. C’est une somme importante, équivalent à plusieurs années de salaire, mais manifestement insuffisante face à la proposition de mort, et la manière dont elle est introduite (sous la pression des amis, comme en dernier recours) ne masque pas que Socrate lui-même n’y adhère pas vraiment. Le jury vote une seconde fois. Cette fois, la majorité est beaucoup plus nette : selon les chiffres traditionnels rapportés par Diogène Laërce, quatre-vingts jurés supplémentaires ont voté contre Socrate par rapport au premier vote, manifestement indignés par son attitude. Socrate est condamné à mort. === Le troisième discours : après la condamnation (38c-42a) === Ce troisième discours n’est pas prévu par la procédure. Une fois la sentence prononcée, les magistrats passent aux formalités d’enregistrement, notamment la notification aux Onze, chefs des geôliers et du bourreau. Socrate prend pourtant la parole une dernière fois, sans doute pendant que les Onze procèdent à ces écritures, pour s’adresser à la partie de l’assistance qui est restée sur place. Il s’agit d’une péroraison spontanée, hors procédure, probablement élargie et composée par Platon pour les besoins du texte, même si l’événement lui-même est plausible. Ce discours se divise en deux moments : d’abord aux jurés qui ont voté sa mort, puis à ceux qui ont voté son acquittement. ==== Aux jurés de la condamnation (38c-39d) ==== Socrate commence par un constat ironique : les Athéniens ont gagné peu de temps, il est âgé, il serait mort bientôt de toute façon. Mais en échange, ils vont gagner <blockquote>le renom, auprès des gens avides de diffamer notre cité, d’avoir fait mourir un sage en la personne de Socrate. (38c)</blockquote> La réputation d’Athènes souffrira de ce procès bien au-delà de ce qu’elle a cru gagner. La prédiction est parfaitement exacte : la condamnation de Socrate a, dans la mémoire collective de l’Occident, sérieusement terni l’image de la démocratie athénienne. Surtout, Socrate retourne contre les juges l’argument central de son plaidoyer : s’il n’a pas réussi à les persuader, ce n’est pas faute d’arguments, mais parce qu’il n’a pas voulu employer les tactiques indignes (larmes, supplications) qu’ils attendaient. <blockquote>Je préfère de beaucoup mourir après m’être défendu comme je l’ai fait plutôt que vivre après un plaidoyer à leur façon. (38e)</blockquote> Et il prononce cette antithèse fameuse : <blockquote>la difficulté n’est pas d’échapper à la mort, elle est bien plus d’échapper à la lâcheté (''ponēría''), car elle court plus vite que la mort. En l’occurrence, moi qui suis lent et vieux, j’ai été rattrapé par la plus lente des deux [la mort], cependant que mes accusateurs, qui sont lestes et rapides, ont été rattrapés par la plus rapide, qui est la méchanceté. (39a-b)</blockquote> L’image est saisissante : chaque homme est poursuivi par son destin, mais les uns sont rattrapés par la mort physique et les autres par la mort morale, infiniment plus grave. Socrate se permet alors une prophétie (''manteúomai''). Il est, dit-il, <blockquote>au point où les hommes prophétisent le mieux, quand ils sont à la veille de mourir, (39c)</blockquote> allusion à la croyance grecque selon laquelle les mourants acquièrent un don de divination (voir le motif du chant du cygne dans le ''Phédon'' 84e<ref>Platon, ''Phédon'', 84e-85b : « les cygnes [...], lorsqu’ils sentent qu’ils vont mourir, chantent ce jour-là plus fort et plus beau qu’ils n’ont jamais chanté, dans la joie d’aller trouver le dieu dont ils sont les serviteurs ».</ref>). Sa prophétie est terrible : <blockquote>un châtiment vous viendra aussitôt après ma mort, bien plus pénible que celui par lequel vous m’aurez tué. [...] Le nombre croîtra de ceux qui vous demanderont des comptes, que je retenais jusqu’ici, sans que vous vous en aperceviez ; et ils seront d’autant plus pénibles qu’ils sont plus jeunes. (39c-d)</blockquote> Tuer n’est pas la façon de se délivrer du blâme ; la seule manière honorable est « de se préparer soi-même à être le meilleur possible ». Cette prophétie peut sembler s’accomplir, dans une certaine mesure, par l’histoire qui suivra : les « petits socratiques » (Antisthène le cynique, Aristippe, Euclide de Mégare), puis Platon et son Académie, puis Aristote et le Lycée, poursuivront inlassablement l’interrogation commencée par Socrate. Le procès et la mort de Socrate peuvent ainsi être lus comme le moment à partir duquel la philosophie s’affirme, dans la tradition platonicienne, comme une vocation publique à part entière. ==== Aux jurés de l’acquittement (39e-42a) ==== Socrate se tourne alors vers ceux qui ont voté pour lui, qu’il appelle désormais, seuls, ''juges'' véritables. Cette distinction terminologique est capitale : avant le verdict, tous étaient indistinctement ''andres'' (« messieurs ») ou ''Athēnaîoi'' (« Athéniens ») ; maintenant, seuls ceux qui ont voté juste méritent, selon Socrate, le titre de juges (''dikastaí''). Le tribunal vient d’être scindé en deux catégories asymétriques. Il leur confie deux pensées, l’une sur le signe divin, l’autre sur la mort. ===== Le silence du démon (39e-40c) ===== Son démon, dit-il, avait coutume de l’arrêter chaque fois qu’il s’apprêtait à faire quelque chose de mauvais, même dans des circonstances mineures. Or, aujourd’hui, depuis le matin, tout au long de cette journée qui l’a mené à la condamnation à mort, le démon ne s’est pas manifesté une seule fois. Il ne l’a pas arrêté au moment où il quittait son domicile, ni lorsqu’il montait au tribunal, ni à aucun moment de son plaidoyer. Cette absence est elle-même un signe : <blockquote>il y a des chances pour que ce qui m’est arrivé soit un bien ; et c’est nous qui faisons des suppositions incorrectes quand nous considérons la mort comme un mal. (40b-c)</blockquote> Le silence du démon est la preuve, pour Socrate, que la voie qu’il suit est la bonne. L’argument est philosophiquement subtil. Socrate ne dit pas qu’il sait que la mort est un bien ; il dit qu’il a une raison de penser que ce qui lui arrive est un bien, puisque le dieu (par la voix du démon) ne l’a pas arrêté. C’est un argument ''e silentio'' transposé sur le plan religieux : le silence divin, pour qui est habitué à être averti, vaut approbation. Cette structure de raisonnement est fragile, mais elle est cohérente avec la théologie socratique : la divinité se manifeste par ses interventions plutôt que par ses paroles positives ; son silence, quand il y a habitude d’intervention, est significatif. ===== Les deux hypothèses sur la mort (40c-41d) ===== [[Fichier:David - The Death of Socrates.jpg|vignette|centre|upright=2.0|Jacques-Louis David, ''La Mort de Socrate'', 1787, huile sur toile, 129,5 × 196,2 cm, New York, Metropolitan Museum of Art. Le tableau illustre à proprement parler la scène finale du ''Phédon'' plutôt que l’''Apologie'' ; il est cependant devenu l’image emblématique, dans la culture occidentale moderne, du philosophe maintenant, jusque dans la mort, la cohérence entre sa parole et sa vie.]] Socrate propose alors une méditation sur la mort, l’une des plus belles pages de la philosophie antique, construite comme une alternative raisonnée. De deux choses l’une : ou bien la mort est l’absence de toute sensation, ou bien elle est une migration (''metoíkēsis'') de l’âme de ce lieu vers un autre lieu. Dans la première hypothèse (la mort comme absence de sensation), la mort ressemble au sommeil sans rêve. Or qui n’aimerait pas, si on lui demandait de choisir entre une nuit de sommeil profond sans rêves et toutes les autres nuits et jours de sa vie, reconnaître que cette nuit est plus précieuse que la plupart ? Même le Grand Roi de Perse (homme réputé le plus heureux du monde aux yeux des Grecs) trouverait peu de jours comparables à une telle nuit. Si la mort est cela, alors la totalité du temps après la mort se réduit à « une seule nuit », et cette nuit est un gain. L’argument est intéressant par sa structure : il part d’une expérience commune (le sommeil sans rêve) pour désamorcer la peur métaphysique de la mort. Si l’on aime le sommeil quand il nous prend, pourquoi craindre la mort si elle lui ressemble ? La stratégie argumentative, qui rappelle celle d’Épicure et de Lucrèce plus tard (« la mort n’est rien pour nous »<ref>Épicure, ''Lettre à Ménécée'', § 125 : « la mort n’est rien pour nous, puisque tant que nous sommes, la mort n’est pas, et quand la mort est là, nous ne sommes plus ». Lucrèce, ''De la nature des choses'', III, v. 830 et suiv.</ref>), désarticule la crainte en la confrontant à ce que nous expérimentons quotidiennement. Dans la seconde hypothèse (la mort comme migration), la mort est un voyage vers l’au-delà, où l’on retrouve tous les morts. Que pourrait-on imaginer de plus heureux ? On serait délivré des juges qui prétendent juger ici-bas, pour rencontrer les vrais juges dont on dit qu’ils y rendent la justice : Minos, Rhadamante, Éaque (les trois juges infernaux traditionnels), plus Triptolème (qui les remplace parfois dans l’iconographie attique). On rencontrerait Orphée, Musée, Hésiode, Homère, les grandes figures poétiques et religieuses du passé. On pourrait y continuer, sans cette fois risquer la mort, l’activité d’examen qui fut la sienne sur terre : interroger Palamède, Ajax (tous deux morts par jugements injustes, comme lui-même : la comparaison est évidemment à son avantage), le chef de l’armée grecque à Troie (Agamemnon), Ulysse, Sisyphe, « et tant d’autres hommes et femmes qu’on pourrait nommer ». <blockquote>Discuter avec ceux de là-bas, vivre en leur société, les soumettre à examen, ne serait-ce pas le comble du bonheur ? Aussi bien, les gens de là-bas ne mettent à mort personne pour ce motif. (41c)</blockquote> Ce passage est riche de tonalités. Il y a une évidente dimension humoristique : Socrate imagine l’au-delà comme la continuation indéfinie de son activité terrestre, l’examen dialectique, mais cette fois sans risque, puisqu’on n’y meurt plus. L’Hadès devient une agora élargie à tous les temps. Il y a également une dimension consolatoire : la comparaison avec Palamède et Ajax, héros victimes de procès injustes, ennoblit le sort de Socrate. Il y a enfin une dimension ironique vis-à-vis des jurés athéniens : les vrais juges ne sont pas à Athènes, mais dans l’Hadès, et Socrate se réjouit d’aller les retrouver. Ce passage a suscité des interprétations contrastées. Certains commentateurs y voient une réelle espérance platonicienne en l’immortalité de l’âme, telle qu’elle sera développée dans le ''Phédon''<ref>Platon, ''Phédon'', 80a-84b, 105c-107a.</ref>. D’autres, comme Chrétien, soulignent que le Socrate de l’''Apologie'' reste fondamentalement agnostique : il présente deux hypothèses, il ne tranche pas entre elles, et l’imagination y a au moins autant de part que la raison<ref>Chrétien, ''op. cit.'', p. 32-36.</ref>. Socrate lui-même conclut prudemment : <blockquote>aucun mal ne peut toucher un homme de bien ni pendant sa vie ni après sa mort, et les dieux ne se désintéressent pas de son sort. (41d)</blockquote> Cette conclusion n’affirme pas dogmatiquement une survie, mais énonce une foi pratique : quoi qu’il arrive, le juste n’a rien à craindre. L’''Apologie'', contrairement au ''Phédon'', ne construit pas de doctrine positive sur l’immortalité ; elle se tient au seuil d’une telle doctrine, dans un agnosticisme serein. ===== Le testament (41e-42a) ===== Socrate clôt son discours par un testament pour ses fils. Il ne demande qu’une chose aux Athéniens : <blockquote>Quand mes fils seront grands, punissez-les, citoyens, en les tourmentant comme je vous tourmentais, pour peu qu’ils vous paraissent se soucier d’argent ou de n’importe quoi d’autre plus que de la vertu. Et, s’ils croient être quelque chose, alors qu’ils ne sont rien, adressez-leur le reproche que je vous adressais. (41e)</blockquote> La mission philosophique se transmet ainsi, comme un héritage inversé : Socrate demande à ses bourreaux de devenir eux-mêmes, envers ses enfants, ce qu’il était pour eux, des tourmenteurs par la vertu. C’est le pardon actif d’un homme qui refuse de laisser sa mort briser la chaîne de l’examen. Puis vient la dernière phrase, l’une des plus célèbres de la littérature philosophique : <blockquote>Mais voici déjà l’heure de partir, moi pour mourir et vous pour vivre. De mon sort ou du vôtre lequel est le meilleur ? La réponse reste incertaine pour tout le monde, sauf pour la divinité. (''plḕn hē tôi theôi'', 42a)</blockquote> Cette clôture ouvre, sur l’indécidable, l’agnosticisme ultime. Socrate ne sait pas, nul ne sait, lequel est le plus heureux, de lui qui va mourir ou de ses juges qui vont continuer à vivre. Seule la divinité le sait. L’''Apologie'' se ferme ainsi sur le mot même de la sagesse socratique : la reconnaissance de l’ignorance humaine, couplée à la confiance paisible en un ordre divin qui excède notre mesure. Rien n’est affirmé dogmatiquement ; tout se termine sur une interrogation qui n’attend pas de réponse humaine. C’est une fin d’une sobriété admirable, qui évite à la fois la plainte et la consolation artificielle. Elle est, par son rythme et par son contenu, digne d’une page d’évangile ou d’un chapitre des ''Pensées'' de Marc-Aurèle. == Concepts et thèmes majeurs == Une lecture suivie ne serait pas complète sans reprendre quelques-uns des grands thèmes qui courent à travers le texte et en font la portée philosophique durable. === La sagesse humaine : le savoir du non-savoir === Le concept central de l’''Apologie'' est celui de la sagesse humaine (''anthrōpínē sophía'', 20d). Socrate n’est pas savant au sens fort du terme, c’est-à-dire à la manière des sophistes qui prétendaient posséder un savoir sur les choses divines, sur la nature, sur la politique, sur la vertu. Mais il possède une sagesse proprement humaine, qui consiste à reconnaître que l’on ne sait pas. Ce savoir du non-savoir n’est pas un scepticisme, encore moins un renoncement. C’est une position éthique : celui qui sait qu’il ne sait pas est disposé à chercher, à interroger, à examiner ; celui qui croit savoir est fermé à toute remise en question et, par là même, incapable de tout progrès. Cette sagesse n’est pourtant pas purement négative. Socrate affirme savoir au moins deux choses : qu’il est mauvais et laid de commettre l’injustice et de désobéir à un meilleur que soi (29b), et que la vie non examinée n’est pas digne d’être vécue (38a). De ces deux « savoirs » découle tout le comportement de Socrate au procès : il ne peut trahir la justice pour sauver sa vie, et il ne peut cesser d’examiner les autres sans trahir sa vocation propre. On voit donc que le savoir du non-savoir n’est pas une position d’ignorance totale, mais une structure articulée : une ignorance avouée sur les grandes questions métaphysiques, et une certitude pratique sur les exigences éthiques. Cette combinaison fait du socratisme une forme de philosophie pratique : elle rend possible l’action juste sans requérir une science achevée. Il faut enfin noter que le savoir du non-savoir est peut-être la thèse la plus féconde du socratisme pour l’histoire de la pensée. Toute la philosophie postérieure, chaque fois qu’elle commence par un doute méthodique (Descartes), par une critique des prétentions de la raison (Kant), par une déconstruction des évidences (phénoménologie), s’inscrit dans le sillage de l’interrogation socratique. La philosophie moderne est, en ce sens, socratique par son geste inaugural, même quand elle ne l’est plus par ses conclusions. === La méthode de l’elenchus === L’''Apologie'' donne à voir, en acte, la méthode philosophique propre de Socrate : l’elenchus ou réfutation par interrogation. Elle apparaît à plusieurs reprises, mais surtout dans l’interrogatoire de Mélétos (24b-28a). Son fonctionnement est simple dans son principe : Socrate ne pose pas directement ses propres thèses ; il prend pour point de départ celles de son interlocuteur, puis, par une série de questions dont chacune requiert une réponse qui semble évidente, il conduit l’interlocuteur à reconnaître des conséquences incompatibles avec d’autres thèses qu’il tient également pour vraies. La contradiction ainsi mise au jour n’est pas celle de Socrate, mais celle de l’interlocuteur avec lui-même. Cette méthode a plusieurs vertus philosophiques. D’abord, elle respecte la liberté de l’interlocuteur : Socrate ne lui impose rien, il l’amène seulement à voir ce qu’il pensait déjà. Ensuite, elle produit un savoir négatif sûr : la réfutation, à défaut de démontrer le vrai, prouve au moins que la thèse examinée est fausse. Enfin, elle a un effet moral : elle introduit chez l’interlocuteur l’expérience de l’''aporía'' (la perplexité), qui est le point de départ possible d’une recherche véritable. L’interlocuteur, déchargé de son illusion de savoir, peut commencer à apprendre. L’elenchus est ainsi, au sens propre, maïeutique : il fait accoucher les esprits. Mais l’elenchus a aussi ses limites, que l’''Apologie'' laisse apercevoir. Il peut blesser l’amour-propre ; il peut créer des haines durables ; il peut donner à ceux qui en sont la cible l’impression d’être humiliés publiquement. Socrate lui-même en témoigne : son enquête a suscité contre lui des rancœurs innombrables. La philosophie a un coût social, que l’elenchus rend visible avec une particulière acuité. === Le souci de l’âme === Le message moral central de l’''Apologie'' tient dans une exhortation : il faut se soucier prioritairement de son âme (''psuchḗ'') et de son amélioration, non de son corps, de sa richesse ou de sa réputation (29d-30b). <blockquote>La vertu ne naît pas de l’argent, mais c’est de la vertu que naissent et l’argent et tout le reste des biens utiles aux hommes, aussi bien privés que publics. (30b)</blockquote> Ce renversement est l’une des sources principales de la morale occidentale : la hiérarchie des biens est réordonnée autour du bien intérieur, et la richesse extérieure n’a de valeur qu’en tant qu’elle découle d’une vertu préalable. Ce souci de soi (''epiméleia heautoû'') n’est pas égoïste. Il est au contraire la condition du souci des autres : on ne peut aider autrui à améliorer son âme sans avoir travaillé à la sienne. Socrate harcèle ses concitoyens parce qu’il veut qu’ils prennent soin de leur âme, non parce qu’il veut sauver la sienne à ses dépens. Et c’est précisément parce qu’il se soucie de la cité qu’il la secoue : le taon pique le cheval pour le réveiller, non pour le faire souffrir. Cette thèse a eu une postérité immense. Elle est reprise, transformée, intériorisée par les écoles hellénistiques (stoïciens, épicuriens), qui en font le cœur de la sagesse pratique. Elle passe ensuite dans le christianisme, où le « soin de l’âme » devient le salut personnel. À l’époque moderne, Michel Foucault lui a consacré une part importante de ses derniers cours, voyant dans le souci de soi une alternative à l’éthique cartésienne fondée sur la seule connaissance de soi<ref>Michel Foucault, ''Le Souci de soi'' (''Histoire de la sexualité'', t. III), Paris, Gallimard, 1984 ; et ''L’Herméneutique du sujet'', ''op. cit.''</ref>. L’''Apologie'' est à l’origine de cette longue tradition, même si le souci de soi socratique reste, par certains aspects, très différent des élaborations postérieures : il est moins un travail sur soi qu’un examen de soi par la discussion avec autrui. === La philosophie comme mission divine === L’''Apologie'' fonde la légitimité de la philosophie sur une mission divine. Socrate ne philosophe pas par goût ou par choix : il le fait parce que le dieu lui en a fait l’ordre, à travers l’oracle de Delphes et à travers le démon. Cette dimension religieuse est essentielle pour comprendre la posture socratique. S’il pouvait cesser d’interroger, il le ferait peut-être (c’est une activité ingrate et dangereuse) ; mais il ne le peut pas, car ce serait désobéir au dieu. La philosophie est ainsi un service sacré, équivalent à celui des prêtres ou des devins, mais accompli par d’autres moyens : non par le rite, mais par l’examen rationnel. Cette dimension place Socrate dans une position paradoxale par rapport aux accusations d’impiété. L’homme que l’on accuse de ne pas croire aux dieux est en réalité celui qui les sert le plus fidèlement, au point de mourir pour leur obéir. Platon retourne ainsi l’accusation : les véritables impies sont ceux qui, en condamnant Socrate, refusent le présent que le dieu leur a fait. Le procès apparaît alors sous un jour inversé : non plus un acte de piété de la cité contre un impie, mais un acte d’impiété de la cité contre un serviteur du dieu. Ce thème a eu un écho particulier dans la tradition chrétienne, qui a parfois vu en Socrate une figure prophétique du Christ : un juste mis à mort par une communauté religieuse qui croyait servir ses dieux en le tuant. Justin martyr, au IIᵉ siècle, comparera explicitement Socrate et Jésus, voyant dans le philosophe athénien une préfiguration providentielle de la Passion<ref>Justin de Naplouse, ''Première Apologie'', 46, 1-4 : les chrétiens considèrent comme chrétiens avant la lettre « ceux qui ont vécu avec le Logos [...] parmi les Grecs, Socrate, Héraclite et ceux qui leur furent semblables ». Voir aussi ''Seconde Apologie'', 10, 5-6.</ref>. La philosophie chrétienne primitive a ainsi trouvé dans l’''Apologie'' une matrice pour penser la martyrologie. === La justice supérieure === Le thème de la justice traverse tout le texte. Socrate se présente comme un homme profondément respectueux des lois : il a risqué sa vie pour le respect de la procédure sous la démocratie (affaire des Arginuses) ; il mourra par fidélité aux lois dans le ''Criton'' plutôt que de s’évader. Mais son obéissance aux lois n’est pas inconditionnelle : il y a une justice supérieure, fondée sur des valeurs, qui commande dans certains cas la désobéissance civile, comme lorsqu’il refuse d’exécuter les ordres des Trente concernant Léon de Salamine. Cette justice supérieure n’est pas un simple idéal abstrait ; elle est, pour Socrate, ce qui fait le prix (''axía'') de la vie humaine. Elle a une origine divine et s’impose à la conscience au-delà des conventions sociales. On voit déjà poindre ici, avant les développements platoniciens de la ''République'', l’idée d’une justice en soi, distincte de la justice légale, et qui fonde celle-ci sans s’y réduire. Antigone, chez Sophocle, invoquait déjà les « lois non écrites » des dieux contre les décrets humains<ref>Sophocle, ''Antigone'', v. 450-460.</ref> ; Socrate, à sa manière, s’inscrit dans cette tradition. Mais il la rationalise : ce n’est plus le simple respect d’une tradition familiale ou religieuse, c’est la fidélité à un ordre supérieur accessible par l’examen rationnel. La philosophie devient ainsi le lieu où se manifeste cette justice transcendante, dont les lois humaines ne sont qu’une approximation imparfaite. Cette double fidélité (aux lois de la cité et à une justice supérieure) est source d’une tension qui traversera toute la tradition philosophique et juridique occidentale. Elle est au cœur des doctrines du droit naturel<ref>Voir notamment Cicéron, ''De republica'', III, 33 sur la ''lex vera'' ; Thomas d’Aquin, ''Somme théologique'', I-II, q. 94 sur la loi naturelle.</ref>, des théories modernes de la désobéissance civile (Thoreau, Gandhi, Martin Luther King), et des débats contemporains sur la légitimité du droit positif. === La mort et le courage === Le rapport de Socrate à la mort est une pièce maîtresse du texte. Sa thèse est à double face. D’un côté, la mort en elle-même est inconnue : nul ne sait si elle est un mal ou un bien, et la craindre comme un mal certain est la plus répréhensible des ignorances. De l’autre, il y a pire que la mort : la lâcheté, l’injustice, l’abandon de son poste. Le courage socratique n’est donc pas, comme celui des héros homériques, la volonté exaltée de mourir pour l’honneur ; c’est la lucidité sur ce qui est réellement à craindre, non la mort mais le vice. Ce renversement a nourri toute la morale stoïcienne (qui en fait un de ses principes cardinaux : ne rien craindre de ce qui ne dépend pas de nous, donc pas la mort) puis, par des voies détournées, la pensée chrétienne du martyre. Il faut insister sur la finesse de l’analyse socratique. Elle ne dit pas : « la mort est un bien » (affirmation dogmatique contraire à son savoir du non-savoir). Elle ne dit pas non plus : « la mort est indifférente » (comme le diront plus tard les stoïciens). Elle dit : « la mort est inconnue, donc je ne peux la craindre comme un mal certain ; mais l’injustice est un mal certain, donc je peux la craindre ». Le courage n’est pas fondé sur une espérance métaphysique, mais sur une hiérarchie des savoirs : le connu prime sur l’inconnu, et j’organise ma conduite en fonction de ce que je sais. Cette analyse aura un long destin. Épicure la reprendra pour dire : « la mort n’est rien pour nous »<ref>Épicure, ''Lettre à Ménécée'', § 125.</ref>. Les stoïciens la transformeront en doctrine de l’indifférence aux choses externes. Montaigne en fera un objet central de ses ''Essais''<ref>Montaigne, ''Essais'', I, 20 « Que philosopher, c’est apprendre à mourir » ; III, 12 « De la physionomie ».</ref>. Heidegger, au XXᵉ siècle, retournera au Socrate de l’''Apologie'' en interrogeant le rapport authentique à la mort comme condition d’une existence propre<ref>Martin Heidegger, ''Sein und Zeit'' (1927), § 46-53, sur l’''être-pour-la-mort''.</ref>. Chaque fois, c’est le même geste inaugural qui est repris, celui d’une mort désarmée par la pensée. === Philosophie et cité : l’autre politique === L’''Apologie'' esquisse une conception originale de la politique. Socrate se déclare non-politique au sens courant du terme : il n’a pas fréquenté l’assemblée, il n’a pas cherché les magistratures, il n’a pas fait carrière publique. Mais il se présente comme le plus politique des Athéniens au sens profond : il s’est occupé de la cité elle-même (plus que de ses affaires), en se souciant du perfectionnement de ses concitoyens. C’est une autre politique, qui ne passe pas par les institutions officielles (corrompues selon lui par la démagogie et l’ignorance) mais par la conversation privée, par l’interpellation personnelle, par la formation morale. Cette vision a un versant critique radical vis-à-vis de la démocratie athénienne, qui émerge des épisodes des Arginuses et de Léon de Salamine : la démocratie, livrée à ses passions, peut se conduire de manière aussi injuste qu’une tyrannie. Il serait naïf de voir en Socrate un démocrate simple ou un anti-démocrate simple ; il est un critique des deux régimes en tant qu’ils s’éloignent de la justice. Mais sa critique vise, au-delà des régimes, la capacité même des collectivités humaines à délibérer justement : « il n’y a personne au monde qui puisse garder la vie sauve s’il s’oppose loyalement à vous ou à toute autre collectivité » (32a). Ce diagnostic, désabusé, n’est pas tant politique qu’anthropologique : les foules, quelles qu’elles soient, résistent mal à l’examen rationnel. Mais cette critique a aussi un versant constructif. La philosophie, par l’examen qu’elle exerce sur les esprits, prépare la possibilité d’une politique véritablement juste. Platon développera cette intuition dans la ''République'', en allant jusqu’à imaginer une cité où les philosophes seraient rois, mais ce développement excède le cadre de l’''Apologie''. Au moment où Platon écrit ce texte, la cité idéale n’est pas encore pensée ; il y a seulement la dénonciation d’une cité qui a tué son meilleur citoyen, et la promesse implicite d’une pensée qui prolongera la mission interrompue. === L’ironie socratique === Un mot enfin sur l’ironie, qui est omniprésente dans le texte, et qu’il faut distinguer en plusieurs registres. Il y a d’abord l’ironie au sens étroit : dire le contraire de ce que l’on pense, comme lorsque Socrate qualifie Mélétos de « bon citoyen » et « patriote ». Il y a ensuite l’ironie dialectique : amener l’interlocuteur à se contredire lui-même par des questions prétendument naïves, alors que Socrate sait parfaitement où il le mène. Il y a enfin l’ironie existentielle : vivre de telle façon que toute son existence est un démenti de ce qu’on attendrait d’un homme dans sa situation. La proposition d’être nourri au Prytanée relève de cette dernière : Socrate, condamné, se présente comme un bienfaiteur ; il retourne les rôles, fait du tribunal une scène tragicomique. Cette ironie n’est pas seulement un trait de style. Elle est l’expression d’une distance philosophique à l’égard des conventions et des évidences. Celui qui a compris que le savoir commun est illusoire, que la rhétorique est trompeuse, que les hiérarchies sociales reposent sur des malentendus, ne peut plus prendre au sérieux les rituels qui ordonnent la vie ordinaire. L’ironie socratique est le signe visible d’une conscience libre, qui refuse de se soumettre aux attentes. C’est pourquoi Søren Kierkegaard, au XIXᵉ siècle, en a fait dans sa thèse sur ''Le Concept d’ironie'' le trait caractéristique de la subjectivité philosophique naissante : avec Socrate, la conscience se sépare du monde, s’intériorise, devient sujet<ref name="kierkegaard">Søren Kierkegaard, ''Le Concept d’ironie constamment rapporté à Socrate'' (''Om Begrebet Ironi'', 1841), trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, dans ''Œuvres complètes'', t. II, Paris, Éditions de l’Orante, 1975.</ref>. L’ironie est ce mode de la subjectivité qui se pose en se distinguant de ce qui est. == Questions de lecture et postérité == === Le Socrate de l’''Apologie'' et le Socrate historique === Une question classique est de savoir dans quelle mesure l’''Apologie'' restitue fidèlement le plaidoyer effectivement prononcé par Socrate en 399. Les éléments de réponse sont partiels. D’une part, Platon, jeune témoin du procès (il avait environ vingt-huit ans), avait de puissantes raisons d’être fidèle : la mémoire des jurés qui liraient le texte était fraîche, et toute infidélité flagrante aurait nui à la thèse défensive. D’autre part, Xénophon, dans sa propre ''Apologie'', confirme certains points centraux (l’oracle de Delphes, le refus de préparer sa défense, le rôle du démon, l’attitude provocante devant le tribunal). Les convergences entre Platon et Xénophon, qui écrivent séparément, garantissent la réalité d’un noyau historique. Pour autant, l’''Apologie'' de Platon est une œuvre écrite, composée probablement plusieurs années après le procès, et qui obéit aux lois de la composition littéraire. La structure en trois discours parfaitement articulée, la densité dialectique de l’interrogatoire de Mélétos, la beauté rythmique de certaines périodes (la finale : « moi pour mourir et vous pour vivre… ») relèvent de l’art platonicien. Le témoignage historique et la recréation littéraire ne sont pas dissociables. La question du « Socrate historique » a été débattue à l’infini. On distingue traditionnellement plusieurs Socrate : celui d’Aristophane (caricatural), celui de Xénophon (pragmatique, moraliste de bon sens), celui de Platon (dialectique et idéaliste), celui d’Aristote (prédécesseur des idées, attribuant à Socrate la recherche des définitions universelles et l’induction<ref>Aristote, ''Métaphysique'', XIII, 4, 1078b17-30 : « deux choses peuvent à bon droit être attribuées à Socrate : les raisonnements inductifs et la définition universelle ».</ref>). Lequel est le vrai ? La réponse la plus raisonnable est qu’aucun ne l’est entièrement, mais qu’ils donnent, collectivement, une image composite d’un homme dont la puissance personnelle a dépassé de beaucoup ce que les documents peuvent restituer. L’''Apologie'' est probablement, de tous les textes, celui qui se tient le plus près de la voix réellement entendue, parce que Platon y a choisi, exceptionnellement, de s’effacer devant son maître. Il est usuel, chez les commentateurs, de distinguer dans l’''Apologie'' des couches. Certains éléments semblent historiques au plus haut degré : le cadre procédural, les noms des accusateurs, l’attitude refusant la supplication, la référence à Chéréphon (mort avant le procès, mais dont les héritiers étaient vivants pour confirmer ou démentir), la condamnation et son déroulement. D’autres éléments sont vraisemblablement platoniciens : l’articulation en trois discours parfaitement équilibrés, la méditation finale sur la mort, peut-être la prophétie adressée aux juges condamnateurs. Mais tout cela relève d’appréciations délicates, et Platon lui-même dans la ''Lettre VII'' revendique le droit de penser philosophiquement à partir du Socrate qu’il a connu<ref>Platon, ''Lettre VII'', 324d-326b. Sur la question socratique, voir Louis-André Dorion, ''Socrate'', Paris, PUF, coll. « Que sais-je ? », 2004.</ref>. === La postérité de l’''Apologie'' === [[Fichier:Statues of Plato (left) and Socrates (right) by Leonidas Drosis at the Academy of Athens.jpg|vignette|droite|upright=1.2|Statues de Platon (à gauche) et de Socrate (à droite), par le sculpteur Leonidas Drosis (seconde moitié du XIX{{e}} siècle), à l’entrée de l’Académie d’Athènes. La réunion des deux figures sur le fronton d’une institution savante moderne témoigne de la postérité canonique que le procès aura contribué à instituer.]] L’''Apologie de Socrate'' est l’un des textes les plus lus, les plus imités, les plus commentés de la philosophie occidentale. Sa postérité ne se laisse pas résumer en quelques lignes, mais on peut en indiquer quelques étapes majeures. Dans l’Antiquité, l’''Apologie'' est immédiatement imitée : Xénophon en donne sa version ; des apologies perdues, d’Eschine de Sphettos ou de Lysias, avaient également circulé. Au IIᵉ siècle, Apulée compose une ''Apologie'' (sur son propre procès en magie) qui imite la structure platonicienne<ref>Apulée, ''Apologie ou De la magie'', texte établi et traduit par Paul Vallette, Paris, Les Belles Lettres, 1924.</ref>. Les écoles hellénistiques (stoïciens, cyniques) prennent Socrate comme figure tutélaire du sage qui meurt pour sa vérité : Épictète et Marc Aurèle se réfèrent constamment à lui<ref>Voir notamment Épictète, ''Entretiens'', II, 1, 32 ; II, 2, 8-20 ; et Marc Aurèle, ''Pensées'', VII, 19 ; XI, 25, 28.</ref>. Les cyniques voient en lui le philosophe de la pauvreté et de la provocation, exemple d’une existence libre des conventions. La tradition chrétienne primitive trouve dans Socrate une figure prophétique. Justin martyr, au IIᵉ siècle, fait de Socrate un « chrétien avant le Christ », guidé par le Logos divin<ref>Justin, ''Première Apologie'', 46 ; ''Seconde Apologie'', 10.</ref>. Les Pères de l’Église le mentionnent souvent, tantôt pour s’en réclamer (Clément d’Alexandrie, Origène), tantôt pour le mettre à distance (Tertullien)<ref>Clément d’Alexandrie, ''Stromates'', I, 14 ; Tertullien, ''Apologétique'', 46.</ref>. La mort de Socrate, rapprochée du martyre, fournit un modèle de témoignage pour la vérité. Toute la hagiographie martyrologique se nourrit, en partie, de l’''Apologie''. À la Renaissance, la redécouverte de Platon par Marsile Ficin et l’Académie florentine met l’''Apologie'' au centre du canon philosophique<ref>Marsile Ficin traduit les œuvres complètes de Platon en latin (''Platonis Opera Omnia'', Florence, 1484), rendant l’''Apologie'' accessible à l’Europe savante.</ref>. Montaigne, dans les ''Essais'', lui consacre plusieurs chapitres et voit en Socrate la figure même de la sagesse sans science, du bon sens humain qui vaut mieux que toutes les spéculations. <blockquote>Socrate fait mouvoir son âme d’un mouvement naturel et commun. Ainsi dit un paysan, ainsi dit une femme. (Montaigne, ''Essais'', III, 12)<ref>Montaigne, ''Essais'', III, 12 « De la physionomie », édition Villey-Saulnier, PUF, 1965, p. 1037-1038.</ref></blockquote> À l’époque des Lumières, l’''Apologie'' devient un manifeste anticlérical. Voltaire y voit le procès de l’intolérance religieuse, Diderot une défense de la libre pensée, Rousseau un modèle d’éthique civile. David peint ''La Mort de Socrate'' (1787)<ref>Jacques-Louis David, ''La Mort de Socrate'', 1787, huile sur toile, 129,5 × 196,2 cm, New York, Metropolitan Museum of Art.</ref>, tableau emblématique où le philosophe saisit la coupe avec sérénité tandis que ses disciples se lamentent : image iconique qui influencera durablement l’imaginaire philosophique. Au XIXᵉ siècle, Hegel, Kierkegaard et Nietzsche proposent trois lectures marquantes. Hegel, dans ses ''Leçons sur l’histoire de la philosophie'', voit Socrate comme le moment où la conscience morale s’intériorise, et dans sa condamnation le conflit tragique entre l’ancienne cité et la subjectivité naissante<ref>G. W. F. Hegel, ''Leçons sur l’histoire de la philosophie'', t. II, trad. P. Garniron, Paris, Vrin, 1971, p. 263-328.</ref>. Kierkegaard fait de l’ironie socratique, analysée dans ''Le Concept d’ironie'' (1841), le modèle de la subjectivité existentielle<ref name="kierkegaard" />. Nietzsche, dans ''La Naissance de la tragédie'' (1872), voit au contraire en Socrate le destructeur du tragique grec, l’homme théorique qui substitue la raison critique à la sagesse instinctive, et accomplit ainsi une « monstruosité par défaut »<ref name="nietzsche-nt" />. Les trois lectures sont opposées, mais elles attestent toutes la centralité de Socrate dans la pensée moderne. Au XXᵉ siècle, l’''Apologie'' continue d’être un lieu de lecture privilégié. Hannah Arendt, dans ''La Vie de l’esprit'', en fait le modèle de la pensée responsable<ref>Hannah Arendt, ''La Vie de l’esprit'', trad. L. Lotringer, Paris, PUF, 1981 ; voir aussi « Philosophie et politique », ''Les Cahiers de philosophie'', n° 4, 1987.</ref>. Michel Foucault, dans ses derniers cours au Collège de France (''Le Courage de la vérité'', 1984), y voit le texte fondateur de la ''parrhēsía'', c’est-à-dire du « franc-parler » philosophique qui engage la vie de celui qui parle<ref>Michel Foucault, ''Le Courage de la vérité. Le Gouvernement de soi et des autres II. Cours au Collège de France, 1983-1984'', éd. F. Gros, Paris, Gallimard/Seuil, 2009.</ref>. Leo Strauss et son école ont proposé une relecture « ésotérique » du texte, attentive à ce que Socrate ne dit pas et à ce qu’il suggère entre les lignes<ref>Leo Strauss, ''Studies in Platonic Political Philosophy'', Chicago, University of Chicago Press, 1983 ; ''The City and Man'', Chicago, Rand McNally, 1964.</ref>. Lire l’''Apologie'' aujourd’hui, c’est donc entrer dans un texte sédimenté par vingt-quatre siècles de commentaires, et qui n’a pas encore épuisé sa charge philosophique. Chaque époque y trouve un Socrate à sa mesure, et c’est peut-être la marque des grandes œuvres de pouvoir soutenir cette pluralité indéfinie d’interprétations. == Conclusion == L’''Apologie de Socrate'' n’est pas un plaidoyer ordinaire. Ce n’est même pas, à proprement parler, un plaidoyer au sens technique, puisque Socrate y refuse presque toutes les tactiques qui auraient pu le faire acquitter : il ne se fait pas écrire par un logographe, il ne supplie pas, il ne fait pas paraître ses enfants, il provoque le jury quand il lui faudrait le ménager. C’est une profession de foi philosophique, prononcée au moment où la vie de l’auteur est en jeu, et qui tire précisément de cet enjeu sa gravité unique. L’''Apologie'' est la preuve par la mort d’une thèse que Socrate n’a cessé de soutenir par les mots : la vertu vaut plus que la vie. Trois traits en font un texte fondateur. D’abord, il inaugure la figure du philosophe comme témoin : celui dont la cohérence entre la parole et la vie va jusqu’au sacrifice. Socrate meurt parce qu’il ne veut pas trahir ce qu’il a dit ; et Platon, en écrivant l’''Apologie'', fait de cette mort le sceau de la vérité philosophique. La philosophie, à partir de ce texte, n’est plus seulement une activité intellectuelle : elle est un engagement existentiel, et le philosophe n’est plus seulement celui qui sait, mais celui qui vit ce qu’il dit. Ensuite, le texte définit la philosophie elle-même, en l’opposant à la sophistique, à la rhétorique et à la religion populaire. Non un savoir constitué, mais un examen ; non une éloquence, mais une recherche du vrai ; non un rite, mais un service intérieur du divin. Cette triple opposition structure toute la pensée platonicienne ultérieure et, par voie de conséquence, la pensée occidentale. La philosophie, depuis Socrate, se définit comme ce qui n’est pas sophistique : un savoir désintéressé, inséparable d’une pratique de vérité. Enfin, le texte pose la question politique dans ses termes platoniciens : la cité peut-elle accueillir le philosophe ? La condamnation de Socrate se laisse lire comme une réponse négative qu’Athènes aurait donnée en acte à cette question, et c’est ainsi que Platon semble l’interpréter. L’œuvre de Platon tout entière tentera de penser une cité qui répondrait autrement, depuis les esquisses du ''Gorgias'' et de la ''République'' jusqu’à la construction ultime des ''Lois''. Le procès de Socrate est ainsi, indirectement, à l’origine de la philosophie politique occidentale. Lire l’''Apologie'' aujourd’hui, c’est s’exposer à une exigence intacte. La vie non examinée n’est pas digne d’être vécue ; la vertu vaut plus que l’argent, que la réputation, que la vie même ; la lâcheté est pire que la mort ; le juste préfère subir l’injustice plutôt que la commettre. Ces formules, qui paraissent extrêmes, sont le cœur d’une éthique dont la philosophie occidentale n’a cessé de se réclamer, même quand elle croyait s’en affranchir. Le taon, vingt-quatre siècles plus tard, pique toujours. == Notes et références == {{Références|colonnes = 2}} == Bibliographie sélective == === Éditions et traductions de l’''Apologie'' === * Platon, ''Apologie de Socrate. Criton'', traduction, introduction et notes par Luc Brisson, Paris, GF-Flammarion, 2016. * Platon, ''Apologie de Socrate'', traduction par Luc Brisson, présentation, notes, dossier, répertoire et glossaire par Arnaud Macé, Paris, GF-Flammarion, 2017. * Platon, ''Apologie de Socrate'', traduction, présentation et notes de Bernard et Renée Piettre, Paris, Le Livre de Poche (Librairie générale française), coll. « Libretti », 1997. * Platon, ''Apologie de Socrate'', texte établi et traduit par Maurice Croiset, Paris, Les Belles Lettres, coll. des Universités de France, 1920 (nombreuses rééditions). * Platon, ''Œuvres complètes'', sous la direction de Luc Brisson, Paris, Flammarion, 2008 (contient l’''Apologie''). === Commentaires === * Claude Chrétien, ''Platon, Apologie de Socrate'', Paris, Hatier, coll. « Profil philosophie », 1993. * Paul Allen Miller, Charles Platter, ''Plato’s Apology of Socrates: A Commentary'', Norman, University of Oklahoma Press, 2010. * Émile de Strycker, S. R. Slings, ''Plato’s Apology of Socrates: A Literary and Philosophical Study with a Running Commentary'', édité et complété par S. R. Slings, Leyde, E. J. Brill, coll. « Mnemosyne Supplements » 137, 1994. * Thomas G. West, ''Plato’s Apology of Socrates: An Interpretation with a New Translation'', Ithaca, Cornell University Press, 1979. === Études sur Socrate et l’''Apologie'' === * Louis-André Dorion, ''Socrate'', Paris, PUF, coll. « Que sais-je ? », 2004. * Gregory Vlastos, ''Socrate : ironie et philosophie morale'', trad. C. Dalimier, Paris, Aubier, 1994 (''Socrates: Ironist and Moral Philosopher'', 1991). * Gregory Vlastos, « The Socratic Elenchus », ''Oxford Studies in Ancient Philosophy'', I, 1983, p. 27-58. * Debra Nails, ''The People of Plato: A Prosopography of Plato and Other Socratics'', Indianapolis, Hackett, 2002. * Gabriele Giannantoni, ''Socratis et Socraticorum Reliquiae'', 4 vol., Naples, Bibliopolis, 1990. * Monique Canto-Sperber (dir.), ''Les Paradoxes de la connaissance. Essais sur le Ménon de Platon'', Paris, Odile Jacob, 1991. === Réceptions modernes === * G. W. F. Hegel, ''Leçons sur l’histoire de la philosophie'', t. II, trad. P. Garniron, Paris, Vrin, 1971. * Søren Kierkegaard, ''Le Concept d’ironie constamment rapporté à Socrate'' (1841), trad. P.-H. Tisseau et E.-M. Jacquet-Tisseau, Paris, Éditions de l’Orante, 1975. * Friedrich Nietzsche, ''La Naissance de la tragédie'' (1872), dans ''Œuvres philosophiques complètes'', t. I, Paris, Gallimard, 1977. * E. R. Dodds, ''Les Grecs et l’irrationnel'' (1951), trad. M. Gibson, Paris, Flammarion, coll. « Champs », 1977. * Hannah Arendt, ''La Vie de l’esprit'', trad. L. Lotringer, Paris, PUF, 1981. * Michel Foucault, ''L’Herméneutique du sujet. Cours au Collège de France, 1981-1982'', éd. F. Gros, Paris, Gallimard/Seuil, 2001. * Michel Foucault, ''Le Courage de la vérité. Cours au Collège de France, 1983-1984'', éd. F. Gros, Paris, Gallimard/Seuil, 2009. * Leo Strauss, ''Studies in Platonic Political Philosophy'', Chicago, University of Chicago Press, 1983. === Sources antiques === * Aristophane, ''Les Nuées'', dans ''Théâtre complet'', t. I, trad. V.-H. Debidour, Paris, Gallimard, coll. « Folio », 1965. * Xénophon, ''Apologie de Socrate'' et ''Mémorables'', trad. P. Chambry, Paris, Garnier-Flammarion, 1967. * Diogène Laërce, ''Vies et doctrines des philosophes illustres'', trad. sous la direction de M.-O. Goulet-Cazé, Paris, Le Livre de Poche, coll. « La Pochothèque », 1999. * Plutarque, ''Du démon de Socrate'', dans ''Œuvres morales'', t. VIII, trad. J. Hani, Paris, Les Belles Lettres, 1980. * Aristote, ''Rhétorique'', trad. M. Dufour et A. Wartelle, Paris, Les Belles Lettres, 1938-1973. * Cicéron, ''Tusculanes'', trad. J. Humbert, Paris, Les Belles Lettres, 1931. {{AutoCat}} [[Catégorie:Commentaire philosophique]] prfjc77ugkd3wfeoo4kjxjkwiawy2hl Catégorie:Logique 14 83831 764912 2026-04-25T06:03:09Z ~2026-25360-75 123609 Page créée avec « [[Catégorie:Philosophie]] » 764912 wikitext text/x-wiki [[Catégorie:Philosophie]] 71krigdq3od9db1z1wu9ssoaqg3a7e6 764913 764912 2026-04-25T06:04:37Z PandaMystique 119061 764913 wikitext text/x-wiki [[Catégorie:Discipline philosophique]] 08d5py569n2prl4un6bob6eoalb349u Philosophie/Nietzsche 0 83832 764931 2026-04-25T07:39:21Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche]] vers [[Nietzsche : Introduction à sa philosophie]] 764931 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie]] 9lunbq2hr288yjs2bnymkxt327jnk7j Discussion:Philosophie/Nietzsche 1 83833 764933 2026-04-25T07:39:21Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche]] vers [[Discussion:Nietzsche : Introduction à sa philosophie]] 764933 wikitext text/x-wiki #REDIRECTION [[Discussion:Nietzsche : Introduction à sa philosophie]] 8fy503v6tzisysp3ncw12ynxx3664wf Philosophie/Nietzsche/Crépuscule des idoles 0 83834 764935 2026-04-25T07:40:12Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles]] 764935 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles]] gezkd477tx4m7otxkgyxnlfe5tyvss4 Philosophie/Nietzsche/Crépuscule des idoles/Avant-propos 0 83835 764937 2026-04-25T07:40:47Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Avant-propos]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Avant-propos]] 764937 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Avant-propos]] j9jda3c7cy7zvhkdnb2t6kgbmdahy8o Philosophie/Nietzsche/Crépuscule des idoles/Ce que je dois aux anciens 0 83836 764939 2026-04-25T07:41:01Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que je dois aux anciens]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que je dois aux anciens]] 764939 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que je dois aux anciens]] p6xz8x1mlyvb0gwsmvediy6mc5ypn10 Philosophie/Nietzsche/Crépuscule des idoles/Ce que les Allemands sont en train de perdre 0 83837 764941 2026-04-25T07:41:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ce que les Allemands sont en train de perdre]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que les Allemands sont en train de perdre]] 764941 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ce que les Allemands sont en train de perdre]] nzeibw26n0pbidfxrybnnnqcznm7siv Philosophie/Nietzsche/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure » 0 83838 764943 2026-04-25T07:41:38Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »]] 764943 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Ceux qui veulent rendre l’humanité « meilleure »]] 4d5825temvxezzw70csgij3i4njlj75 Philosophie/Nietzsche/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable 0 83839 764945 2026-04-25T07:42:04Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable]] 764945 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Comment, pour finir, le « monde vrai » devint fable]] dkvu3vg68xy0inkgt2kt1urj5srdbfu Philosophie/Nietzsche/Crépuscule des idoles/Flâneries inactuelles 0 83840 764947 2026-04-25T07:42:17Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Flâneries inactuelles]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Flâneries inactuelles]] 764947 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Flâneries inactuelles]] 4xkwpzyykvaybhnza3xsmceati6wf0p Philosophie/Nietzsche/Crépuscule des idoles/La Morale en tant que manifestation contre nature 0 83841 764949 2026-04-25T07:42:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/La Morale en tant que manifestation contre nature]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La Morale en tant que manifestation contre nature]] 764949 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La Morale en tant que manifestation contre nature]] cfqip0t0ce5nlp930omg9kfkeiu38b0 Philosophie/Nietzsche/Crépuscule des idoles/La « raison » dans la philosophie 0 83842 764951 2026-04-25T07:42:37Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/La « raison » dans la philosophie]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La « raison » dans la philosophie]] 764951 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/La « raison » dans la philosophie]] ilpscrad4mfv50m2wsxij7rer5s71p2 Philosophie/Nietzsche/Crépuscule des idoles/Le Problème de Socrate 0 83843 764953 2026-04-25T07:42:47Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Le Problème de Socrate]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Le Problème de Socrate]] 764953 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Le Problème de Socrate]] 5xn872xiopsae6lcnl9vj5tw4kayw11 Philosophie/Nietzsche/Crépuscule des idoles/Les quatre grandes erreurs 0 83844 764955 2026-04-25T07:43:09Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Les quatre grandes erreurs]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Les quatre grandes erreurs]] 764955 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Les quatre grandes erreurs]] bt2f1yqd2164bnh5388hwgb91qbyn94 Philosophie/Nietzsche/Crépuscule des idoles/Maximes et Traits 0 83845 764957 2026-04-25T07:43:19Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Maximes et Traits]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Maximes et Traits]] 764957 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Maximes et Traits]] cr6q3wsw7bxvs370ty0stqqguznjugo Philosophie/Nietzsche/Crépuscule des idoles/Sommaire 0 83846 764959 2026-04-25T07:43:31Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Crépuscule des idoles/Sommaire]] vers [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Sommaire]] 764959 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Crépuscule des idoles/Sommaire]] ehiwksc21cbnl6k5xt3n2xrwnojjrhv Philosophie/Nietzsche/La métaphysique 0 83847 764961 2026-04-25T07:44:19Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La métaphysique]] vers [[Nietzsche : Introduction à sa philosophie/La métaphysique]] 764961 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/La métaphysique]] li71n8ie272lks1trekpcrongosigah Philosophie/Nietzsche/Humain, trop humain 0 83848 764964 2026-04-25T07:45:36Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Humain, trop humain]] vers [[Nietzsche : Introduction à sa philosophie/Humain, trop humain]] 764964 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Humain, trop humain]] g8opq7cfcpw5vza0nczbkjj4oqhowiw Philosophie/Nietzsche/Humain, trop humain/Des principes et des fins 0 83849 764966 2026-04-25T07:45:50Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Humain, trop humain/Des principes et des fins]] vers [[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins]] 764966 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Humain, trop humain/Des principes et des fins]] cz6rv7dywgbgwhqwi0zqmrqc4q49kg7 Philosophie/Nietzsche/L'Apollinien et le Dionysien 0 83850 764968 2026-04-25T07:46:01Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/L'Apollinien et le Dionysien]] vers [[Nietzsche : Introduction à sa philosophie/L'Apollinien et le Dionysien]] 764968 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/L'Apollinien et le Dionysien]] n5hfxt3t3m61gsv84flynoaf229s6bc Philosophie/Nietzsche/Volonté de puissance 0 83851 764970 2026-04-25T07:46:23Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Volonté de puissance]] vers [[Nietzsche : Introduction à sa philosophie/Volonté de puissance]] 764970 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Volonté de puissance]] 9tmrnix1j2urbf0a7y6cyeuoj0arpn0 Discussion:Philosophie/Nietzsche/Volonté de puissance 1 83852 764972 2026-04-25T07:46:23Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/Volonté de puissance]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/Volonté de puissance]] 764972 wikitext text/x-wiki #REDIRECTION [[Discussion:Nietzsche : Introduction à sa philosophie/Volonté de puissance]] hmqgt0xg1pdbjxoy5a19vlnuk8z4rim Philosophie/Nietzsche/La culture grecque 0 83853 764974 2026-04-25T07:47:32Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La culture grecque]] vers [[Nietzsche : Introduction à sa philosophie/La culture grecque]] 764974 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/La culture grecque]] ryf9xebc46bi8kpm363x5f5tympye5q Philosophie/Nietzsche/La culture moderne 0 83854 764976 2026-04-25T07:47:43Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La culture moderne]] vers [[Nietzsche : Introduction à sa philosophie/La culture moderne]] 764976 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/La culture moderne]] pyjrh0wzimt0ialu23qdj6f1qfgosd3 Discussion:Philosophie/Nietzsche/La culture moderne 1 83855 764978 2026-04-25T07:47:43Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/La culture moderne]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/La culture moderne]] 764978 wikitext text/x-wiki #REDIRECTION [[Discussion:Nietzsche : Introduction à sa philosophie/La culture moderne]] elo9mdeabmg4y1iguuyaq1xjhtexv0o Philosophie/Nietzsche/La moralité des mœurs 0 83856 764980 2026-04-25T07:47:55Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/La moralité des mœurs]] vers [[Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] 764980 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] a7wswewz5xwkal4ipcrhz690pnol1kn Discussion:Philosophie/Nietzsche/La moralité des mœurs 1 83857 764982 2026-04-25T07:47:55Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/La moralité des mœurs]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] 764982 wikitext text/x-wiki #REDIRECTION [[Discussion:Nietzsche : Introduction à sa philosophie/La moralité des mœurs]] 0czkmer3rue6rzsw7hb4o8cntg3wdmu Philosophie/Nietzsche/Le problème de Socrate 0 83858 764984 2026-04-25T07:48:14Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Le problème de Socrate]] vers [[Nietzsche : Introduction à sa philosophie/Le problème de Socrate]] 764984 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Le problème de Socrate]] j4kwclk3vltmt2he1xsztvmo4d8n1fz Philosophie/Nietzsche/Philosophie et culture 0 83859 764986 2026-04-25T07:48:27Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Philosophie et culture]] vers [[Nietzsche : Introduction à sa philosophie/Philosophie et culture]] 764986 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Philosophie et culture]] rcj3qb05ep937jowxyka6o7395k67ld Philosophie/Nietzsche/Éternel Retour 0 83860 764988 2026-04-25T07:48:50Z PandaMystique 119061 PandaMystique a déplacé la page [[Philosophie/Nietzsche/Éternel Retour]] vers [[Nietzsche : Introduction à sa philosophie/Éternel Retour]] 764988 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Éternel Retour]] 1yn1ijw80dcw5wvq7fmuiyzdog2i2iv Discussion:Philosophie/Nietzsche/Éternel Retour 1 83861 764990 2026-04-25T07:48:51Z PandaMystique 119061 PandaMystique a déplacé la page [[Discussion:Philosophie/Nietzsche/Éternel Retour]] vers [[Discussion:Nietzsche : Introduction à sa philosophie/Éternel Retour]] 764990 wikitext text/x-wiki #REDIRECTION [[Discussion:Nietzsche : Introduction à sa philosophie/Éternel Retour]] ix2jws8bkn09gnuowb2pglibnz1yz87 Catégorie:Nietzsche : Introduction à sa philosophie (livre) 14 83862 764991 2026-04-25T07:49:49Z PandaMystique 119061 Page créée avec « [[Catégorie:Philosophie]] » 764991 wikitext text/x-wiki [[Catégorie:Philosophie]] 71krigdq3od9db1z1wu9ssoaqg3a7e6 765024 764991 2026-04-25T10:01:59Z PandaMystique 119061 765024 wikitext text/x-wiki [[Catégorie:Philosophie]] [[Catégorie:Classe 1 - Philosophie et psychologie]] a9l0cz89a3pg0qr5vuvnzlmznc0qirz Ecce Homo - Humain, trop humain et deux suites 0 83863 764994 2026-04-25T07:53:17Z PandaMystique 119061 PandaMystique a déplacé la page [[Ecce Homo - Humain, trop humain et deux suites]] vers [[Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites]] 764994 wikitext text/x-wiki #REDIRECTION [[Nietzsche : Introduction à sa philosophie/Ecce Homo - Humain, trop humain et deux suites]] jzh7xp5xihwpm8tabcyvvbukcig6e53 Utilisateur:PandaMystique 2 83864 765012 2026-04-25T09:45:05Z PandaMystique 119061 Page créée avec « {{Boîte Babel|fr-4}} » 765012 wikitext text/x-wiki {{Boîte Babel|fr-4}} qo3xfc2t2pe61v3l5ajwji1t4zeq1rp